inst/app/server/optimisation/parameters.R

GetOptPar <- function(masterCD4, data, iterationParam, calibParamOut, minErrorRun) {
    p <- parameters(
        prop_preART_500    = masterCD4[1,"prop.Off.ART.500"][[1]],
        prop_preART_350500 = masterCD4[1,"prop.Off.ART.350500"][[1]],
        prop_preART_250350 = masterCD4[1,"prop.Off.ART.250350"][[1]],
        prop_preART_200250 = masterCD4[1,"prop.Off.ART.200250"][[1]],
        prop_preART_100200 = masterCD4[1,"prop.Off.ART.100200"][[1]],
        prop_preART_50100  = masterCD4[1,"prop.Off.ART.50100"][[1]],
        prop_preART_50     = masterCD4[1,"prop.Off.ART.50"][[1]],
        t_1 = ConvertYear2015(data[["treatment_guidelines"]][["more500"]]),
        t_2 = ConvertYear2015(data[["treatment_guidelines"]][["less500"]]),
        t_3 = ConvertYear2015(data[["treatment_guidelines"]][["less350"]]),
        t_4 = ConvertYear2015(data[["treatment_guidelines"]][["less250"]]),
        t_5 = ConvertYear2015(data[["treatment_guidelines"]][["less200"]]),

        # These guys still need to be set by the model (but use the best fit run)
        Theta   = calibParamOut[minErrorRun, "theta"],
        p       = calibParamOut[minErrorRun, "p"],
        Epsilon = calibParamOut[minErrorRun, "epsilon"],

        # MODIFYING #
        Rho   = iterationParam[["Rho"]],
        Kappa = iterationParam[["Kappa"]],
        Gamma = iterationParam[["Gamma"]],
        Sigma = iterationParam[["Sigma"]],
        Omega = iterationParam[["Omega"]],
        q     = iterationParam[["Q"]],

        # COST
        Dx_unitCost          = reactiveCost$test,
        Linkage_unitCost     = reactiveCost$link,
        Annual_Care_unitCost = reactiveCost$care,
        Annual_ART_unitCost  = reactiveCost$art,

        # Advanced Calibration Tools (mortality)
        Alpha_1 = 0.004110 * AdvCalib$HIVMort,
        Alpha_2 = 0.011670 * AdvCalib$HIVMort,
        Alpha_3 = 0.009385 * AdvCalib$HIVMort,
        Alpha_4 = 0.016394 * AdvCalib$HIVMort,
        Alpha_5 = 0.027656 * AdvCalib$HIVMort,
        Alpha_6 = 0.047877 * AdvCalib$HIVMort,
        Alpha_7 = 1.081964 * AdvCalib$HIVMort,
        Tau_1 = 0.003905 * AdvCalib$HIVMort,
        Tau_2 = 0.011087 * AdvCalib$HIVMort,
        Tau_3 = 0.008916 * AdvCalib$HIVMort,
        Tau_4 = 0.015574 * AdvCalib$HIVMort,
        Tau_5 = 0.026273 * AdvCalib$HIVMort,
        Tau_6 = 0.045482 * AdvCalib$HIVMort,
        Tau_7 = 1.02785 * AdvCalib$HIVMort,
        Mu = AdvCalib$NatMort
    )
    p
}

GetOptRunPar <- function(masterCD4, data, iterationParam, calibParamOut, runNumber) {
    p <- parameters(
        prop_preART_500    = masterCD4[1,"prop.Off.ART.500"][[1]],
        prop_preART_350500 = masterCD4[1,"prop.Off.ART.350500"][[1]],
        prop_preART_250350 = masterCD4[1,"prop.Off.ART.250350"][[1]],
        prop_preART_200250 = masterCD4[1,"prop.Off.ART.200250"][[1]],
        prop_preART_100200 = masterCD4[1,"prop.Off.ART.100200"][[1]],
        prop_preART_50100  = masterCD4[1,"prop.Off.ART.50100"][[1]],
        prop_preART_50     = masterCD4[1,"prop.Off.ART.50"][[1]],
        t_1 = ConvertYear2015(data[["treatment_guidelines"]][["more500"]]),
        t_2 = ConvertYear2015(data[["treatment_guidelines"]][["less500"]]),
        t_3 = ConvertYear2015(data[["treatment_guidelines"]][["less350"]]),
        t_4 = ConvertYear2015(data[["treatment_guidelines"]][["less250"]]),
        t_5 = ConvertYear2015(data[["treatment_guidelines"]][["less200"]]),

        # These guys still need to be set by the model (but use the best fit run)
        Theta   = calibParamOut[runNumber, "theta"],
        p       = calibParamOut[runNumber, "p"],
        Epsilon = calibParamOut[runNumber, "epsilon"],

        # MODIFYING #
        Rho   = iterationParam[["Rho"]],
        Kappa = iterationParam[["Kappa"]],
        Gamma = iterationParam[["Gamma"]],
        Sigma = iterationParam[["Sigma"]],
        Omega = iterationParam[["Omega"]],
        q     = iterationParam[["Q"]],

        # COST
        Dx_unitCost          = reactiveCost$test,
        Linkage_unitCost     = reactiveCost$link,
        Annual_Care_unitCost = reactiveCost$care,
        Annual_ART_unitCost  = reactiveCost$art,

        # Advanced Calibration Tools (mortality)
        Alpha_1 = 0.004110 * AdvCalib$HIVMort,
        Alpha_2 = 0.011670 * AdvCalib$HIVMort,
        Alpha_3 = 0.009385 * AdvCalib$HIVMort,
        Alpha_4 = 0.016394 * AdvCalib$HIVMort,
        Alpha_5 = 0.027656 * AdvCalib$HIVMort,
        Alpha_6 = 0.047877 * AdvCalib$HIVMort,
        Alpha_7 = 1.081964 * AdvCalib$HIVMort,
        Tau_1 = 0.003905 * AdvCalib$HIVMort,
        Tau_2 = 0.011087 * AdvCalib$HIVMort,
        Tau_3 = 0.008916 * AdvCalib$HIVMort,
        Tau_4 = 0.015574 * AdvCalib$HIVMort,
        Tau_5 = 0.026273 * AdvCalib$HIVMort,
        Tau_6 = 0.045482 * AdvCalib$HIVMort,
        Tau_7 = 1.02785 * AdvCalib$HIVMort,
        Mu = AdvCalib$NatMort
    )
    p
}

GetBaselinePar <- function(masterCD4, data, calibParamOut, runNumber) {
    p <- parameters(
        prop_preART_500    = masterCD4[1,"prop.Off.ART.500"][[1]],
        prop_preART_350500 = masterCD4[1,"prop.Off.ART.350500"][[1]],
        prop_preART_250350 = masterCD4[1,"prop.Off.ART.250350"][[1]],
        prop_preART_200250 = masterCD4[1,"prop.Off.ART.200250"][[1]],
        prop_preART_100200 = masterCD4[1,"prop.Off.ART.100200"][[1]],
        prop_preART_50100  = masterCD4[1,"prop.Off.ART.50100"][[1]],
        prop_preART_50     = masterCD4[1,"prop.Off.ART.50"][[1]],
        t_1 = ConvertYear2015(data[["treatment_guidelines"]][["more500"]]),
        t_2 = ConvertYear2015(data[["treatment_guidelines"]][["less500"]]),
        t_3 = ConvertYear2015(data[["treatment_guidelines"]][["less350"]]),
        t_4 = ConvertYear2015(data[["treatment_guidelines"]][["less250"]]),
        t_5 = ConvertYear2015(data[["treatment_guidelines"]][["less200"]]),

        # Using best fit run)
        Theta   = calibParamOut[runNumber, "theta"],
        p       = calibParamOut[runNumber, "p"],
        Rho     = calibParamOut[runNumber, "rho"],
        Kappa   = calibParamOut[runNumber, "kappa"],
        Gamma   = calibParamOut[runNumber, "gamma"],
        Omega   = calibParamOut[runNumber, "omega"],
        Epsilon = calibParamOut[runNumber, "epsilon"],
        q       = calibParamOut[runNumber, "q"],

        # COST
        Dx_unitCost          = reactiveCost$test,
        Linkage_unitCost     = reactiveCost$link,
        Annual_Care_unitCost = reactiveCost$care,
        Annual_ART_unitCost  = reactiveCost$art,

        # Advanced Calibration Tools (mortality)
        Alpha_1 = 0.004110 * AdvCalib$HIVMort,
        Alpha_2 = 0.011670 * AdvCalib$HIVMort,
        Alpha_3 = 0.009385 * AdvCalib$HIVMort,
        Alpha_4 = 0.016394 * AdvCalib$HIVMort,
        Alpha_5 = 0.027656 * AdvCalib$HIVMort,
        Alpha_6 = 0.047877 * AdvCalib$HIVMort,
        Alpha_7 = 1.081964 * AdvCalib$HIVMort,
        Tau_1 = 0.003905 * AdvCalib$HIVMort,
        Tau_2 = 0.011087 * AdvCalib$HIVMort,
        Tau_3 = 0.008916 * AdvCalib$HIVMort,
        Tau_4 = 0.015574 * AdvCalib$HIVMort,
        Tau_5 = 0.026273 * AdvCalib$HIVMort,
        Tau_6 = 0.045482 * AdvCalib$HIVMort,
        Tau_7 = 1.02785 * AdvCalib$HIVMort,
        Mu = AdvCalib$NatMort
    )
    p
}

GetMeanPar <- function(masterCD4, data, calibParamOut) {
    p <- parameters(
        prop_preART_500    = masterCD4[1,"prop.Off.ART.500"][[1]],
        prop_preART_350500 = masterCD4[1,"prop.Off.ART.350500"][[1]],
        prop_preART_250350 = masterCD4[1,"prop.Off.ART.250350"][[1]],
        prop_preART_200250 = masterCD4[1,"prop.Off.ART.200250"][[1]],
        prop_preART_100200 = masterCD4[1,"prop.Off.ART.100200"][[1]],
        prop_preART_50100  = masterCD4[1,"prop.Off.ART.50100"][[1]],
        prop_preART_50     = masterCD4[1,"prop.Off.ART.50"][[1]],
        t_1 = ConvertYear2015(data[["treatment_guidelines"]][["more500"]]),
        t_2 = ConvertYear2015(data[["treatment_guidelines"]][["less500"]]),
        t_3 = ConvertYear2015(data[["treatment_guidelines"]][["less350"]]),
        t_4 = ConvertYear2015(data[["treatment_guidelines"]][["less250"]]),
        t_5 = ConvertYear2015(data[["treatment_guidelines"]][["less200"]]),

        # Just using mean parameter values for the momen #
        Theta = round(lapply(calibParamOut, function(x) {return(mean(x))})[["theta"]], digits = 4),
        p     = round(lapply(calibParamOut, function(x) {return(mean(x))})[["p"]],     digits = 4),
        Rho   = round(lapply(calibParamOut, function(x) {return(mean(x))})[["rho"]],   digits = 4),
        Kappa = round(lapply(calibParamOut, function(x) {return(mean(x))})[["kappa"]], digits = 4),
        Gamma = round(lapply(calibParamOut, function(x) {return(mean(x))})[["gamma"]], digits = 4),
        Omega = round(lapply(calibParamOut, function(x) {return(mean(x))})[["omega"]], digits = 4),
        q     = round(lapply(calibParamOut, function(x) {return(mean(x))})[["q"]],     digits = 4),

        # COST
        Dx_unitCost          = reactiveCost$test,
        Linkage_unitCost     = reactiveCost$link,
        Annual_Care_unitCost = reactiveCost$care,
        Annual_ART_unitCost  = reactiveCost$art,

        # Advanced Calibration Tools (mortality)
        Alpha_1 = 0.004110 * AdvCalib$HIVMort,
        Alpha_2 = 0.011670 * AdvCalib$HIVMort,
        Alpha_3 = 0.009385 * AdvCalib$HIVMort,
        Alpha_4 = 0.016394 * AdvCalib$HIVMort,
        Alpha_5 = 0.027656 * AdvCalib$HIVMort,
        Alpha_6 = 0.047877 * AdvCalib$HIVMort,
        Alpha_7 = 1.081964 * AdvCalib$HIVMort,
        Tau_1 = 0.003905 * AdvCalib$HIVMort,
        Tau_2 = 0.011087 * AdvCalib$HIVMort,
        Tau_3 = 0.008916 * AdvCalib$HIVMort,
        Tau_4 = 0.015574 * AdvCalib$HIVMort,
        Tau_5 = 0.026273 * AdvCalib$HIVMort,
        Tau_6 = 0.045482 * AdvCalib$HIVMort,
        Tau_7 = 1.02785 * AdvCalib$HIVMort,
        Mu = AdvCalib$NatMort
    )
    p
}

GetAverageCalibOut <- function(calibOut) {
    # subset only model output for 2015
    out <- calibOut[calibOut$year == 2015 & calibOut$source == "model",]
    # find only unique values
    indicator <- unique(out$indicator)
    # pick out values
    value <- c()
    for (j in 1:length(indicator)) {
        value[j] <- mean(out[out$indicator == indicator[j], "value"])
    }
    # build data.frame and return
    df <- data.frame(indicator, value)
    df
}

CallMeanModel <- function() {
    message("CallMeanModel() called.")

    # Setup #
    time <- seq(0, 5, 1)

    meanCalibInitial <- GetAverageCalibOut(CalibOut)

    p <- GetMeanPar(
        masterCD4 = MasterData$cd4_2015,
        data = MasterData,
        calibParamOut = CalibParamOut)

    y <- GetInitial(
        p = p,
        iterationResult = meanCalibInitial,
        masterCD4 = MasterData$cd4_2015)

    # Pass the mean incidence to GetBeta()
    p[["beta"]] <- GetBeta(y = y, p = p, iterationInc = colMeans(CalibIncOut))

    result <- deSolve::ode(times = time, y = y, func = "derivs", parms = p, initfunc = "initmod", dllname = "cascade")

    result <- cbind(result, N = rowSums(result[, c(
        "UnDx_500", "UnDx_350500", "UnDx_250350", "UnDx_200250", "UnDx_100200", "UnDx_50100", "UnDx_50",
        "Dx_500", "Dx_350500", "Dx_250350", "Dx_200250", "Dx_100200", "Dx_50100", "Dx_50",
        "Care_500", "Care_350500", "Care_250350", "Care_200250", "Care_100200", "Care_50100", "Care_50",
        "PreLtfu_500", "PreLtfu_350500", "PreLtfu_250350", "PreLtfu_200250", "PreLtfu_100200", "PreLtfu_50100", "PreLtfu_50",
        "Tx_Na_500", "Tx_Na_350500", "Tx_Na_250350", "Tx_Na_200250", "Tx_Na_100200", "Tx_Na_50100", "Tx_Na_50",
        "Tx_A_500", "Tx_A_350500", "Tx_A_250350", "Tx_A_200250", "Tx_A_100200", "Tx_A_50100", "Tx_A_50",
        "Ltfu_500", "Ltfu_350500", "Ltfu_250350", "Ltfu_200250", "Ltfu_100200", "Ltfu_50100", "Ltfu_50")]
    ))

    result <- cbind(result,
        ART = rowSums(result[, c(
            "Tx_Na_500", "Tx_Na_350500", "Tx_Na_250350", "Tx_Na_200250", "Tx_Na_100200", "Tx_Na_50100", "Tx_Na_50",
            "Tx_A_500", "Tx_A_350500", "Tx_A_250350", "Tx_A_200250", "Tx_A_100200", "Tx_A_50100", "Tx_A_50"
            )]),

        UnDx = rowSums(result[, c(
            "UnDx_500", "UnDx_350500", "UnDx_250350", "UnDx_200250", "UnDx_100200", "UnDx_50100", "UnDx_50"
            )]),

        Dx = rowSums(result[, c(
            "Dx_500", "Dx_350500", "Dx_250350", "Dx_200250", "Dx_100200", "Dx_50100", "Dx_50"
            )]),

        Care = rowSums(result[, c(
                "Care_500", "Care_350500", "Care_250350", "Care_200250", "Care_100200", "Care_50100", "Care_50"
                )]),

        PreLtfu = rowSums(result[, c(
                "PreLtfu_500", "PreLtfu_350500", "PreLtfu_250350", "PreLtfu_200250", "PreLtfu_100200", "PreLtfu_50100", "PreLtfu_50"
                )]),

        Tx = rowSums(result[, c(
                "Tx_Na_500", "Tx_Na_350500", "Tx_Na_250350", "Tx_Na_200250", "Tx_Na_100200", "Tx_Na_50100", "Tx_Na_50",
                "Tx_A_500", "Tx_A_350500", "Tx_A_250350", "Tx_A_200250", "Tx_A_100200", "Tx_A_50100", "Tx_A_50"
                )]),

        Vs = rowSums(result[, c(
                "Tx_A_500", "Tx_A_350500", "Tx_A_250350", "Tx_A_200250", "Tx_A_100200", "Tx_A_50100", "Tx_A_50"
                )]),

        Ltfu = rowSums(result[, c(
                "Ltfu_500", "Ltfu_350500", "Ltfu_250350", "Ltfu_200250", "Ltfu_100200", "Ltfu_50100", "Ltfu_50"
                )]),

        NaturalMortalityProp = result[, "NaturalMortality"] / result[, "N"],

        HivMortalityProp = result[, "HivMortality"] / result[, "N"],

        NewInfProp = result[, "NewInf"] / result[, "N"],

        TotalCost = rowSums(result[, c(
                "Dx_Cost", "Linkage_Cost", "Annual_Care_Cost", "Annual_ART_Cost"
                )]),

        cd4_500 = rowSums(result[, c(
                "UnDx_500", "Dx_500", "Care_500", "PreLtfu_500", "Tx_Na_500", "Tx_A_500", "Ltfu_500"
                )]) / result[, "N"],

        cd4_350500 = rowSums(result[, c(
                "UnDx_350500", "Dx_350500", "Care_350500", "PreLtfu_350500", "Tx_Na_350500", "Tx_A_350500", "Ltfu_350500"
                )]) / result[, "N"],

        cd4_250350 = rowSums(result[, c(
                "UnDx_250350", "Dx_250350", "Care_250350", "PreLtfu_250350", "Tx_Na_250350", "Tx_A_250350", "Ltfu_250350"
                )]) / result[, "N"],

        cd4_200250 = rowSums(result[, c(
                "UnDx_200250", "Dx_200250", "Care_200250", "PreLtfu_200250", "Tx_Na_200250", "Tx_A_200250", "Ltfu_200250"
                )]) / result[, "N"],

        cd4_100200 = rowSums(result[, c(
                "UnDx_100200", "Dx_100200", "Care_100200", "PreLtfu_100200", "Tx_Na_100200", "Tx_A_100200", "Ltfu_100200"
                )]) / result[, "N"],

        cd4_50100 = rowSums(result[, c(
                "UnDx_50100", "Dx_50100", "Care_50100", "PreLtfu_50100", "Tx_Na_50100", "Tx_A_50100", "Ltfu_50100"
                )]) / result[, "N"],

        cd4_50 = rowSums(result[, c(
                "UnDx_50", "Dx_50", "Care_50", "PreLtfu_50", "Tx_Na_50", "Tx_A_50", "Ltfu_50"
                )]) / result[, "N"],

        DALY = (
            (rowSums(result[, c("UnDx_500", "Dx_500", "Care_500", "PreLtfu_500", "Tx_Na_500", "Ltfu_500",
                "UnDx_350500", "Dx_350500", "Care_350500", "PreLtfu_350500", "Tx_Na_350500", "Ltfu_350500")]) * 0.078) + # >350, no ART

            (rowSums(result[,c("UnDx_250350", "Dx_250350", "Care_250350", "PreLtfu_250350", "Tx_Na_250350", "Ltfu_250350",
                "UnDx_200250", "Dx_200250", "Care_200250", "PreLtfu_200250", "Tx_Na_200250", "Ltfu_200250")]) * 0.274) + # 200-350, no ART

            (rowSums(result[, c("UnDx_100200", "Dx_100200", "Care_100200", "PreLtfu_100200", "Tx_Na_100200", "Ltfu_100200",
                "UnDx_50100", "Dx_50100", "Care_50100", "PreLtfu_50100", "Tx_Na_50100", "Ltfu_50100",
                "UnDx_50", "Dx_50", "Care_50", "PreLtfu_50", "Tx_Na_50", "Ltfu_50")]) * 0.582) + # <200, no ART

            (rowSums(result[, c("Tx_A_500", "Tx_A_350500", "Tx_A_250350", "Tx_A_200250", "Tx_A_100200", "Tx_A_50100", "Tx_A_50")]) * 0.078) # on ART & VS
        )
    )
    return(as.data.frame(result))
}
jackolney/CascadeDashboard documentation built on May 18, 2019, 7:56 a.m.