This document details the current procedure used for curing HIV positive individuals. The current goal of this procedure is to hit both the Age-group and Race specific prevalence targets.
To hit the prevalence target for any subgroup it is necessary have the correct number of infected individuals. If we want to hit prevalence targets for a single attribute, say race one must estimate the number of infected individuals for each race group. Then, the target can be hit using the cure method by curing the difference between the target and the current number infected.
However, in cases in which there are two attribute specific targets to be hit (for example age and race), this simple solution is no longer guaranteed to work. A simplified reason for this is that when there are two attribute specific prevalence targets, each individual’s status will contribute to two prevalence values rather than one. As a result, to hit the targets it may not be clear who should be cured and who should not.
A solution to this problem is to cure individuals based on both their attributes, and more specifically to have targets for each age/race subgroup. With these joint prevalence targets, it will be easier to decide which individuals should and should not be cured.
To use this method, it is required to have joint age/race prevalence targets.
Note that this is the current method used for constructing the joint prevalence targets, but this could change.
In order to hit both the desired marginal targets, we calculate targets for each age/race subgroup. During the construction of these targets, it is necessary to account for the fact that the proportion of individuals in each age/race subgroup is different. By constructing targets that account for this factor, we can ensure that when we the prevalence within race groups and the prevalence within age groups are both simultaneously achieved. The joint age race distribution of the network is calculated to construct the target prevalence for each age/race subgroup.
The targets are currently constructed using the make_prev_targs.R script. This script uses the joint age/race population distribution as well as the attribute specific prevalence targets to construct the joint age/race prevalence targets. If these targets are hit accurately, and the population distribution targets are hit accurately as well, then both attribute specific prevalence targets will be hit.
The current cure procedure is targeted to hit both the age-group specific and race specific prevalence targets.
The cure algorithm is implemented inside of the mod.hivprogress.R script and inside of the hivprogress_msm function.
The cure process takes place two years before the target year (currently 2011). During the cure process, nodes are selected to be curred in the following way:
After probabilities are assigned, the number of individuals who will be cured in the current time step is calculated by summing over the assigned probabilities. The following process is then repeated until correct number of nodes are selected for curing.
Individuals who are curred have their HIV related attributes set back to their pre-HIV status. This is done by the cure_hiv_msm function inside of the mod.hivprogress.R script:
cure_hiv_msm <- function(dat, uids, at) {
which_cure <- match(uids, dat$attr$uid)
if (any(is.na(which_cure))) {browser()}
set_to_NA <- c("inf.time", "stage", "stage.time", "aids.time",
"aids.time", "diag.stage", "vl", "vl.last.usupp",
"vl.last.supp", "diag.time", "tx.status", "vl.last.tst",
"cuml.time.on.tx", "cuml.time.off.tx", "tx.period.first",
"tx.period.last", "tx.init.time")
for (atr_idx in seq_along(set_to_NA)) {
dat$attr[[set_to_NA[atr_idx]]][which_cure] <- NA
}
dat$attr$status[which_cure] <- 0
dat$attr$diag.status[which_cure] <- 0
dat$attr$last.neg.test[which_cure] <- dat$attr$diag.time[which_cure]
dat$attr$count.trans[which_cure] <- 0
dat$attr$num.neg.tests[which_cure] <- dat$attr$num.neg.tests[which_cure] + 1
return(dat)
}
There is concern that under the described cure model, the sero-mixing matrix would become much different from the one observed in the population. Therefore, the sero-mixing matrix is tracked in the simulation. A comparison was made between what was observed in the simulation in the year 2019 to three other values:
One caveat is that in the original data, the (weighted) prevalence of the HIV among the egos is about 11% whereas in the population of interest, this closer to 8%. This prevalence of 8% is what will be targeted usually, but to make an apples to apples comparison a simulation was carried out in which the target prevalence was 11%. In this simulation, here were the results:
sero_mix <- read.csv("sero_mix.csv")
epi_df <- data.frame("EpiModel (at 2019)", 80.34, 5.63, 14.02)
sero_mix <- sero_mix[, -c(1, 3)]
colnames(epi_df) <- colnames(sero_mix)
sero_mix <- rbind(sero_mix, epi_df)
gt::gt(sero_mix)
| From | concordant_neg | concordant_pos | discordant |
|---|---|---|---|
| Survey Data | 79.47 | 5.90 | 14.63 |
| Original Net | 77.04 | 7.52 | 15.43 |
| Final Net | 76.47 | 7.68 | 15.85 |
| EpiModel (at 2019) | 80.34 | 5.63 | 14.02 |
The code used to create the first three rows can be found in sero-mixing.R script. Since the EpiModel simulation is non-standard, that output was recorded after an epimodel run.