knitr::opts_chunk$set(echo = TRUE, cache = FALSE)
setwd("C:/Users/schwa/Desktop/markov_ONC_02122022/markov_ONC")
This file contains all R-Scripts that were used for modelling of the input parameters and creating plots for the manuscript.
In the first script all inputs for the model are defined. Age-specific transition probabilities are retrieved from stored .csv files. Values for costs, utilities and initial model counts are added directly in the script.
## ----setup, include=FALSE----------------------------------------------------------------------------------------------------------
knitr::opts_chunk$set(echo = TRUE, cache = FALSE)
## ----include= TRUE, echo= TRUE, message= FALSE, warning= FALSE---------------------------------------------------------------------
library(tidyverse)
library(knitr)
## ----include= TRUE, echo= TRUE, message= FALSE, warning= FALSE---------------------------------------------------------------------
setwd("C:/Users/schwa/Desktop/markov_ONC_02122022/markov_ONC/input_files")
bfs_mort <- read.csv("p_mort.csv", sep = ";")
prob_SUR_uc <- read.csv("p_SUR_uc.csv", sep = ";")
prob_SUR_oc <- read.csv("p_SUR_oc.csv", sep = ";")
prob_REV_uc <- read.csv("p_REV_uc.csv", sep = ";")
prob_REV_oc <- read.csv("p_REV_oc.csv", sep = ";")
prob_PREV_m <- read.csv("PREV_m.csv", sep = ";")
prob_PREV_f <- read.csv("PREV_f.csv", sep = ";")
prob_PREV_m$value <- 0.02 #annual incidence for individuals aged 20+
prob_PREV_f$value <- 0.02
prob_prev_m_se <- 0.0512
prop_prev_f_se <- 0.0512
age_init <- 40 #Starting age chosen at 40 years. CAVE: Darf nicht tiefer sein als Alterskategorien aus .csv
# age increases with cycles
#cost usual care
c_NOSUR_uc <- 222
c_NOSUR_uc_sd <- 50
c_SUCC_NOSUR_uc <- 200
c_SUCC_NOSUR_uc_sd <- 20
c_SUR_uc <- 18325
c_SUR_uc_sd <- 1606/sqrt(1222)
c_SUCC_SUR_uc <- 500
c_SUCC_SUR_uc_sd <- 50
c_REV_uc <- 28775
c_REV_uc_sd <- 6436/sqrt(144)
c_SUCC_REV_uc <- 500
c_SUCC_REV_uc_sd <- 20
#cost optimized care
c_NOSUR_oc <- 1209
c_NOSUR_oc_sd <- 150
c_SUCC_NOSUR_oc <- 200
c_SUCC_NOSUR_oc_sd <- 20
c_SUR_oc <- 18325
c_SUR_oc_sd <- 1606/sqrt(1222)
c_SUCC_SUR_oc <- 500
c_SUCC_SUR_oc_sd <- 20
c_REV_oc <- 28775
c_REV_oc_sd <- 6436/sqrt(144)
c_SUCC_REV_oc <- 500
c_SUCC_REV_oc_sd <- 20
#utilities usual care
u_NOSUR_uc <- 0.658
u_SUCC_NOSUR_uc <- 0.749
u_SUCC_NOSUR_uc_sd <- 0.158/sqrt(41)
u_SUR_uc <- 0.658
u_SUCC_SUR_uc <- 0.878
u_SUCC_SUR_uc_sd <- 0.151/sqrt(41)
u_REV_uc <- 0.658
u_SUCC_REV_uc <- 0.658
#utilities optimized care
u_NOSUR_oc <- 0.658
u_SUCC_NOSUR_oc <- 0.783
u_SUCC_NOSUR_oc_sd <- 0.108/sqrt(41)
u_SUR_oc <- 0.658
u_SUCC_SUR_oc <- 0.878
u_SUCC_SUR_oc_sd <- 0.151/sqrt(41)
u_REV_oc <- 0.658
u_SUCC_REV_oc <- 0.658
#start count
n_male <- 60164
n_female <- 59508
Now the markov model is run for 70 cycles under current conditions. This means we use cost and utility values defined for “current non-surgical care”.
## ----setup, include=FALSE-----------------------------------------------------------------------------------------------
knitr::opts_chunk$set(echo = TRUE, cache = FALSE)
## ----include= TRUE, echo= TRUE, message= FALSE, warning= FALSE----------------------------------------------------------
cycle <- 1:70
n_cycle <- length(cycle)
POP_fu <- c(n_female, rep(NA, n_cycle-1))
age = age_init
for(i in 1:(n_cycle-1)){
POP_fu[i+1] <- POP_fu[i] -
(POP_fu[i] * prob_PREV_f[prob_PREV_f$age == age,2]) -
(POP_fu[i] * bfs_mort[bfs_mort$age == age,2])
age = age+1
}
POP_mu <- c(n_male, rep(NA, n_cycle-1))
age = age_init
for(i in 1:(n_cycle-1)){
POP_mu[i+1] <- POP_mu[i] -
(POP_mu[i] * prob_PREV_m[prob_PREV_m$age == age,2]) -
(POP_mu[i] * bfs_mort[bfs_mort$age == age,2])
age = age+1
}
NOSURu <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
NOSURu[i+1] <- (POP_fu[i]*prob_PREV_f[prob_PREV_f$age == age,2]) +
(POP_mu[i]*prob_PREV_m[prob_PREV_m$age == age,2]) -
(NOSURu[i] *bfs_mort[bfs_mort$age == age, 2])
age = age+1
}
SUCC_NOSURu <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
SUCC_NOSURu[i+1] <- (SUCC_NOSURu[i] +NOSURu[i]) -
(SUCC_NOSURu[i]*prob_SUR_uc[prob_SUR_uc$age == age,2]) -
(SUCC_NOSURu[i]*bfs_mort[bfs_mort$age == age,2])
age = age+1
}
SURu <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
SURu[i+1] <- (SUCC_NOSURu[i]*prob_SUR_uc[prob_SUR_uc$age == age,2]) -
(SURu[i] *bfs_mort[bfs_mort$age == age, 2])
age = age+1
}
SUCC_SURu <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
SUCC_SURu[i+1] <- (SUCC_SURu[i] +SURu[i]) -
(SUCC_SURu[i]*prob_REV_uc[prob_REV_uc$age == age,2]) -
(SUCC_SURu[i]*bfs_mort[bfs_mort$age == age,2])
age = age+1
}
REVu <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
REVu[i+1] <- (SUCC_SURu[i]*prob_REV_uc[prob_REV_uc$age == age,2]) -
(REVu[i] *bfs_mort[bfs_mort$age == age, 2])
age = age+1
}
SUCC_REVu <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
SUCC_REVu[i+1] <- (SUCC_REVu[i] +REVu[i]) -
(SUCC_REVu[i]*bfs_mort[bfs_mort$age == age,2])
age=age+1
}
DEATHu <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
DEATHu[i+1] <- DEATHu[i] +
POP_fu[i] *bfs_mort[bfs_mort$age == age,2]+
POP_mu[i] *bfs_mort[bfs_mort$age == age,2]+
NOSURu[i] *bfs_mort[bfs_mort$age == age,2]+
SUCC_NOSURu[i] *bfs_mort[bfs_mort$age == age,2]+
SURu[i] *bfs_mort[bfs_mort$age == age,2]+
SUCC_SURu[i] *bfs_mort[bfs_mort$age == age,2]+
REVu[i] *bfs_mort[bfs_mort$age == age,2]+
SUCC_REVu[i] *bfs_mort[bfs_mort$age == age,2]
age=age+1
}
Following the modelling under “current non-surgical care” conditions, the model is run for “optimized model of care” conditions. Meaning that we use the input parameters that we’re defined for the “optimized model of care” (Higher costs for non-surgical treatment, higher utilities for non-surgical treatment). The transition probabilities remain the same as under “current model of care”.
## ----setup, include=FALSE----------------------------------------------------------------------------------------
knitr::opts_chunk$set(echo = TRUE, cache = FALSE)
## ----include= TRUE, echo= TRUE, message= FALSE, warning= FALSE---------------------------------------------------
cycle <- 1:70
n_cycle <- length(cycle)
POP_fo <- c(n_female, rep(NA, n_cycle-1))
age = age_init
for(i in 1:(n_cycle-1)){
POP_fo[i+1] <- POP_fo[i] -
(POP_fo[i] * prob_PREV_f[prob_PREV_f$age == age,2]) -
(POP_fo[i] * bfs_mort[bfs_mort$age == age,2])
age = age+1
}
POP_mo <- c(n_male, rep(NA, n_cycle-1))
age = age_init
for(i in 1:(n_cycle-1)){
POP_mo[i+1] <- POP_mo[i] -
(POP_mo[i] * prob_PREV_m[prob_PREV_m$age == age,2]) -
(POP_mo[i] * bfs_mort[bfs_mort$age == age,2])
age = age+1
}
NOSURo <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
NOSURo[i+1] <- (POP_fo[i]*prob_PREV_f[prob_PREV_f$age == age,2]) +
(POP_mo[i]*prob_PREV_m[prob_PREV_m$age == age,2]) -
(NOSURo[i] *bfs_mort[bfs_mort$age == age, 2])
age = age+1
}
SUCC_NOSURo <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
SUCC_NOSURo[i+1] <- (SUCC_NOSURo[i] +NOSURo[i])-
(SUCC_NOSURo[i]*prob_SUR_oc[prob_SUR_oc$age == age,2])-
(SUCC_NOSURo[i]*bfs_mort[bfs_mort$age == age,2])
age = age+1
}
SURo <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
SURo[i+1] <- (SUCC_NOSURo[i]*prob_SUR_oc[prob_SUR_oc$age == age,2]) -
(SURo[i] *bfs_mort[bfs_mort$age == age, 2])
age = age+1
}
SUCC_SURo <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
SUCC_SURo[i+1] <- (SUCC_SURo[i] +SURo[i]) -
(SUCC_SURo[i]*prob_REV_oc[prob_REV_oc$age == age,2]) -
(SUCC_SURo[i]*bfs_mort[bfs_mort$age == age,2])
age = age+1
}
REVo <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
REVo[i+1] <- (SUCC_SURo[i]*prob_REV_oc[prob_REV_oc$age == age,2]) -
(REVo[i] *bfs_mort[bfs_mort$age == age, 2])
age = age+1
}
SUCC_REVo <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
SUCC_REVo[i+1] <- (SUCC_REVo[i] +REVo[i]) -
(SUCC_REVo[i]*bfs_mort[bfs_mort$age == age,2])
age=age+1
}
DEATHo <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
DEATHo[i+1] <- DEATHo[i] +
POP_fo[i] *bfs_mort[bfs_mort$age == age,2]+
POP_mo[i] *bfs_mort[bfs_mort$age == age,2]+
NOSURo[i] *bfs_mort[bfs_mort$age == age,2]+
SUCC_NOSURo[i] *bfs_mort[bfs_mort$age == age,2]+
SURo[i] *bfs_mort[bfs_mort$age == age,2]+
SUCC_SURo[i] *bfs_mort[bfs_mort$age == age,2]+
REVo[i] *bfs_mort[bfs_mort$age == age,2]+
SUCC_REVo[i] *bfs_mort[bfs_mort$age == age,2]
age=age+1
}
For the scenario analysis, the model is again run for 70 cycles with values for “optimized model of care”. To simulate a 2 year delay of total knee replacement we add two “tunnel states” after “successful non-surgical care”. The transition probabilities remain the same.
## ----setup, include=FALSE----------------------------------------------------------------------------------------
knitr::opts_chunk$set(echo = TRUE, cache = FALSE)
## ----include= TRUE, echo= TRUE, message= FALSE, warning= FALSE---------------------------------------------------
cycle <- 1:70
n_cycle <- length(cycle)
POP_fo2 <- c(n_female, rep(NA, n_cycle-1))
age = age_init
for(i in 1:(n_cycle-1)){
POP_fo2[i+1] <- POP_fo2[i] -
(POP_fo2[i] * prob_PREV_f[prob_PREV_f$age == age,2]) -
(POP_fo2[i] * bfs_mort[bfs_mort$age == age,2])
age = age+1
}
POP_mo2 <- c(n_male, rep(NA, n_cycle-1))
age = age_init
for(i in 1:(n_cycle-1)){
POP_mo2[i+1] <- POP_mo2[i] -
(POP_mo2[i] * prob_PREV_m[prob_PREV_m$age == age,2]) -
(POP_mo2[i] * bfs_mort[bfs_mort$age == age,2])
age = age+1
}
NOSURo2 <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
NOSURo2[i+1] <- (POP_fo2[i]*prob_PREV_f[prob_PREV_f$age == age,2]) +
(POP_mo2[i]*prob_PREV_m[prob_PREV_m$age == age,2]) -
(NOSURo2[i] *bfs_mort[bfs_mort$age == age, 2])
age = age+1
}
SUCC_NOSURo2 <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
SUCC_NOSURo2[i+1] <- (SUCC_NOSURo2[i] +NOSURo2[i])-
(SUCC_NOSURo2[i]*prob_SUR_oc[prob_SUR_oc$age == age,2])-
(SUCC_NOSURo2[i]*bfs_mort[bfs_mort$age == age,2])
age = age+1
}
del1_2 <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
del1_2[i+1] <- (SUCC_NOSURo2[i]*prob_SUR_oc[prob_SUR_oc$age == age,2]) -
(del1_2[i]*bfs_mort[bfs_mort$age == age,2])
age = age+1
}
del2_2 <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
del2_2[i+1] <- (del1_2[i]) -
(del2_2[i]*bfs_mort[bfs_mort$age == age,2])
age = age+1
}
SURo2 <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
SURo2[i+1] <- (del2_2[i]) -
(SURo2[i] *bfs_mort[bfs_mort$age == age, 2])
age = age+1
}
SUCC_SURo2 <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
SUCC_SURo2[i+1] <- (SUCC_SURo2[i] +SURo2[i]) -
(SUCC_SURo2[i]*prob_REV_oc[prob_REV_oc$age == age,2]) -
(SUCC_SURo2[i]*bfs_mort[bfs_mort$age == age,2])
age = age+1
}
REVo2 <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
REVo2[i+1] <- (SUCC_SURo2[i]*prob_REV_oc[prob_REV_oc$age == age,2]) -
(REVo2[i] *bfs_mort[bfs_mort$age == age, 2])
age = age+1
}
SUCC_REVo2 <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
SUCC_REVo2[i+1] <- (SUCC_REVo2[i] +REVo2[i]) -
(SUCC_REVo2[i]*bfs_mort[bfs_mort$age == age,2])
age=age+1
}
DEATHo2 <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
DEATHo2[i+1] <- DEATHo2[i] +
POP_fo2[i] *bfs_mort[bfs_mort$age == age,2]+
POP_mo2[i] *bfs_mort[bfs_mort$age == age,2]+
NOSURo2[i] *bfs_mort[bfs_mort$age == age,2]+
SUCC_NOSURo2[i] *bfs_mort[bfs_mort$age == age,2]+
del1_2[i] *bfs_mort[bfs_mort$age == age,2]+
del2_2[i] *bfs_mort[bfs_mort$age == age,2]+
SURo2[i] *bfs_mort[bfs_mort$age == age,2]+
SUCC_SURo2[i] *bfs_mort[bfs_mort$age == age,2]+
REVo2[i] *bfs_mort[bfs_mort$age == age,2]+
SUCC_REVo2[i] *bfs_mort[bfs_mort$age == age,2]
age=age+1
}
Same procedure as described above. But now we add 5 “tunnel states” to simualte a 5 year delay of total knee replacement. Again, all transition probabilities remain the same.
## ----setup, include=FALSE----------------------------------------------------------------------------------------
knitr::opts_chunk$set(echo = TRUE, cache = FALSE)
## ----include= TRUE, echo= TRUE, message= FALSE, warning= FALSE---------------------------------------------------
cycle <- 1:70
n_cycle <- length(cycle)
POP_fo5 <- c(n_female, rep(NA, n_cycle-1))
age = age_init
for(i in 1:(n_cycle-1)){
POP_fo5[i+1] <- POP_fo5[i] -
(POP_fo5[i] * prob_PREV_f[prob_PREV_f$age == age,2]) -
(POP_fo5[i] * bfs_mort[bfs_mort$age == age,2])
age = age+1
}
POP_mo5 <- c(n_male, rep(NA, n_cycle-1))
age = age_init
for(i in 1:(n_cycle-1)){
POP_mo5[i+1] <- POP_mo5[i] -
(POP_mo5[i] * prob_PREV_m[prob_PREV_m$age == age,2]) -
(POP_mo5[i] * bfs_mort[bfs_mort$age == age,2])
age = age+1
}
NOSURo5 <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
NOSURo5[i+1] <- (POP_fo5[i]*prob_PREV_f[prob_PREV_f$age == age,2]) +
(POP_mo5[i]*prob_PREV_m[prob_PREV_m$age == age,2]) -
(NOSURo5[i] *bfs_mort[bfs_mort$age == age, 2])
age = age+1
}
SUCC_NOSURo5 <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
SUCC_NOSURo5[i+1] <- (SUCC_NOSURo5[i] +NOSURo5[i])-
(SUCC_NOSURo5[i]*prob_SUR_oc[prob_SUR_oc$age == age,2])-
(SUCC_NOSURo5[i]*bfs_mort[bfs_mort$age == age,2])
age = age+1
}
del1_5 <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
del1_5[i+1] <- (SUCC_NOSURo5[i]*prob_SUR_oc[prob_SUR_oc$age == age,2]) -
(del1_5[i]*bfs_mort[bfs_mort$age == age,2])
age = age+1
}
del2_5 <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
del2_5[i+1] <- (del1_5[i]) -
(del2_5[i]*bfs_mort[bfs_mort$age == age,2])
age = age+1
}
del3_5 <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
del3_5[i+1] <- (del2_5[i]) -
(del3_5[i]*bfs_mort[bfs_mort$age == age,2])
age = age+1
}
del4_5 <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
del4_5[i+1] <- (del3_5[i]) -
(del4_5[i]*bfs_mort[bfs_mort$age == age,2])
age = age+1
}
del5_5 <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
del5_5[i+1] <- (del4_5[i]) -
(del5_5[i]*bfs_mort[bfs_mort$age == age,2])
age = age+1
}
SURo5 <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
SURo5[i+1] <- (del5_5[i]) -
(SURo5[i] *bfs_mort[bfs_mort$age == age, 2])
age = age+1
}
SUCC_SURo5 <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
SUCC_SURo5[i+1] <- (SUCC_SURo5[i] +SURo5[i]) -
(SUCC_SURo5[i]*prob_REV_oc[prob_REV_oc$age == age,2]) -
(SUCC_SURo5[i]*bfs_mort[bfs_mort$age == age,2])
age = age+1
}
REVo5 <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
REVo5[i+1] <- (SUCC_SURo5[i]*prob_REV_oc[prob_REV_oc$age == age,2]) -
(REVo5[i] *bfs_mort[bfs_mort$age == age, 2])
age = age+1
}
SUCC_REVo5 <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
SUCC_REVo5[i+1] <- (SUCC_REVo5[i] +REVo5[i]) -
(SUCC_REVo5[i]*bfs_mort[bfs_mort$age == age,2])
age=age+1
}
DEATHo5 <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
DEATHo5[i+1] <- DEATHo5[i] +
POP_fo5[i] *bfs_mort[bfs_mort$age == age,2]+
POP_mo5[i] *bfs_mort[bfs_mort$age == age,2]+
NOSURo5[i] *bfs_mort[bfs_mort$age == age,2]+
SUCC_NOSURo5[i] *bfs_mort[bfs_mort$age == age,2]+
del1_5[i] *bfs_mort[bfs_mort$age == age,2]+
del2_5[i] *bfs_mort[bfs_mort$age == age,2]+
del3_5[i] *bfs_mort[bfs_mort$age == age,2]+
del4_5[i] *bfs_mort[bfs_mort$age == age,2]+
del5_5[i] *bfs_mort[bfs_mort$age == age,2]+
SURo5[i] *bfs_mort[bfs_mort$age == age,2]+
SUCC_SURo5[i] *bfs_mort[bfs_mort$age == age,2]+
REVo5[i] *bfs_mort[bfs_mort$age == age,2]+
SUCC_REVo5[i] *bfs_mort[bfs_mort$age == age,2]
age=age+1
}
QALY per person is calculated for each model.
## ----setup, include=FALSE----------------------------------------------------------------------------------------
knitr::opts_chunk$set(echo = TRUE, cache = FALSE)
## ----include= TRUE, echo= TRUE, message= FALSE, warning= FALSE---------------------------------------------------
discount <- 0.03
qaly_uc <- vector()
cycle_years <- rep(0:70)
for(i in 1:n_cycle){
qaly_uc[i] <- POP_fu[i] *u_NOSUR_uc+
POP_mu[i] *u_NOSUR_uc+
NOSURu[i] *u_NOSUR_uc+
SUCC_NOSURu[i] *u_SUCC_NOSUR_uc+
SURu[i] *u_NOSUR_uc+
SUCC_SURu[i] *u_SUCC_SUR_uc+
REVu[i] *u_NOSUR_uc+
SUCC_REVu[i] *u_SUCC_REV_uc
}
qaly_disc_uc <- vector()
for(i in 1:n_cycle){
qaly_disc_uc[i] <- qaly_uc[i]/(1+discount)^cycle_years[i]
}
total_qaly_uc <- sum(qaly_disc_uc)
person_qaly_uc <- total_qaly_uc/119672
cat("Model = ","UNC",", total qaly = ", total_qaly_uc, ", person qaly", person_qaly_uc)
## Model = UNC , total qaly = 2024442 , person qaly 16.91659
## ----include= TRUE, echo= TRUE, message= FALSE, warning= FALSE---------------------------------------------------
discount <- 0.03
qaly_oc <- vector()
cycle_years <- rep(0:70)
for(i in 1:n_cycle){
qaly_oc[i] <- POP_fo[i] *u_NOSUR_oc+
POP_mo[i] *u_NOSUR_oc+
NOSURo[i] *u_NOSUR_oc+
SUCC_NOSURo[i] *u_SUCC_NOSUR_oc+
SURo[i] *u_NOSUR_oc+
SUCC_SURo[i] *u_SUCC_SUR_oc+
REVo[i] *u_NOSUR_oc+
SUCC_REVo[i] *u_SUCC_REV_oc
}
qaly_disc_oc <- vector()
for(i in 1:n_cycle){
qaly_disc_oc[i] <- qaly_oc[i]/(1+discount)^cycle_years[i]
}
total_qaly_oc <- sum(qaly_disc_oc)
person_qaly_oc <- total_qaly_oc/119672
cat("Model = ","ONC no delay",", total qaly = ", total_qaly_oc, ", person qaly", person_qaly_oc)
## Model = ONC no delay , total qaly = 2042947 , person qaly 17.07122
## ----include= TRUE, echo= TRUE, message= FALSE, warning= FALSE---------------------------------------------------
discount <- 0.03
qaly_oc2 <- vector()
cycle_years <- rep(0:70)
for(i in 1:n_cycle){
qaly_oc2[i] <-POP_fo2[i] *u_NOSUR_oc+
POP_mo2[i] *u_NOSUR_oc+
NOSURo2[i] *u_NOSUR_oc+
SUCC_NOSURo2[i] *u_SUCC_NOSUR_oc+
del1_2[i] *u_SUCC_NOSUR_oc+
del2_2[i] *u_SUCC_NOSUR_oc+
SURo2[i] *u_NOSUR_oc+
SUCC_SURo2[i] *u_SUCC_SUR_oc+
REVo2[i] *u_NOSUR_oc+
SUCC_REVo2[i] *u_SUCC_REV_oc
}
qaly_disc_oc2 <- vector()
for(i in 1:n_cycle){
qaly_disc_oc2[i] <- qaly_oc2[i]/(1+discount)^cycle_years[i]
}
total_qaly_oc2 <- sum(qaly_disc_oc2)
person_qaly_oc2 <- total_qaly_oc2/119672
cat("Model = ","ONC 2 year delay",", total qaly = ", total_qaly_oc2, ", person qaly", person_qaly_oc2)
## Model = ONC 2 year delay , total qaly = 2041053 , person qaly 17.05539
## ----include= TRUE, echo= TRUE, message= FALSE, warning= FALSE---------------------------------------------------
discount <- 0.03
qaly_oc5 <- vector()
cycle_years <- rep(0:70)
for(i in 1:n_cycle){
qaly_oc5[i] <- POP_fo5[i] *u_NOSUR_oc+
POP_mo5[i] *u_NOSUR_oc+
NOSURo5[i] *u_NOSUR_oc+
SUCC_NOSURo5[i] *u_SUCC_NOSUR_oc+
del1_5[i] *u_SUCC_NOSUR_oc+
del2_5[i] *u_SUCC_NOSUR_oc+
del3_5[i] *u_SUCC_NOSUR_oc+
del4_5[i] *u_SUCC_NOSUR_oc+
del5_5[i] *u_SUCC_NOSUR_oc+
SURo5[i] *u_NOSUR_oc+
SUCC_SURo5[i] *u_SUCC_SUR_oc+
REVo5[i] *u_NOSUR_oc+
SUCC_REVo5[i] *u_SUCC_REV_oc
}
qaly_disc_oc5 <- vector()
for(i in 1:n_cycle){
qaly_disc_oc5[i] <- qaly_oc5[i]/(1+discount)^cycle_years[i]
}
total_qaly_oc5 <- sum(qaly_disc_oc5)
person_qaly_oc5 <- total_qaly_oc5/119672
cat("Model = ","ONC 5 year delay",", total qaly = ", total_qaly_oc5, ", person qaly", person_qaly_oc5)
## Model = ONC 5 year delay , total qaly = 2038503 , person qaly 17.03409
Cost per person is calculated for each model.
## ----setup, include=FALSE----------------------------------------------------------------------------------------
knitr::opts_chunk$set(echo = TRUE, cache = FALSE)
## ----fig.cap= "", fig.align='center', fig.height=8, fig.width=10, message= FALSE, warning= FALSE-----------------
cost_uc <- vector()
cycle_years <- rep(0:70)
discount <- 0.03
for(i in 1:n_cycle){
cost_uc[i] <-
NOSURu[i] *c_NOSUR_uc+
SUCC_NOSURu[i] *c_SUCC_NOSUR_uc+
SURu[i] *c_SUR_uc+
SUCC_SURu[i] *c_SUCC_SUR_uc+
REVu[i] *c_REV_uc+
SUCC_REVu[i] *c_SUCC_REV_uc
}
cost_disc_uc <- vector()
for(i in 1:n_cycle){
cost_disc_uc[i] <- cost_uc[i]/(1+discount)^cycle_years[i]
}
total_cost_uc <- sum(cost_disc_uc)
person_cost_uc <- total_cost_uc/119672
cat("Model = ","UNC",", total cost = ", total_cost_uc, ", person cost", person_cost_uc)
## Model = UNC , total cost = 534362192 , person cost 4465.223
## ----fig.cap= "", fig.align='center', fig.height=8, fig.width=10, message= FALSE, warning= FALSE-----------------
cost_oc <- vector()
cycle_years <- rep(0:70)
for(i in 1:n_cycle){
cost_oc[i] <-
NOSURo[i] *c_NOSUR_oc+
SUCC_NOSURo[i] *c_SUCC_NOSUR_oc+
SURo[i] *c_SUR_oc+
SUCC_SURo[i] *c_SUCC_SUR_oc+
REVo[i] *c_REV_oc+
SUCC_REVo[i] *c_SUCC_REV_oc
}
cost_disc_oc <- vector()
for(i in 1:n_cycle){
cost_disc_oc[i] <- cost_oc[i]/(1+discount)^cycle_years[i]
}
total_cost_oc <- sum(cost_disc_oc)
person_cost_oc <- total_cost_oc/119672
cat("Model = ","ONC no delay",", total cost = ", total_cost_oc, ", person cost", person_cost_oc)
## Model = ONC no delay , total cost = 575123320 , person cost 4805.83
## ----fig.cap= "", fig.align='center', fig.height=8, fig.width=10, message= FALSE, warning= FALSE-----------------
cost_oc2 <- vector()
cycle_years <- rep(0:70)
for(i in 1:n_cycle){
cost_oc2[i] <-
NOSURo2[i] *c_NOSUR_oc+
SUCC_NOSURo2[i] *c_SUCC_NOSUR_oc+
del1_2[i] *c_SUCC_NOSUR_oc+
del2_2[i] *c_SUCC_NOSUR_oc+
SURo2[i] *c_SUR_oc+
SUCC_SURo2[i] *c_SUCC_SUR_oc+
REVo2[i] *c_REV_oc+
SUCC_REVo2[i] *c_SUCC_REV_oc
}
cost_disc_oc2 <- vector()
for(i in 1:n_cycle){
cost_disc_oc2[i] <- cost_oc2[i]/(1+discount)^cycle_years[i]
}
total_cost_oc2 <- sum(cost_disc_oc2)
person_cost_oc2 <- total_cost_oc2/119672
cat("Model = ","ONC 2 year delay",", total cost = ", total_cost_oc2, ", person cost", person_cost_oc2)
## Model = ONC 2 year delay , total cost = 532684821 , person cost 4451.207
## ----fig.cap= "", fig.align='center', fig.height=8, fig.width=10, message= FALSE, warning= FALSE-----------------
cost_oc5 <- vector()
cycle_years <- rep(0:70)
for(i in 1:n_cycle){
cost_oc5[i] <-
NOSURo5[i] *c_NOSUR_oc+
SUCC_NOSURo5[i] *c_SUCC_NOSUR_oc+
del1_5[i] *c_SUCC_NOSUR_oc+
del2_5[i] *c_SUCC_NOSUR_oc+
del3_5[i] *c_SUCC_NOSUR_oc+
del4_5[i] *c_SUCC_NOSUR_oc+
del5_5[i] *c_SUCC_NOSUR_oc+
SURo5[i] *c_SUR_oc+
SUCC_SURo5[i] *c_SUCC_SUR_oc+
REVo5[i] *c_REV_oc+
SUCC_REVo5[i] *c_SUCC_REV_oc
}
cost_disc_oc5 <- vector()
for(i in 1:n_cycle){
cost_disc_oc5[i] <- cost_oc5[i]/(1+discount)^cycle_years[i]
}
total_cost_oc5 <- sum(cost_disc_oc5)
person_cost_oc5 <- total_cost_oc5/119672
cat("Model = ","ONC 5 year delay",", total cost = ", total_cost_oc5, ", person cost", person_cost_oc5)
## Model = ONC 5 year delay , total cost = 474355741 , person cost 3963.799
# o5_cost_nosur <- sum(NOSURo5) * c_NOSUR_oc
# o5_cost_nosursuc <-
# (sum(SUCC_NOSURo5) + sum(del1_5) + sum(del2_5) + sum(del3_5) + sum(del4_5) + sum(del5_5)) *
# c_SUCC_NOSUR_oc
# o5_cost_sur <- sum(SURo5) * c_SUR_oc
# o5_cost_sursuc <- sum(SUCC_SURo5) * c_SUCC_SUR_oc
# o5_cost_rev <- sum(REVo5) * c_REV_oc
# o5_cost_revsuc <- sum(SUCC_REVo5) * c_SUCC_REV_oc
#
# o2_cost_nosur <- sum(NOSURo2) * c_NOSUR_oc
# o2_cost_nosursuc <-
# (sum(SUCC_NOSURo2) + sum(del1_2) + sum(del2_2)) * c_SUCC_NOSUR_oc
# o2_cost_sur <- sum(SURo2) * c_SUR_oc
# o2_cost_sursuc <- sum(SUCC_SURo2) * c_SUCC_SUR_oc
# o2_cost_rev <- sum(REVo2) * c_REV_oc
# o2_cost_revsuc <- sum(SUCC_REVo2) * c_SUCC_REV_oc
#
# oc_cost_nosur <- sum(NOSURo) * c_NOSUR_oc
# oc_cost_nosursuc <- sum(SUCC_NOSURo) * c_SUCC_NOSUR_oc
# oc_cost_sur <- sum(SURo) * c_SUR_oc
# oc_cost_sursuc <- sum(SUCC_SURo) * c_SUCC_SUR_oc
# oc_cost_rev <- sum(REVo) * c_REV_oc
# oc_cost_revsuc <- sum(SUCC_REVo) * c_SUCC_REV_oc
#
# uc_cost_nosur <- sum(NOSURu) * c_NOSUR_uc
# uc_cost_nosursuc <- sum(SUCC_NOSURu) * c_SUCC_NOSUR_uc
# uc_cost_sur <- sum(SURu) * c_SUR_uc
# uc_cost_sursuc <- sum(SUCC_SURu) * c_SUCC_SUR_uc
# uc_cost_rev <- sum(REVu) * c_REV_uc
# uc_cost_revsuc <- sum(SUCC_REVu) * c_SUCC_REV_uc
#
#
#
# total_uc <-
# sum(
# uc_cost_nosur,
# uc_cost_nosursuc,
# uc_cost_sur,
# uc_cost_sursuc,
# uc_cost_rev,
# uc_cost_revsuc
# )
# total_oc <-
# sum(
# oc_cost_nosur,
# oc_cost_nosursuc,
# oc_cost_sur,
# oc_cost_sursuc,
# oc_cost_rev,
# oc_cost_revsuc
# )
# total_o2 <-
# sum(
# o2_cost_nosur,
# o2_cost_nosursuc,
# o2_cost_sur,
# o2_cost_sursuc,
# o2_cost_rev,
# o2_cost_revsuc
# )
# total_o5 <-
# sum(
# o5_cost_nosur,
# o5_cost_nosursuc,
# o5_cost_sur,
# o5_cost_sursuc,
# o5_cost_rev,
# o5_cost_revsuc
# )
#
#
#
# df_costs <-
# data.frame(
# name = c(
# "uc_cost_nosur",
# "uc_cost_nosursuc",
# "uc_cost_sur",
# "uc_cost_sursuc",
# "uc_cost_rev",
# "uc_cost_revsuc",
# "oc_cost_nosur",
# "oc_cost_nosursuc",
# "oc_cost_sur",
# "oc_cost_sursuc",
# "oc_cost_rev",
# "oc_cost_revsuc",
# "o2_cost_nosur",
# "o2_cost_nosursuc",
# "o2_cost_sur",
# "o2_cost_sursuc",
# "o2_cost_rev",
# "o2_cost_revsuc",
# "o5_cost_nosur",
# "o5_cost_nosursuc",
# "o5_cost_sur",
# "o5_cost_sursuc",
# "o5_cost_rev",
# "o5_cost_revsuc"
# ),
# cost = c(
# uc_cost_nosur,
# uc_cost_nosursuc,
# uc_cost_sur,
# uc_cost_sursuc,
# uc_cost_rev,
# uc_cost_revsuc,
# oc_cost_nosur,
# oc_cost_nosursuc,
# oc_cost_sur,
# oc_cost_sursuc,
# oc_cost_rev,
# oc_cost_revsuc,
# o2_cost_nosur,
# o2_cost_nosursuc,
# o2_cost_sur,
# o2_cost_sursuc,
# o2_cost_rev,
# o2_cost_revsuc,
# o5_cost_nosur,
# o5_cost_nosursuc,
# o5_cost_sur,
# o5_cost_sursuc,
# o5_cost_rev,
# o5_cost_revsuc
# )
# )
#
# write.csv(df_costs, "export_new.csv")
#
# df_cycle_cost <-
# cbind(cost_oc,
# cost_disc_oc,
# cost_oc2,
# cost_disc_oc2,
# cost_oc5,
# cost_disc_oc5)
#
# write.csv(data_test, "cycle_cost.csv")
#
# counts_per_state <-
# cbind(NOSURo, SUCC_NOSURo, SURo, SUCC_SURo, REVo, SUCC_REVo)
#
# write.csv(counts_per_state, "counts_opti.csv")
The ICER is calculated for each scenario and used to plot on the cost-effectiveness panel
## ----setup, include=FALSE----------------------------------------------------------------------------------------
knitr::opts_chunk$set(echo = TRUE, cache = FALSE)
## ----fig.cap= "counts by state", fig.align='center', fig.height=8, fig.width=10, message= FALSE, warning= FALSE----
delta_costs_base <- person_cost_oc - person_cost_uc
delta_qalys_base <- person_qaly_oc - person_qaly_uc
icer_base <- delta_costs_base/delta_qalys_base
cat("Scenario = ","basecase",", Cost difference = ", delta_costs_base, ", QALY difference", delta_qalys_base, ", ICER = ", icer_base)
## Scenario = basecase , Cost difference = 340.6071 , QALY difference 0.154632 , ICER = 2202.694
delta_costs_scen2 <- person_cost_oc2 - person_cost_uc
delta_qalys_scen2 <- person_qaly_oc2 - person_qaly_uc
icer_scen2 <- delta_costs_scen2/delta_qalys_scen2
cat("Scenario = ","2 year delay",", Cost difference = ", delta_costs_scen2, ", QALY difference", delta_qalys_scen2, ", ICER = ", icer_scen2)
## Scenario = 2 year delay , Cost difference = -14.01641 , QALY difference 0.138808 , ICER = -100.977
delta_costs_scen5 <- person_cost_oc5 - person_cost_uc
delta_qalys_scen5 <- person_qaly_oc5 - person_qaly_uc
icer_scen5 <- delta_costs_scen5/delta_qalys_scen5
cat("Scenario = ","5 year delay",", Cost difference = ", delta_costs_scen5, ", QALY difference", delta_qalys_scen5, ", ICER = ", icer_scen5)
## Scenario = 5 year delay , Cost difference = -501.4243 , QALY difference 0.1175037 , ICER = -4267.305
icer_table <- data.frame(scenario = c("base", "2 year delay", "5 year delay"),
cost_delta = c(delta_costs_base, delta_costs_scen2, delta_costs_scen5),
qaly_delta = c(delta_qalys_base, delta_qalys_scen2, delta_qalys_scen5),
ICER = c(icer_base, icer_scen2, icer_scen5))
per_person_table <- data.frame(scenario = c("base case UNC","base case ONC", "2 year delay", "5 year delay"),
cost_person = c(person_cost_uc, person_cost_oc, person_cost_oc2, person_cost_oc5),
qaly_person = c(person_qaly_uc, person_qaly_oc, person_qaly_oc2, person_qaly_oc5))
Probabilistic sensitivity analysis with 1000 (10000 in manuscript) iterations on utility and cost values for the “basecase scenario”
#PSA TEST
## ----setup, include=FALSE----------------------------------------------------------------------------------------------------------
knitr::opts_chunk$set(echo = TRUE, cache = FALSE)
## ----include= TRUE, echo= TRUE, message= FALSE, warning= FALSE---------------------------------------------------------------------
# Beta distribution
estBetaParams <- function(mu, sd) {
var <- sd^2
alpha <- ((1 - mu) / var - 1 / mu) * mu ^ 2
beta <- alpha * (1 / mu - 1)
return(params = list(alpha = alpha, beta = beta))
}
#create beta distribution for utilities, for successfull nosur and sur
alpha_beta <- estBetaParams(u_SUCC_NOSUR_uc, u_SUCC_NOSUR_uc_sd)
dist_u_SUCC_NOSUR_uc <- rbeta(100000, alpha_beta$alpha, alpha_beta$beta)
alpha_beta <- estBetaParams(u_SUCC_NOSUR_oc, u_SUCC_NOSUR_oc_sd)
dist_u_SUCC_NOSUR_oc <- rbeta(100000, alpha_beta$alpha, alpha_beta$beta)
alpha_beta <- estBetaParams(u_SUCC_SUR_uc, u_SUCC_SUR_uc_sd)
dist_u_SUCC_SUR_uc <- rbeta(100000, alpha_beta$alpha, alpha_beta$beta)
alpha_beta <- estBetaParams(u_SUCC_SUR_oc, u_SUCC_SUR_oc_sd)
dist_u_SUCC_SUR_oc <- rbeta(100000, alpha_beta$alpha, alpha_beta$beta)
#create gamma distributions for costs
dist_c_NOSUR_oc <- rgamma(100000, (c_NOSUR_oc_sd/c_NOSUR_oc)^-2, scale = c_NOSUR_oc * (c_NOSUR_oc_sd/c_NOSUR_oc)^2)
dist_c_NOSUR_uc <- rgamma(100000, (c_NOSUR_uc_sd/c_NOSUR_uc)^-2, scale = c_NOSUR_uc * (c_NOSUR_uc_sd/c_NOSUR_uc)^2)
dist_c_SUR_oc <- rgamma(100000, (c_SUR_oc_sd/c_SUR_oc)^-2, scale = c_SUR_oc * (c_SUR_oc_sd/c_SUR_oc)^2)
dist_c_SUR_uc <- rgamma(100000, (c_SUR_uc_sd/c_SUR_uc)^-2, scale = c_SUR_uc * (c_SUR_uc_sd/c_SUR_uc)^2)
dist_c_REV_oc <- rgamma(100000, (c_REV_oc_sd/c_REV_oc)^-2, scale = c_REV_oc * (c_REV_oc_sd/c_REV_oc)^2)
dist_c_REV_uc <- rgamma(100000, (c_REV_uc_sd/c_REV_uc)^-2, scale = c_REV_uc * (c_REV_oc_sd/c_REV_uc)^2)
#create gamma distributions for probabilities healthy to non-surgical treatment
#prob_PREV_m$value <- 0.02 #annual incidence for individuals aged 20+
#prob_PREV_f$value <- 0.02
#prob_prev_m_se <- 0.00512
#prop_prev_f_se <- 0.00512
alpha_beta <- estBetaParams(0.02, 0.00510)
dist_p_prev_m <- rbeta(100000, alpha_beta$alpha, alpha_beta$beta)
dist_p_prev_f <- rbeta(100000, alpha_beta$alpha, alpha_beta$beta)
#define vectors for psa
psa_cost_disc_uc <- vector()
psa_cost_uc <- vector()
psa_cost_disc_oc <- vector()
psa_cost_oc <- vector()
psa_qaly_disc_oc <- vector()
psa_qaly_oc <- vector()
psa_qaly_disc_uc <- vector()
psa_qaly_uc <- vector()
res_cost_uc <- vector()
res_cost_oc <- vector()
res_qaly_uc <- vector()
res_qaly_oc <- vector()
discount <- 0.03
n_cycle <- 70
#run psa x times
for(j in 1:1000){
c_NOSUR_oc_psa <- sample(dist_c_NOSUR_oc,1)
c_NOSUR_uc_psa <- sample(dist_c_NOSUR_uc,1)
c_SUR_oc_psa <- sample(dist_c_SUR_oc,1)
c_SUR_uc_psa <- sample(dist_c_SUR_uc,1)
c_REV_oc_psa <- sample(dist_c_REV_oc,1)
c_REV_uc_psa <- sample(dist_c_REV_uc,1)
u_SUCC_NOSUR_oc_psa <- sample(dist_u_SUCC_NOSUR_oc,1)
u_SUCC_NOSUR_uc_psa <- sample(dist_u_SUCC_NOSUR_uc,1)
u_SUCC_SUR_oc_psa <- sample(dist_u_SUCC_SUR_oc,1)
u_SUCC_SUR_uc_psa <- sample(dist_u_SUCC_SUR_uc,1)
p_prev_m_psa <- sample(dist_p_prev_m,1)
p_prev_f_psa <- sample(dist_p_prev_f,1)
## RUN MODEL USUAL CARE
cycle <- 1:70
n_cycle <- length(cycle)
POP_fu <- c(n_female, rep(NA, n_cycle-1))
age = age_init
for(i in 1:(n_cycle-1)){
POP_fu[i+1] <- POP_fu[i] -
(POP_fu[i] * p_prev_f_psa) -
(POP_fu[i] * bfs_mort[bfs_mort$age == age,2])
age = age+1
}
POP_mu <- c(n_male, rep(NA, n_cycle-1))
age = age_init
for(i in 1:(n_cycle-1)){
POP_mu[i+1] <- POP_mu[i] -
(POP_mu[i] * p_prev_m_psa) -
(POP_mu[i] * bfs_mort[bfs_mort$age == age,2])
age = age+1
}
NOSURu <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
NOSURu[i+1] <- (POP_fu[i]*p_prev_f_psa) +
(POP_mu[i]*p_prev_m_psa) -
(NOSURu[i] *bfs_mort[bfs_mort$age == age, 2])
age = age+1
}
SUCC_NOSURu <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
SUCC_NOSURu[i+1] <- (SUCC_NOSURu[i] +NOSURu[i]) -
(SUCC_NOSURu[i]*prob_SUR_uc[prob_SUR_uc$age == age,2]) -
(SUCC_NOSURu[i]*bfs_mort[bfs_mort$age == age,2])
age = age+1
}
SURu <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
SURu[i+1] <- (SUCC_NOSURu[i]*prob_SUR_uc[prob_SUR_uc$age == age,2]) -
(SURu[i] *bfs_mort[bfs_mort$age == age, 2])
age = age+1
}
SUCC_SURu <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
SUCC_SURu[i+1] <- (SUCC_SURu[i] +SURu[i]) -
(SUCC_SURu[i]*prob_REV_uc[prob_REV_uc$age == age,2]) -
(SUCC_SURu[i]*bfs_mort[bfs_mort$age == age,2])
age = age+1
}
REVu <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
REVu[i+1] <- (SUCC_SURu[i]*prob_REV_uc[prob_REV_uc$age == age,2]) -
(REVu[i] *bfs_mort[bfs_mort$age == age, 2])
age = age+1
}
SUCC_REVu <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
SUCC_REVu[i+1] <- (SUCC_REVu[i] +REVu[i]) -
(SUCC_REVu[i]*bfs_mort[bfs_mort$age == age,2])
age=age+1
}
DEATHu <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
DEATHu[i+1] <- DEATHu[i] +
POP_fu[i] *bfs_mort[bfs_mort$age == age,2]+
POP_mu[i] *bfs_mort[bfs_mort$age == age,2]+
NOSURu[i] *bfs_mort[bfs_mort$age == age,2]+
SUCC_NOSURu[i] *bfs_mort[bfs_mort$age == age,2]+
SURu[i] *bfs_mort[bfs_mort$age == age,2]+
SUCC_SURu[i] *bfs_mort[bfs_mort$age == age,2]+
REVu[i] *bfs_mort[bfs_mort$age == age,2]+
SUCC_REVu[i] *bfs_mort[bfs_mort$age == age,2]
age=age+1
}
## RUN MODEL OPTIMIZED CARE
cycle <- 1:70
n_cycle <- length(cycle)
POP_fo <- c(n_female, rep(NA, n_cycle-1))
age = age_init
for(i in 1:(n_cycle-1)){
POP_fo[i+1] <- POP_fo[i] -
(POP_fo[i] * p_prev_f_psa) -
(POP_fo[i] * bfs_mort[bfs_mort$age == age,2])
age = age+1
}
POP_mo <- c(n_male, rep(NA, n_cycle-1))
age = age_init
for(i in 1:(n_cycle-1)){
POP_mo[i+1] <- POP_mo[i] -
(POP_mo[i] * p_prev_m_psa ) -
(POP_mo[i] * bfs_mort[bfs_mort$age == age,2])
age = age+1
}
NOSURo <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
NOSURo[i+1] <- (POP_fo[i]*p_prev_f_psa) +
(POP_mo[i]*p_prev_m_psa) -
(NOSURo[i] *bfs_mort[bfs_mort$age == age, 2])
age = age+1
}
SUCC_NOSURo <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
SUCC_NOSURo[i+1] <- (SUCC_NOSURo[i] +NOSURo[i])-
(SUCC_NOSURo[i]*prob_SUR_oc[prob_SUR_oc$age == age,2])-
(SUCC_NOSURo[i]*bfs_mort[bfs_mort$age == age,2])
age = age+1
}
SURo <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
SURo[i+1] <- (SUCC_NOSURo[i]*prob_SUR_oc[prob_SUR_oc$age == age,2]) -
(SURo[i] *bfs_mort[bfs_mort$age == age, 2])
age = age+1
}
SUCC_SURo <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
SUCC_SURo[i+1] <- (SUCC_SURo[i] +SURo[i]) -
(SUCC_SURo[i]*prob_REV_oc[prob_REV_oc$age == age,2]) -
(SUCC_SURo[i]*bfs_mort[bfs_mort$age == age,2])
age = age+1
}
REVo <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
REVo[i+1] <- (SUCC_SURo[i]*prob_REV_oc[prob_REV_oc$age == age,2]) -
(REVo[i] *bfs_mort[bfs_mort$age == age, 2])
age = age+1
}
SUCC_REVo <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
SUCC_REVo[i+1] <- (SUCC_REVo[i] +REVo[i]) -
(SUCC_REVo[i]*bfs_mort[bfs_mort$age == age,2])
age=age+1
}
DEATHo <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
DEATHo[i+1] <- DEATHo[i] +
POP_fo[i] *bfs_mort[bfs_mort$age == age,2]+
POP_mo[i] *bfs_mort[bfs_mort$age == age,2]+
NOSURo[i] *bfs_mort[bfs_mort$age == age,2]+
SUCC_NOSURo[i] *bfs_mort[bfs_mort$age == age,2]+
SURo[i] *bfs_mort[bfs_mort$age == age,2]+
SUCC_SURo[i] *bfs_mort[bfs_mort$age == age,2]+
REVo[i] *bfs_mort[bfs_mort$age == age,2]+
SUCC_REVo[i] *bfs_mort[bfs_mort$age == age,2]
age=age+1
}
#cost calc for UNC
for(i in 1:n_cycle){
psa_cost_uc[i] <- NOSURu[i] *c_NOSUR_uc_psa+
SUCC_NOSURu[i] *c_SUCC_NOSUR_uc+
SURu[i] *c_SUR_uc_psa+
SUCC_SURu[i] *c_SUCC_SUR_uc+
REVu[i] *c_REV_uc_psa+
SUCC_REVu[i] *c_SUCC_REV_uc
}
#discouting costs
for(i in 1:n_cycle){
psa_cost_disc_uc[i] <- psa_cost_uc[i]/(1+discount)^cycle_years[i]
}
psa_total_cost_uc <- sum(psa_cost_disc_uc)
psa_person_cost_uc <- psa_total_cost_uc/119672
res_cost_uc[j] <- psa_person_cost_uc
# cost calc for ONC
for(i in 1:n_cycle){
psa_cost_oc[i] <- NOSURo[i] *c_NOSUR_oc_psa+
SUCC_NOSURo[i] *c_SUCC_NOSUR_oc+
SURo[i] *c_SUR_oc_psa+
SUCC_SURo[i] *c_SUCC_SUR_oc+
REVo[i] *c_REV_oc_psa+
SUCC_REVo[i] *c_SUCC_REV_oc
}
#discounting costs
for(i in 1:n_cycle){
psa_cost_disc_oc[i] <- psa_cost_oc[i]/(1+discount)^cycle_years[i]
}
psa_total_cost_oc <- sum(psa_cost_disc_oc)
psa_person_cost_oc <- psa_total_cost_oc/119672
res_cost_oc[j] <- psa_person_cost_oc
#utility calc for UNC
for(i in 1:n_cycle){
psa_qaly_uc[i] <- POP_fu[i] *u_NOSUR_uc+
POP_mu[i] *u_NOSUR_uc+
NOSURu[i] *u_NOSUR_uc+
SUCC_NOSURu[i] *u_SUCC_NOSUR_uc_psa+
SURu[i] *u_NOSUR_uc+
SUCC_SURu[i] *u_SUCC_SUR_uc_psa+
REVu[i] *u_NOSUR_uc+
SUCC_REVu[i] *u_SUCC_REV_uc
}
for(i in 1:n_cycle){
psa_qaly_disc_uc[i] <- psa_qaly_uc[i]/(1+discount)^cycle_years[i]
}
psa_total_qaly_uc <- sum(psa_qaly_disc_uc)
psa_person_qaly_uc <- psa_total_qaly_uc/119672
res_qaly_uc[j] <- psa_person_qaly_uc
#utility calc for ONC
for(i in 1:n_cycle){
psa_qaly_oc[i] <- POP_fo[i] *u_NOSUR_oc+
POP_mo[i] *u_NOSUR_oc+
NOSURo[i] *u_NOSUR_oc+
SUCC_NOSURo[i] *u_SUCC_NOSUR_oc_psa+
SURo[i] *u_NOSUR_oc+
SUCC_SURo[i] *u_SUCC_SUR_oc_psa+
REVo[i] *u_NOSUR_oc+
SUCC_REVo[i] *u_SUCC_REV_oc
}
for(i in 1:n_cycle){
psa_qaly_disc_oc[i] <- psa_qaly_oc[i]/(1+discount)^cycle_years[i]
}
psa_total_qaly_oc <- sum(psa_qaly_disc_oc)
psa_person_qaly_oc <- psa_total_qaly_oc/119672
res_qaly_oc[j] <- psa_person_qaly_oc
}
mean(res_qaly_oc)
## [1] 17.06963
mean(res_cost_oc)
## [1] 4771.391
psabc_delta_costs <- res_cost_oc - res_cost_uc
psabc_delta_qalys <- res_qaly_oc - res_qaly_uc
kable(per_person_table, digits =2)
scenario | cost_person | qaly_person |
---|---|---|
base case UNC | 4465.22 | 16.92 |
base case ONC | 4805.83 | 17.07 |
2 year delay | 4451.21 | 17.06 |
5 year delay | 3963.80 | 17.03 |
Probabilistic sensitivity analysis with 1000 (10000 in manuscript) iterations on utility and cost values for the “2-year delay scenario”
#PSA TEST
## ----setup, include=FALSE----------------------------------------------------------------------------------------------------------
knitr::opts_chunk$set(echo = TRUE, cache = FALSE)
## ----include= TRUE, echo= TRUE, message= FALSE, warning= FALSE---------------------------------------------------------------------
# Beta distribution
estBetaParams <- function(mu, sd) {
var <- sd^2
alpha <- ((1 - mu) / var - 1 / mu) * mu ^ 2
beta <- alpha * (1 / mu - 1)
return(params = list(alpha = alpha, beta = beta))
}
#create beta distribution for utilities, for successfull nosur and sur
alpha_beta <- estBetaParams(u_SUCC_NOSUR_uc, u_SUCC_NOSUR_uc_sd)
dist_u_SUCC_NOSUR_uc <- rbeta(100000, alpha_beta$alpha, alpha_beta$beta)
alpha_beta <- estBetaParams(u_SUCC_NOSUR_oc, u_SUCC_NOSUR_oc_sd)
dist_u_SUCC_NOSUR_oc <- rbeta(100000, alpha_beta$alpha, alpha_beta$beta)
alpha_beta <- estBetaParams(u_SUCC_SUR_uc, u_SUCC_SUR_uc_sd)
dist_u_SUCC_SUR_uc <- rbeta(100000, alpha_beta$alpha, alpha_beta$beta)
alpha_beta <- estBetaParams(u_SUCC_SUR_oc, u_SUCC_SUR_oc_sd)
dist_u_SUCC_SUR_oc <- rbeta(100000, alpha_beta$alpha, alpha_beta$beta)
#create gamma distributions for costs
dist_c_NOSUR_oc <- rgamma(100000, (c_NOSUR_oc_sd/c_NOSUR_oc)^-2, scale = c_NOSUR_oc * (c_NOSUR_oc_sd/c_NOSUR_oc)^2)
dist_c_NOSUR_uc <- rgamma(100000, (c_NOSUR_uc_sd/c_NOSUR_uc)^-2, scale = c_NOSUR_uc * (c_NOSUR_uc_sd/c_NOSUR_uc)^2)
dist_c_SUR_oc <- rgamma(100000, (c_SUR_oc_sd/c_SUR_oc)^-2, scale = c_SUR_oc * (c_SUR_oc_sd/c_SUR_oc)^2)
dist_c_SUR_uc <- rgamma(100000, (c_SUR_uc_sd/c_SUR_uc)^-2, scale = c_SUR_uc * (c_SUR_uc_sd/c_SUR_uc)^2)
dist_c_REV_oc <- rgamma(100000, (c_REV_oc_sd/c_REV_oc)^-2, scale = c_REV_oc * (c_REV_oc_sd/c_REV_oc)^2)
dist_c_REV_uc <- rgamma(100000, (c_REV_uc_sd/c_REV_uc)^-2, scale = c_REV_uc * (c_REV_oc_sd/c_REV_uc)^2)
#create gamma distributions for probabilities healthy to non-surgical treatment
#prob_PREV_m$value <- 0.02 #annual incidence for individuals aged 20+
#prob_PREV_f$value <- 0.02
#prob_prev_m_se <- 0.00512
#prop_prev_f_se <- 0.00512
alpha_beta <- estBetaParams(0.02, 0.00510)
dist_p_prev_m <- rbeta(100000, alpha_beta$alpha, alpha_beta$beta)
dist_p_prev_f <- rbeta(100000, alpha_beta$alpha, alpha_beta$beta)
#define vectors for psa
psa_cost_disc_uc <- vector()
psa_cost_uc <- vector()
psa_cost_disc_oc <- vector()
psa_cost_oc <- vector()
psa_qaly_disc_oc <- vector()
psa_qaly_oc <- vector()
psa_qaly_disc_uc <- vector()
psa_qaly_uc <- vector()
res_cost_uc <- vector()
res_cost_oc2 <- vector()
res_qaly_uc <- vector()
res_qaly_oc2 <- vector()
discount <- 0.03
n_cycle <- 70
#run psa x times
for(j in 1:1000){
c_NOSUR_oc_psa <- sample(dist_c_NOSUR_oc,1)
c_NOSUR_uc_psa <- sample(dist_c_NOSUR_uc,1)
c_SUR_oc_psa <- sample(dist_c_SUR_oc,1)
c_SUR_uc_psa <- sample(dist_c_SUR_uc,1)
c_REV_oc_psa <- sample(dist_c_REV_oc,1)
c_REV_uc_psa <- sample(dist_c_REV_uc,1)
u_SUCC_NOSUR_oc_psa <- sample(dist_u_SUCC_NOSUR_oc,1)
u_SUCC_NOSUR_uc_psa <- sample(dist_u_SUCC_NOSUR_uc,1)
u_SUCC_SUR_oc_psa <- sample(dist_u_SUCC_SUR_oc,1)
u_SUCC_SUR_uc_psa <- sample(dist_u_SUCC_SUR_uc,1)
p_prev_m_psa <- sample(dist_p_prev_m,1)
p_prev_f_psa <- sample(dist_p_prev_f,1)
## RUN MODEL USUAL CARE
cycle <- 1:70
n_cycle <- length(cycle)
POP_fu <- c(n_female, rep(NA, n_cycle-1))
age = age_init
for(i in 1:(n_cycle-1)){
POP_fu[i+1] <- POP_fu[i] -
(POP_fu[i] * p_prev_f_psa) -
(POP_fu[i] * bfs_mort[bfs_mort$age == age,2])
age = age+1
}
POP_mu <- c(n_male, rep(NA, n_cycle-1))
age = age_init
for(i in 1:(n_cycle-1)){
POP_mu[i+1] <- POP_mu[i] -
(POP_mu[i] * p_prev_m_psa) -
(POP_mu[i] * bfs_mort[bfs_mort$age == age,2])
age = age+1
}
NOSURu <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
NOSURu[i+1] <- (POP_fu[i]*p_prev_f_psa) +
(POP_mu[i]*p_prev_m_psa) -
(NOSURu[i] *bfs_mort[bfs_mort$age == age, 2])
age = age+1
}
SUCC_NOSURu <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
SUCC_NOSURu[i+1] <- (SUCC_NOSURu[i] +NOSURu[i]) -
(SUCC_NOSURu[i]*prob_SUR_uc[prob_SUR_uc$age == age,2]) -
(SUCC_NOSURu[i]*bfs_mort[bfs_mort$age == age,2])
age = age+1
}
SURu <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
SURu[i+1] <- (SUCC_NOSURu[i]*prob_SUR_uc[prob_SUR_uc$age == age,2]) -
(SURu[i] *bfs_mort[bfs_mort$age == age, 2])
age = age+1
}
SUCC_SURu <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
SUCC_SURu[i+1] <- (SUCC_SURu[i] +SURu[i]) -
(SUCC_SURu[i]*prob_REV_uc[prob_REV_uc$age == age,2]) -
(SUCC_SURu[i]*bfs_mort[bfs_mort$age == age,2])
age = age+1
}
REVu <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
REVu[i+1] <- (SUCC_SURu[i]*prob_REV_uc[prob_REV_uc$age == age,2]) -
(REVu[i] *bfs_mort[bfs_mort$age == age, 2])
age = age+1
}
SUCC_REVu <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
SUCC_REVu[i+1] <- (SUCC_REVu[i] +REVu[i]) -
(SUCC_REVu[i]*bfs_mort[bfs_mort$age == age,2])
age=age+1
}
DEATHu <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
DEATHu[i+1] <- DEATHu[i] +
POP_fu[i] *bfs_mort[bfs_mort$age == age,2]+
POP_mu[i] *bfs_mort[bfs_mort$age == age,2]+
NOSURu[i] *bfs_mort[bfs_mort$age == age,2]+
SUCC_NOSURu[i] *bfs_mort[bfs_mort$age == age,2]+
SURu[i] *bfs_mort[bfs_mort$age == age,2]+
SUCC_SURu[i] *bfs_mort[bfs_mort$age == age,2]+
REVu[i] *bfs_mort[bfs_mort$age == age,2]+
SUCC_REVu[i] *bfs_mort[bfs_mort$age == age,2]
age=age+1
}
## RUN MODEL OPTIMIZED CARE 2 year delay
cycle <- 1:70
n_cycle <- length(cycle)
POP_fo2 <- c(n_female, rep(NA, n_cycle-1))
age = age_init
for(i in 1:(n_cycle-1)){
POP_fo2[i+1] <- POP_fo2[i] -
(POP_fo2[i] * p_prev_f_psa) -
(POP_fo2[i] * bfs_mort[bfs_mort$age == age,2])
age = age+1
}
POP_mo2 <- c(n_male, rep(NA, n_cycle-1))
age = age_init
for(i in 1:(n_cycle-1)){
POP_mo2[i+1] <- POP_mo2[i] -
(POP_mo2[i] * p_prev_m_psa) -
(POP_mo2[i] * bfs_mort[bfs_mort$age == age,2])
age = age+1
}
NOSURo2 <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
NOSURo2[i+1] <- (POP_fo2[i]*p_prev_f_psa) +
(POP_mo2[i]*p_prev_m_psa) -
(NOSURo2[i] *bfs_mort[bfs_mort$age == age, 2])
age = age+1
}
SUCC_NOSURo2 <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
SUCC_NOSURo2[i+1] <- (SUCC_NOSURo2[i] +NOSURo2[i])-
(SUCC_NOSURo2[i]*prob_SUR_oc[prob_SUR_oc$age == age,2])-
(SUCC_NOSURo2[i]*bfs_mort[bfs_mort$age == age,2])
age = age+1
}
del1_2 <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
del1_2[i+1] <- (SUCC_NOSURo2[i]*prob_SUR_oc[prob_SUR_oc$age == age,2]) -
(del1_2[i]*bfs_mort[bfs_mort$age == age,2])
age = age+1
}
del2_2 <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
del2_2[i+1] <- (del1_2[i]) -
(del2_2[i]*bfs_mort[bfs_mort$age == age,2])
age = age+1
}
SURo2 <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
SURo2[i+1] <- (del2_2[i]) -
(SURo2[i] *bfs_mort[bfs_mort$age == age, 2])
age = age+1
}
SUCC_SURo2 <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
SUCC_SURo2[i+1] <- (SUCC_SURo2[i] +SURo2[i]) -
(SUCC_SURo2[i]*prob_REV_oc[prob_REV_oc$age == age,2]) -
(SUCC_SURo2[i]*bfs_mort[bfs_mort$age == age,2])
age = age+1
}
REVo2 <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
REVo2[i+1] <- (SUCC_SURo2[i]*prob_REV_oc[prob_REV_oc$age == age,2]) -
(REVo2[i] *bfs_mort[bfs_mort$age == age, 2])
age = age+1
}
SUCC_REVo2 <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
SUCC_REVo2[i+1] <- (SUCC_REVo2[i] +REVo2[i]) -
(SUCC_REVo2[i]*bfs_mort[bfs_mort$age == age,2])
age=age+1
}
DEATHo2 <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
DEATHo2[i+1] <- DEATHo2[i] +
POP_fo2[i] *bfs_mort[bfs_mort$age == age,2]+
POP_mo2[i] *bfs_mort[bfs_mort$age == age,2]+
NOSURo2[i] *bfs_mort[bfs_mort$age == age,2]+
SUCC_NOSURo2[i] *bfs_mort[bfs_mort$age == age,2]+
del1_2[i] *bfs_mort[bfs_mort$age == age,2]+
del2_2[i] *bfs_mort[bfs_mort$age == age,2]+
SURo2[i] *bfs_mort[bfs_mort$age == age,2]+
SUCC_SURo2[i] *bfs_mort[bfs_mort$age == age,2]+
REVo2[i] *bfs_mort[bfs_mort$age == age,2]+
SUCC_REVo2[i] *bfs_mort[bfs_mort$age == age,2]
age=age+1
}
#cost calc for UNC
for(i in 1:n_cycle){
psa_cost_uc[i] <- NOSURu[i] *c_NOSUR_uc_psa+
SUCC_NOSURu[i] *c_SUCC_NOSUR_uc+
SURu[i] *c_SUR_uc_psa+
SUCC_SURu[i] *c_SUCC_SUR_uc+
REVu[i] *c_REV_uc_psa+
SUCC_REVu[i] *c_SUCC_REV_uc
}
#discouting costs UNC
for(i in 1:n_cycle){
psa_cost_disc_uc[i] <- psa_cost_uc[i]/(1+discount)^cycle_years[i]
}
psa_total_cost_uc <- sum(psa_cost_disc_uc)
psa_person_cost_uc <- psa_total_cost_uc/119672
res_cost_uc[j] <- psa_person_cost_uc
# cost calc for ONC
for(i in 1:n_cycle){
psa_cost_oc[i] <-
NOSURo2[i] *c_NOSUR_oc_psa+
SUCC_NOSURo2[i] *c_SUCC_NOSUR_oc+
del1_2[i] *c_SUCC_NOSUR_oc+
del2_2[i] *c_SUCC_NOSUR_oc+
SURo2[i] *c_SUR_oc_psa+
SUCC_SURo2[i] *c_SUCC_SUR_oc+
REVo2[i] *c_REV_oc_psa+
SUCC_REVo2[i] *c_SUCC_REV_oc
}
#discounting costs ONC
for(i in 1:n_cycle){
psa_cost_disc_oc[i] <- psa_cost_oc[i]/(1+discount)^cycle_years[i]
}
psa_total_cost_oc <- sum(psa_cost_disc_oc)
psa_person_cost_oc <- psa_total_cost_oc/119672
res_cost_oc2[j] <- psa_person_cost_oc
#utility calc for UNC
for(i in 1:n_cycle){
psa_qaly_uc[i] <- POP_fu[i] *u_NOSUR_uc+
POP_mu[i] *u_NOSUR_uc+
NOSURu[i] *u_NOSUR_uc+
SUCC_NOSURu[i] *u_SUCC_NOSUR_uc_psa+
SURu[i] *u_NOSUR_uc+
SUCC_SURu[i] *u_SUCC_SUR_uc_psa+
REVu[i] *u_NOSUR_uc+
SUCC_REVu[i] *u_SUCC_REV_uc
}
#discounting utility UNC
for(i in 1:n_cycle){
psa_qaly_disc_uc[i] <- psa_qaly_uc[i]/(1+discount)^cycle_years[i]
}
psa_total_qaly_uc <- sum(psa_qaly_disc_uc)
psa_person_qaly_uc <- psa_total_qaly_uc/119672
res_qaly_uc[j] <- psa_person_qaly_uc
#utility calc for ONC
for(i in 1:n_cycle){
psa_qaly_oc[i] <- POP_fo2[i] *u_NOSUR_oc+
POP_mo2[i] *u_NOSUR_oc+
NOSURo2[i] *u_NOSUR_oc+
SUCC_NOSURo2[i] *u_SUCC_NOSUR_oc_psa+
del1_2[i] *u_SUCC_NOSUR_oc+
del2_2[i] *u_SUCC_NOSUR_oc+
SURo2[i] *u_NOSUR_oc+
SUCC_SURo2[i] *u_SUCC_SUR_oc_psa+
REVo2[i] *u_NOSUR_oc+
SUCC_REVo2[i] *u_SUCC_REV_oc
}
#discounting utility ONC
for(i in 1:n_cycle){
psa_qaly_disc_oc[i] <- psa_qaly_oc[i]/(1+discount)^cycle_years[i]
}
psa_total_qaly_oc <- sum(psa_qaly_disc_oc)
psa_person_qaly_oc <- psa_total_qaly_oc/119672
res_qaly_oc2[j] <- psa_person_qaly_oc
}
mean(res_qaly_oc2)
## [1] 17.04876
mean(res_cost_oc2)
## [1] 4405.482
psa2_delta_costs <- res_cost_oc2 - res_cost_uc
psa2_delta_qalys <- res_qaly_oc2 - res_qaly_uc
kable(per_person_table, digits = 2)
scenario | cost_person | qaly_person |
---|---|---|
base case UNC | 4465.22 | 16.92 |
base case ONC | 4805.83 | 17.07 |
2 year delay | 4451.21 | 17.06 |
5 year delay | 3963.80 | 17.03 |
Probabilistic sensitivity analysis with 1000 (10000 in manuscript) iterations on utility and cost values for the 5-year delay scenario"
#PSA TEST
## ----setup, include=FALSE----------------------------------------------------------------------------------------------------------
knitr::opts_chunk$set(echo = TRUE, cache = FALSE)
## ----include= TRUE, echo= TRUE, message= FALSE, warning= FALSE---------------------------------------------------------------------
# Beta distribution
estBetaParams <- function(mu, sd) {
var <- sd^2
alpha <- ((1 - mu) / var - 1 / mu) * mu ^ 2
beta <- alpha * (1 / mu - 1)
return(params = list(alpha = alpha, beta = beta))
}
#create beta distribution for utilities, for successfull nosur and sur
alpha_beta <- estBetaParams(u_SUCC_NOSUR_uc, u_SUCC_NOSUR_uc_sd)
dist_u_SUCC_NOSUR_uc <- rbeta(100000, alpha_beta$alpha, alpha_beta$beta)
alpha_beta <- estBetaParams(u_SUCC_NOSUR_oc, u_SUCC_NOSUR_oc_sd)
dist_u_SUCC_NOSUR_oc <- rbeta(100000, alpha_beta$alpha, alpha_beta$beta)
alpha_beta <- estBetaParams(u_SUCC_SUR_uc, u_SUCC_SUR_uc_sd)
dist_u_SUCC_SUR_uc <- rbeta(100000, alpha_beta$alpha, alpha_beta$beta)
alpha_beta <- estBetaParams(u_SUCC_SUR_oc, u_SUCC_SUR_oc_sd)
dist_u_SUCC_SUR_oc <- rbeta(100000, alpha_beta$alpha, alpha_beta$beta)
#create gamma distributions for costs
dist_c_NOSUR_oc <- rgamma(100000, (c_NOSUR_oc_sd/c_NOSUR_oc)^-2, scale = c_NOSUR_oc * (c_NOSUR_oc_sd/c_NOSUR_oc)^2)
dist_c_NOSUR_uc <- rgamma(100000, (c_NOSUR_uc_sd/c_NOSUR_uc)^-2, scale = c_NOSUR_uc * (c_NOSUR_uc_sd/c_NOSUR_uc)^2)
dist_c_SUR_oc <- rgamma(100000, (c_SUR_oc_sd/c_SUR_oc)^-2, scale = c_SUR_oc * (c_SUR_oc_sd/c_SUR_oc)^2)
dist_c_SUR_uc <- rgamma(100000, (c_SUR_uc_sd/c_SUR_uc)^-2, scale = c_SUR_uc * (c_SUR_uc_sd/c_SUR_uc)^2)
dist_c_REV_oc <- rgamma(100000, (c_REV_oc_sd/c_REV_oc)^-2, scale = c_REV_oc * (c_REV_oc_sd/c_REV_oc)^2)
dist_c_REV_uc <- rgamma(100000, (c_REV_uc_sd/c_REV_uc)^-2, scale = c_REV_uc * (c_REV_oc_sd/c_REV_uc)^2)
#create gamma distributions for probabilities healthy to non-surgical treatment
#prob_PREV_m$value <- 0.02 #annual incidence for individuals aged 20+
#prob_PREV_f$value <- 0.02
#prob_prev_m_se <- 0.00512
#prop_prev_f_se <- 0.00512
alpha_beta <- estBetaParams(0.02, 0.00510)
dist_p_prev_m <- rbeta(100000, alpha_beta$alpha, alpha_beta$beta)
dist_p_prev_f <- rbeta(100000, alpha_beta$alpha, alpha_beta$beta)
#define vectors for psa
psa_cost_disc_uc <- vector()
psa_cost_uc <- vector()
psa_cost_disc_oc <- vector()
psa_cost_oc <- vector()
psa_qaly_disc_oc <- vector()
psa_qaly_oc <- vector()
psa_qaly_disc_uc <- vector()
psa_qaly_uc <- vector()
res_cost_uc <- vector()
res_cost_oc5 <- vector()
res_qaly_uc <- vector()
res_qaly_oc5 <- vector()
discount <- 0.03
n_cycle <- 70
#run psa x times
for(j in 1:1000){
c_NOSUR_oc_psa <- sample(dist_c_NOSUR_oc,1)
c_NOSUR_uc_psa <- sample(dist_c_NOSUR_uc,1)
c_SUR_oc_psa <- sample(dist_c_SUR_oc,1)
c_SUR_uc_psa <- sample(dist_c_SUR_uc,1)
c_REV_oc_psa <- sample(dist_c_REV_oc,1)
c_REV_uc_psa <- sample(dist_c_REV_uc,1)
u_SUCC_NOSUR_oc_psa <- sample(dist_u_SUCC_NOSUR_oc,1)
u_SUCC_NOSUR_uc_psa <- sample(dist_u_SUCC_NOSUR_uc,1)
u_SUCC_SUR_oc_psa <- sample(dist_u_SUCC_SUR_oc,1)
u_SUCC_SUR_uc_psa <- sample(dist_u_SUCC_SUR_uc,1)
p_prev_m_psa <- sample(dist_p_prev_m,1)
p_prev_f_psa <- sample(dist_p_prev_f,1)
## RUN MODEL USUAL CARE
cycle <- 1:70
n_cycle <- length(cycle)
POP_fu <- c(n_female, rep(NA, n_cycle-1))
age = age_init
for(i in 1:(n_cycle-1)){
POP_fu[i+1] <- POP_fu[i] -
(POP_fu[i] * p_prev_f_psa) -
(POP_fu[i] * bfs_mort[bfs_mort$age == age,2])
age = age+1
}
POP_mu <- c(n_male, rep(NA, n_cycle-1))
age = age_init
for(i in 1:(n_cycle-1)){
POP_mu[i+1] <- POP_mu[i] -
(POP_mu[i] * p_prev_m_psa) -
(POP_mu[i] * bfs_mort[bfs_mort$age == age,2])
age = age+1
}
NOSURu <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
NOSURu[i+1] <- (POP_fu[i]*p_prev_f_psa) +
(POP_mu[i]*p_prev_m_psa) -
(NOSURu[i] *bfs_mort[bfs_mort$age == age, 2])
age = age+1
}
SUCC_NOSURu <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
SUCC_NOSURu[i+1] <- (SUCC_NOSURu[i] +NOSURu[i]) -
(SUCC_NOSURu[i]*prob_SUR_uc[prob_SUR_uc$age == age,2]) -
(SUCC_NOSURu[i]*bfs_mort[bfs_mort$age == age,2])
age = age+1
}
SURu <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
SURu[i+1] <- (SUCC_NOSURu[i]*prob_SUR_uc[prob_SUR_uc$age == age,2]) -
(SURu[i] *bfs_mort[bfs_mort$age == age, 2])
age = age+1
}
SUCC_SURu <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
SUCC_SURu[i+1] <- (SUCC_SURu[i] +SURu[i]) -
(SUCC_SURu[i]*prob_REV_uc[prob_REV_uc$age == age,2]) -
(SUCC_SURu[i]*bfs_mort[bfs_mort$age == age,2])
age = age+1
}
REVu <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
REVu[i+1] <- (SUCC_SURu[i]*prob_REV_uc[prob_REV_uc$age == age,2]) -
(REVu[i] *bfs_mort[bfs_mort$age == age, 2])
age = age+1
}
SUCC_REVu <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
SUCC_REVu[i+1] <- (SUCC_REVu[i] +REVu[i]) -
(SUCC_REVu[i]*bfs_mort[bfs_mort$age == age,2])
age=age+1
}
DEATHu <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
DEATHu[i+1] <- DEATHu[i] +
POP_fu[i] *bfs_mort[bfs_mort$age == age,2]+
POP_mu[i] *bfs_mort[bfs_mort$age == age,2]+
NOSURu[i] *bfs_mort[bfs_mort$age == age,2]+
SUCC_NOSURu[i] *bfs_mort[bfs_mort$age == age,2]+
SURu[i] *bfs_mort[bfs_mort$age == age,2]+
SUCC_SURu[i] *bfs_mort[bfs_mort$age == age,2]+
REVu[i] *bfs_mort[bfs_mort$age == age,2]+
SUCC_REVu[i] *bfs_mort[bfs_mort$age == age,2]
age=age+1
}
## RUN MODEL OPTIMIZED CARE 2 year delay
cycle <- 1:70
n_cycle <- length(cycle)
POP_fo5 <- c(n_female, rep(NA, n_cycle-1))
age = age_init
for(i in 1:(n_cycle-1)){
POP_fo5[i+1] <- POP_fo5[i] -
(POP_fo5[i] * p_prev_f_psa) -
(POP_fo5[i] * bfs_mort[bfs_mort$age == age,2])
age = age+1
}
POP_mo5 <- c(n_male, rep(NA, n_cycle-1))
age = age_init
for(i in 1:(n_cycle-1)){
POP_mo5[i+1] <- POP_mo5[i] -
(POP_mo5[i] * p_prev_m_psa) -
(POP_mo5[i] * bfs_mort[bfs_mort$age == age,2])
age = age+1
}
NOSURo5 <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
NOSURo5[i+1] <- (POP_fo5[i]*p_prev_f_psa) +
(POP_mo5[i]*p_prev_m_psa) -
(NOSURo5[i] *bfs_mort[bfs_mort$age == age, 2])
age = age+1
}
SUCC_NOSURo5 <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
SUCC_NOSURo5[i+1] <- (SUCC_NOSURo5[i] +NOSURo5[i])-
(SUCC_NOSURo5[i]*prob_SUR_oc[prob_SUR_oc$age == age,2])-
(SUCC_NOSURo5[i]*bfs_mort[bfs_mort$age == age,2])
age = age+1
}
del1_5 <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
del1_5[i+1] <- (SUCC_NOSURo5[i]*prob_SUR_oc[prob_SUR_oc$age == age,2]) -
(del1_5[i]*bfs_mort[bfs_mort$age == age,2])
age = age+1
}
del2_5 <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
del2_5[i+1] <- (del1_5[i]) -
(del2_5[i]*bfs_mort[bfs_mort$age == age,2])
age = age+1
}
del3_5 <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
del3_5[i+1] <- (del2_5[i]) -
(del3_5[i]*bfs_mort[bfs_mort$age == age,2])
age = age+1
}
del4_5 <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
del4_5[i+1] <- (del3_5[i]) -
(del4_5[i]*bfs_mort[bfs_mort$age == age,2])
age = age+1
}
del5_5 <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
del5_5[i+1] <- (del4_5[i]) -
(del5_5[i]*bfs_mort[bfs_mort$age == age,2])
age = age+1
}
SURo5 <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
SURo5[i+1] <- (del5_5[i]) -
(SURo5[i] *bfs_mort[bfs_mort$age == age, 2])
age = age+1
}
SUCC_SURo5 <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
SUCC_SURo5[i+1] <- (SUCC_SURo5[i] +SURo5[i]) -
(SUCC_SURo5[i]*prob_REV_oc[prob_REV_oc$age == age,2]) -
(SUCC_SURo5[i]*bfs_mort[bfs_mort$age == age,2])
age = age+1
}
REVo5 <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
REVo5[i+1] <- (SUCC_SURo5[i]*prob_REV_oc[prob_REV_oc$age == age,2]) -
(REVo5[i] *bfs_mort[bfs_mort$age == age, 2])
age = age+1
}
SUCC_REVo5 <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
SUCC_REVo5[i+1] <- (SUCC_REVo5[i] +REVo5[i]) -
(SUCC_REVo5[i]*bfs_mort[bfs_mort$age == age,2])
age=age+1
}
DEATHo5 <- c(0, rep(NA, n_cycle-1))
age=age_init
for(i in 1:(n_cycle-1)){
DEATHo5[i+1] <- DEATHo5[i] +
POP_fo5[i] *bfs_mort[bfs_mort$age == age,2]+
POP_mo5[i] *bfs_mort[bfs_mort$age == age,2]+
NOSURo5[i] *bfs_mort[bfs_mort$age == age,2]+
SUCC_NOSURo5[i] *bfs_mort[bfs_mort$age == age,2]+
del1_5[i] *bfs_mort[bfs_mort$age == age,2]+
del2_5[i] *bfs_mort[bfs_mort$age == age,2]+
del3_5[i] *bfs_mort[bfs_mort$age == age,2]+
del4_5[i] *bfs_mort[bfs_mort$age == age,2]+
del5_5[i] *bfs_mort[bfs_mort$age == age,2]+
SURo5[i] *bfs_mort[bfs_mort$age == age,2]+
SUCC_SURo5[i] *bfs_mort[bfs_mort$age == age,2]+
REVo5[i] *bfs_mort[bfs_mort$age == age,2]+
SUCC_REVo5[i] *bfs_mort[bfs_mort$age == age,2]
age=age+1
}
#cost calc for UNC
for(i in 1:n_cycle){
psa_cost_uc[i] <- NOSURu[i] *c_NOSUR_uc_psa+
SUCC_NOSURu[i] *c_SUCC_NOSUR_uc+
SURu[i] *c_SUR_uc_psa+
SUCC_SURu[i] *c_SUCC_SUR_uc+
REVu[i] *c_REV_uc_psa+
SUCC_REVu[i] *c_SUCC_REV_uc
}
#discouting costs UNC
for(i in 1:n_cycle){
psa_cost_disc_uc[i] <- psa_cost_uc[i]/(1+discount)^cycle_years[i]
}
psa_total_cost_uc <- sum(psa_cost_disc_uc)
psa_person_cost_uc <- psa_total_cost_uc/119672
res_cost_uc[j] <- psa_person_cost_uc
# cost calc for ONC
for(i in 1:n_cycle){
psa_cost_oc[i] <-
NOSURo5[i] *c_NOSUR_oc_psa+
SUCC_NOSURo5[i] *c_SUCC_NOSUR_oc+
del1_5[i] *c_SUCC_NOSUR_oc+
del2_5[i] *c_SUCC_NOSUR_oc+
del3_5[i] *c_SUCC_NOSUR_oc+
del4_5[i] *c_SUCC_NOSUR_oc+
del5_5[i] *c_SUCC_NOSUR_oc+
SURo5[i] *c_SUR_oc_psa+
SUCC_SURo5[i] *c_SUCC_SUR_oc+
REVo5[i] *c_REV_oc_psa+
SUCC_REVo5[i] *c_SUCC_REV_oc
}
#discounting costs ONC
for(i in 1:n_cycle){
psa_cost_disc_oc[i] <- psa_cost_oc[i]/(1+discount)^cycle_years[i]
}
psa_total_cost_oc <- sum(psa_cost_disc_oc)
psa_person_cost_oc <- psa_total_cost_oc/119672
res_cost_oc5[j] <- psa_person_cost_oc
#utility calc for UNC
for(i in 1:n_cycle){
psa_qaly_uc[i] <- POP_fu[i] *u_NOSUR_uc+
POP_mu[i] *u_NOSUR_uc+
NOSURu[i] *u_NOSUR_uc+
SUCC_NOSURu[i] *u_SUCC_NOSUR_uc_psa+
SURu[i] *u_NOSUR_uc+
SUCC_SURu[i] *u_SUCC_SUR_uc_psa+
REVu[i] *u_NOSUR_uc+
SUCC_REVu[i] *u_SUCC_REV_uc
}
#discounting utility UNC
for(i in 1:n_cycle){
psa_qaly_disc_uc[i] <- psa_qaly_uc[i]/(1+discount)^cycle_years[i]
}
psa_total_qaly_uc <- sum(psa_qaly_disc_uc)
psa_person_qaly_uc <- psa_total_qaly_uc/119672
res_qaly_uc[j] <- psa_person_qaly_uc
#utility calc for ONC
for(i in 1:n_cycle){
psa_qaly_oc[i] <- POP_fo5[i] *u_NOSUR_oc+
POP_mo5[i] *u_NOSUR_oc+
NOSURo5[i] *u_NOSUR_oc+
SUCC_NOSURo5[i] *u_SUCC_NOSUR_oc_psa+
del1_5[i] *u_SUCC_NOSUR_oc+
del2_5[i] *u_SUCC_NOSUR_oc+
del3_5[i] *u_SUCC_NOSUR_oc+
del4_5[i] *u_SUCC_NOSUR_oc+
del5_5[i] *u_SUCC_NOSUR_oc+
SURo5[i] *u_NOSUR_oc+
SUCC_SURo5[i] *u_SUCC_SUR_oc_psa+
REVo5[i] *u_NOSUR_oc+
SUCC_REVo5[i] *u_SUCC_REV_oc
}
#discounting utility ONC
for(i in 1:n_cycle){
psa_qaly_disc_oc[i] <- psa_qaly_oc[i]/(1+discount)^cycle_years[i]
}
psa_total_qaly_oc <- sum(psa_qaly_disc_oc)
psa_person_qaly_oc <- psa_total_qaly_oc/119672
res_qaly_oc5[j] <- psa_person_qaly_oc
}
mean(res_qaly_oc5)
## [1] 17.02416
mean(res_cost_oc5)
## [1] 3912.628
psa5_delta_costs <- res_cost_oc5 - res_cost_uc
psa5_delta_qalys <- res_qaly_oc5 - res_qaly_uc
kable(per_person_table, digits = 2)
scenario | cost_person | qaly_person |
---|---|---|
base case UNC | 4465.22 | 16.92 |
base case ONC | 4805.83 | 17.07 |
2 year delay | 4451.21 | 17.06 |
5 year delay | 3963.80 | 17.03 |
Calculating and plotting cost-effectiveness acceptability curve using PSA output
## ----setup, include=FALSE----------------------------------------------------------------------------------------------------------
knitr::opts_chunk$set(echo = TRUE, cache = FALSE)
## ----echo=TRUE, message=FALSE, warning=FALSE, include=TRUE-------------------------------------------------------------------------
wtp <- seq(0,100000,100)
ce_bc <- vector()
ce_2y <- vector()
ce_5y <- vector()
psa_icer_bc <- (res_cost_oc - res_cost_uc)/(res_qaly_oc - res_qaly_uc)
psa_e_diff_bc <- res_qaly_oc - res_qaly_uc
psa_c_diff_bc <- res_cost_oc - res_cost_uc
psa_icer_2y <- (res_cost_oc2 - res_cost_uc)/(res_qaly_oc2 - res_qaly_uc)
psa_e_diff_2y <- res_qaly_oc2 - res_qaly_uc
psa_c_diff_2y <- res_cost_oc2 - res_cost_uc
psa_icer_5y <- (res_cost_oc5 - res_cost_uc)/(res_qaly_oc5 - res_qaly_uc)
psa_e_diff_5y <- res_qaly_oc5 - res_qaly_uc
psa_c_diff_5y <- res_cost_oc5 - res_cost_uc
psa_icer_table <- data.frame(psa_icer_bc, psa_e_diff_bc,
psa_icer_2y, psa_e_diff_2y,
psa_icer_5y, psa_e_diff_5y)
## CAVE WURDE ANGEPASST AUF PSA, DESWEGEN /1000. AM SCHLUSS WIEDER AUF /10000
for(i in 1:1001){
ce_bc[i] <- sum(ifelse(psa_icer_bc<wtp[i] & psa_e_diff_bc >0, 1, 0))/10000
ce_2y[i] <- sum(ifelse(psa_icer_2y<wtp[i] & psa_e_diff_2y >0, 1, 0))/10000
ce_5y[i] <- sum(ifelse(psa_icer_5y<wtp[i] & psa_e_diff_5y >0, 1, 0))/10000
}
df <- data.frame(wtp_tres = c(wtp,wtp,wtp),
icer = c(ce_bc, ce_2y, ce_5y),
Scenario = c(rep("base case", length(ce_bc)),
rep("two-year delay", length(ce_2y)),
rep("five-year delay", length(ce_5y)))
)
df$Scenario <- factor(df$Scenario, levels = c("base case", "two-year delay", "five-year delay"))
ceac <- ggplot(df, aes(wtp_tres, icer, color = Scenario)) + geom_line(size = 1) +
labs(x = "Willingness to pay for one additional QALY", y = "Probability scenario is cost-effective \n compared to usual care")+
ylim(0, 1)+
xlim(0, 100000)+
theme_bw()
ceac
nw_bc <- sum(ifelse(psa_e_diff_bc<0 & psa_c_diff_bc > 0, 1, 0))/10000 #% of ICERs in NW
sw_bc <- sum(ifelse(psa_e_diff_bc<0 & psa_c_diff_bc < 0, 1, 0))/10000
se_bc <- sum(ifelse(psa_e_diff_bc>0 & psa_c_diff_bc < 0, 1, 0))/10000
ne_bc <- sum(ifelse(psa_e_diff_bc>0 & psa_c_diff_bc > 0, 1, 0))/10000
nw_2y <- sum(ifelse(psa_e_diff_2y<0 & psa_c_diff_2y > 0, 1, 0))/10000 #% of ICERs in NW
sw_2y <- sum(ifelse(psa_e_diff_2y<0 & psa_c_diff_2y < 0, 1, 0))/10000
se_2y <- sum(ifelse(psa_e_diff_2y>0 & psa_c_diff_2y < 0, 1, 0))/10000
ne_2y <- sum(ifelse(psa_e_diff_2y>0 & psa_c_diff_2y > 0, 1, 0))/10000
nw_5y <- sum(ifelse(psa_e_diff_5y<0 & psa_c_diff_5y > 0, 1, 0))/10000 #% of ICERs in NW
sw_5y <- sum(ifelse(psa_e_diff_5y<0 & psa_c_diff_5y < 0, 1, 0))/10000
se_5y <- sum(ifelse(psa_e_diff_5y>0 & psa_c_diff_5y < 0, 1, 0))/10000
ne_5y <- sum(ifelse(psa_e_diff_5y>0 & psa_c_diff_5y > 0, 1, 0))/10000
nw_bc + se_bc + sw_bc + ne_bc # Check if 1
## [1] 0.1
nw_2y + se_2y + sw_2y + ne_2y
## [1] 0.1
nw_5y + se_5y + sw_5y + ne_5y
## [1] 0.1
se_bc
## [1] 0.0174
ne_bc
## [1] 0.0609
se_2y
## [1] 0.0261
ne_2y
## [1] 0.048
se_5y
## [1] 0.0798
ne_5y
## [1] 0
Plots used for publication
## ----setup, include=FALSE----------------------------------------------------------------------------------------
knitr::opts_chunk$set(echo = TRUE, cache = FALSE)
## ----fig.cap= "counts per state for base case scenario", fig.align='center', fig.height=6, fig.width=8, message= FALSE, warning= FALSE------------------
model_base <- data.frame( n= c(SUCC_NOSURu, SUCC_SURu, SUCC_REVu, POP_fu, POP_mu, DEATHu),
cycle = 1:n_cycle,
State = c(rep("SUCC_NOSUR", length(SUCC_NOSURu)),
rep("SUCC_SUR", length(SUCC_SURu)),
rep("SUCC_REV", length(SUCC_REVu)),
rep("POP_fu", length(POP_fu)),
rep("POP_mu", length(POP_mu)),
rep("DEATH", length(DEATHu))
))
plot_base <- ggplot(model_base, aes(x=cycle , y= n, color = State)) +
geom_line(size =1) +
ylim(0, 120000)+
ylab("count") +
# ggtitle("counts per state for base case Scenario")+
theme_bw()
plot_base
## ----fig.cap= "counts per state for base case scenario", fig.align='center', fig.height=6, fig.width=8, message= FALSE, warning= FALSE------------------
model_base_nodeath <- data.frame( n= c(SUCC_NOSURu, SUCC_SURu, SUCC_REVu),
cycle = 1:n_cycle,
State = c(rep("SUCC_NOSUR", length(SUCC_NOSURu)),
rep("SUCC_SUR", length(SUCC_SURu)),
rep("SUCC_REV", length(SUCC_REVu))
))
plot_base_nodeath <- ggplot(model_base_nodeath, aes(x=cycle , y= n, color = State)) +
geom_line(size =1) +
ylim(0, 40000)+
ylab("count") +
# ggtitle("counts per state for base case Scenario")+
theme_bw()
plot_base_nodeath
## ----fig.cap= "", fig.align='center', fig.height=6, fig.width=8, message= FALSE, warning= FALSE------------------
comp_SUR <- data.frame(n= c(SUCC_SURu, SUCC_SURo2, SUCC_SURo5),
cycle = 1:n_cycle,
Scenario = c(rep("base case", length(SUCC_SURu)),
rep("two-year delay", length(SUCC_SURo2)),
rep("five-year delay", length(SUCC_SURo5))
))
plot_comp_SUR <- ggplot(comp_SUR, aes(x=cycle , y= n, color = Scenario)) +
geom_line(size =1) +
ylim(0, 30000)+
ylab("count") +
ggtitle("TKR")+
theme_bw()
plot_comp_SUR
count_sur <- data.frame(Scenario = c("base case", "two-year delay", "five-year delay"),
number = c(sum(SURu),sum(SURo2),sum(SURo5)),
change = c((sum(SURu)/sum(SURu)-1), (sum(SURo2)/sum(SURu)-1), (sum(SURo5)/sum(SURu)-1))
)
kable(count_sur, digits = 2)
Scenario | number | change |
---|---|---|
base case | 34275.41 | 0.00 |
two-year delay | 35887.02 | 0.05 |
five-year delay | 28932.45 | -0.16 |
## ----fig.cap= "", fig.align='center', fig.height=6, fig.width=8, message= FALSE, warning= FALSE------------------
comp_REV <- data.frame(n= c(SUCC_REVu, SUCC_REVo2, SUCC_REVo5),
cycle = 1:n_cycle,
Scenario = c(rep("base case", length(SUCC_REVu)),
rep("two-year delay", length(SUCC_REVo2)),
rep("five-year delay", length(SUCC_REVo5))
))
comp_REV$Scenario <- factor(comp_REV$Scenario, levels = c("base case", "two-year delay", "five-year delay"))
plot_comp_REV <- ggplot(comp_REV, aes(x=cycle , y= n, color = Scenario)) +
geom_line(size =1) +
ylim(0, 2500)+
ylab("Revision Surgery") +
xlab("Model Cycle")+
#ggtitle("Revisons")+
theme_bw()
plot_comp_REV
count_rev <- data.frame(Scenario = c("base case", "two-year delay", "five-year delay"),
number = c(sum(REVu),sum(REVo2),sum(REVo5)),
change = c((sum(REVu)/sum(REVu)-1), (sum(REVo2)/sum(REVu)-1), (sum(REVo5)/sum(REVu)-1))
)
kable(count_rev, digits = 2)
Scenario | number | change |
---|---|---|
base case | 2816.59 | 0.00 |
two-year delay | 2672.45 | -0.05 |
five-year delay | 1813.05 | -0.36 |
## ----fig.cap= "Model Outputs", fig.align='center', fig.height=8, fig.width=10, message= FALSE, warning= FALSE----
cepanel <- ggplot(icer_table, aes(x=qaly_delta , y= cost_delta, color = scenario)) +
geom_point(size =2) +
ylim(-2000, 2000)+
ylab("Incremental Cost (CHF)") +
xlim(-1.0,1.0)+
xlab("Incremental QALY") +
# ggtitle("ICER")+
geom_hline(yintercept=0)+
geom_vline(xintercept = 0)+
theme_bw()
cepanel
## ----include= TRUE, echo= TRUE, message= FALSE, warning= FALSE---------------------------------------------------
# calculate delta costs and delta qalys - plot results
# psabc_delta_costs <- res_cost_oc - res_cost_uc
# psabc_delta_qalys <- res_qaly_oc - res_qaly_uc
# psa2_delta_costs <- res_cost_oc2 - res_cost_uc
# psa2_delta_qalys <- res_qaly_oc2 - res_qaly_uc
# psa5_delta_costs <- res_cost_oc5 - res_cost_uc
# psa5_delta_qalys <- res_qaly_oc5 - res_qaly_uc
psa_table <- data.frame(qaly_delta = c(psabc_delta_qalys, psa2_delta_qalys, psa5_delta_qalys),
cost_delta = c(psabc_delta_costs, psa2_delta_costs, psa5_delta_costs),
icer = c(round(psabc_delta_costs/psabc_delta_qalys,0),
round(psa2_delta_costs/psa2_delta_qalys,0),
round(psa5_delta_costs/psa5_delta_qalys,0)),
Scenario = c(rep("base case", length(psabc_delta_costs)),
rep("two-year delay", length(psabc_delta_costs)),
rep("five-year delay", length(psabc_delta_costs))
))
#amount of ICER in upper east quadrant and the lower east quadrant, therefore dominating the basecase
psa_ue <- subset(psa_table, qaly_delta > 0)
#calculate how many of the psa ICERS are in dominant
nrow(subset(psa_ue, Scenario == "base case")) / nrow(subset(psa_table, Scenario == "base case"))*100
## [1] 86.5
nrow(subset(psa_ue, Scenario == "two-year delay")) / nrow(subset(psa_table, Scenario =="two-year delay"))*100
## [1] 82.8
nrow(subset(psa_ue, Scenario == "five-year delay")) / nrow(subset(psa_table, Scenario =="five-year delay"))*100
## [1] 79.8
psa_table$Scenario <- factor(psa_table$Scenario, levels = c("base case", "two-year delay", "five-year delay"))
psapanel <- ggplot(psa_table, aes(x=qaly_delta , y= cost_delta, color= Scenario) ) +
geom_point(size =0.2) +
geom_point(aes(x= delta_qalys_base, y= delta_costs_base), color = "red")+
geom_point(aes(x= delta_qalys_scen5, y= delta_costs_scen5), color = "blue")+
geom_point(aes(x= delta_qalys_scen2, y= delta_costs_scen2), color = "green")+
ylim(-1000, 1000)+
ylab("Incremental Cost (CHF)") +
xlim(-1,1)+
xlab("Incremental QALY") +
#ggtitle("ICER PSA")+
geom_hline(yintercept=0)+
geom_vline(xintercept = 0)+
guides(colour = guide_legend(override.aes = list(size=2)))+
# geom_mark_ellipse(expand = 0,aes(fill=icer ), color = "black", show.legend = FALSE, tol = 2)+
# annotate("text", x=0.7, y=1800, label= paste(psa_in_ue , "% in ue quadrant"))+
theme_bw()
psapanel
#stacked bar plot for cost overview
data_stack <- read.csv("C:/Users/schwa/OneDrive/99_REVISION/revision/bar_chart.csv", header = TRUE, sep = ";", check.names = FALSE)
data_stack$scenario <- factor(data_stack$scenario, # Change ordering manually
levels = c("CMOC", "OMOC base case", "OMOC two-year delay", "OMOC five-year delay"))
data_stack$state <- factor(data_stack$state,
levels = c("Non-surgical treatment", "Successful non-surgical", "TKR surgery", "Successful TKR", "Revision surgery", "Successful revision"))
stack_plot <- ggplot(data_stack, aes(fill=state, y=value, x=scenario)) +
geom_bar(position="stack", stat="identity")+
ylab("per-person cost [CHF]")+
xlab("model of care")+
scale_fill_brewer(palette="Spectral")+
theme_bw()
stack_plot
ggsave(plot = stack_plot, filename = "C:/Users/schwa/OneDrive/99_REVISION/revision/cost_by_state_compr.tiff", width = 10, height = 6, compression = "lzw" )
#plot ceac curve
# ceac
#save all plots
# setwd("C:/Users/schwa/Desktop/Revision/SMW/revision")
#
ggsave(plot = psapanel, filename = "C:/Users/schwa/OneDrive/99_REVISION/revision/psa_28122022.tiff", width = 6, height = 4 )
ggsave(plot = ceac, filename = "C:/Users/schwa/OneDrive/99_REVISION/revision/ceac_28122022.tiff", width = 6, height = 4 )
# ggsave(plot = cepanel, filename = "cepanel.tiff", width = 6, height = 4 )
# ggsave(plot = plot_base, filename = "plot_base.tiff", width = 6, height = 4 )
# ggsave(plot = plot_comp_SUR, filename = "plot_comp_SUR.tiff", width = 6, height = 4 )
ggsave(plot = plot_comp_REV, filename = "C:/Users/schwa/Desktop/markov_ONC_02122022/markov_ONC/plot_comp_REV_new.tiff", width = 6, height = 4 )
# ggsave(plot = plot_base_nodeath, filename = "counts_ppp.tiff", width = 6, height = 4 )
#
# ggsave(plot = psapanel, filename = "psapanel.jpeg", width = 6, height = 4 )
# ggsave(plot = ceac, filename = "ceac.jpeg", width = 6, height = 4 )
# ggsave(plot = cepanel, filename = "cepanel.jpeg", width = 6, height = 4 )
# ggsave(plot = plot_base, filename = "plot_base.jpeg", width = 6, height = 4 )
# ggsave(plot = plot_comp_SUR, filename = "plot_comp_SUR.jpeg", width = 6, height = 4 )
# ggsave(plot = plot_comp_REV, filename = "plot_comp_REV.jpeg", width = 6, height = 4 )
# ggsave(plot = plot_base_nodeath, filename = "counts_ppp.jpeg", width = 6, height = 4 )