This tutorial has been developed by Joke Bilcke and Lander Willem, for illustration and teaching purposes only. Please make contact if you would like to use this model in any public way. For further information, questions or comments please contact: joke.bilcke@uantwerp.be or lander.willem@uantwerp.be from the Centre for Health Economics Research and Modeling of Infectious Diseases (CHERMID), Vaccine and Infectious Disease Institute (Vaxinfectio), University of Antwerp, Universiteitsplein 1, 2610 Antwerp, Belgium.
In this session, we delve into a critical question: Is vaccinating the elderly against Respiratory Syncytial Virus (RSV) a cost-effective strategy when compared to not vaccinating them? RSV is known to cause lower respiratory tract infections in infants, the elderly, and individuals with underlying health conditions.
Amidst the backdrop of numerous emerging interventions aimed at preventing RSV, our focus today is to conduct a comprehensive evaluation of the cost-effectiveness of implementing a vaccination program for the elderly. To achieve this, we will employ both static and dynamic disease transmission models, allowing us to gain valuable insights into the potential impact of vaccination strategies.
While the ICER serves as a crucial measure of cost-effectiveness, we’ll also encourage you to extend your analysis further. Consider calculating the Incremental Net Monetary Benefit (INMB) and the Net Loss (NL) associated with the vaccination program. This broader perspective will enhance your grasp of the economic implications and provide a more comprehensive view of the intervention’s impact.
As we delve into the topic, we encourage you to explore various scenarios by manipulating input parameters. By doing so, you can gain a nuanced understanding of how altering these factors influences the cost-effectiveness outcome measures. This hands-on exploration will empower you to learn about the sensitivity of our analysis to various input parameters and its implications for decision-making.
The first step when creating a new R file is to specify a working
directory. You need to tell the R session where you want it to work. To
do this you use the command to “set the working directory” or
setwd()
.
You can label this working directory as ‘home’, and have other locations stored for plotting or for getting data. This location should be an existing folder on your computer. For example
The disease incidence and economic parameters are loosely based on the work of Zeevat et al (2022), published in the Journal of Infectious Diseases.
# population and disease input
population_size = 4557901 # NL population +60
rsv_incidence = 0.03525 # new infections per year, in the absence of vaccination
rsv_recovery_time = 7 # days
# health economic input
cost_per_episode = 122 # euro
morbidity_per_episode = 0.002196 # QALY loss
proportion_mortality = 0.006 # assume age-invariant
average_life_expectancy = 9 # years
# vaccine characteristics
vaccine_efficacy = 0.60
cost_per_dose = 10 # euro
admin_cost = 50 # euro
# program settings
uptake = 0.2 # proportion of the population
time_horizon = 365 # days
Based on the input above, we can compute the program cost and the proportion of the population that will be effectively protected:
We commence by delving into the static disease model. The following code delineates the model’s intrinsic parameters and conducts ICER computation. The outcomes revolve around the baseline disease impact, portraying anticipated infections in the absence of a vaccination program. Moreover, we explore averted infections in the case of a vaccination program, subsequently estimating the associated QALY improvement. This culmination leads us to one of the measures of cost-effectiveness: the ICER.
# TRANSLATE TO STATIC MODEL SETTING
force_of_infection = rsv_incidence
# INFECTIONS (prevented)
reference_infections = population_size * force_of_infection
program_infections = population_size * (1 - proportion_protected) * force_of_infection
prevented_cases = reference_infections - program_infections
# COSTS AND EFFECTS
static_incr_cost = program_costs - (prevented_cases * cost_per_episode)
static_qaly_gain = prevented_cases * qaly_loss_per_episode
# INCREMENTAL COST EFFECTIVENESS RATIO
static_icer = static_incr_cost / static_qaly_gain
# PRINT RESULTS
round(c(reference_infections = reference_infections,
program_infections = program_infections,
static_qaly_gain = static_qaly_gain,
static_icer = static_icer),digits=2)
## reference_infections program_infections static_qaly_gain
## 160666.01 141386.09 1083.45
## static_icer
## 48310.90
Moving forward, our exploration advances to encompass the dynamic transmission model, while adhering to the identical model parameters and fundamental disease attributes as established in the static model.
For this example, we utilize the EpiDynamics package, which features an array of built-in functions tailored for such analyses. A noteworthy example is the incorporation of the ‘SIR’ function, adeptly employed for quantifying the disease burden. Through this approach, we effectively calculate the disease’s impact while considering distinct initial conditions and transmission parameters:
# check if the "EpiDynamics" package is installed, if not, install package
if(!'EpiDynamics' %in% installed.packages()){ install.packages('EpiDynamics') }
# load library
library(EpiDynamics)
# Parameters and initial conditions.
parameters = list(beta = 5.147, gamma = 1 / rsv_recovery_time)
initials = c(S = 1 - 1e-06 - 0.2, I = 1e-06, R = 0.2)
# Solve and plot.
sir = SIR(pars = parameters, init = initials, time = 0:time_horizon)
# Plot output
PlotMods(sir)
To ascertain the quantity of infections, we can deduce this by evaluating the alteration in the “Recovered” compartment:
## [1] 0.8
In order to achieve the desired RSV incidence for this Cost-Effectiveness Analysis, we can posit a considerable existing level of immunity within the population:
# set initial immunity levels
initials['R'] = 0.95099
initials['S'] = 1 - sum(initials['I']+initials['R'])
# Solve
dynamic_rsv_reference = SIR(pars = parameters,init = initials,time = 0:time_horizon)
# calculate total infections
dynamic_cases_reference = diff(dynamic_rsv_reference$results$R[c(1,nrow(dynamic_rsv_reference$results))]) * population_size
dynamic_cases_reference # print to terminal
## [1] 160638.9
To incorporate vaccination within the model, we can conceptualize the adoption of the vaccine as a transition from the “Susceptible” to the “Recovered” compartment:
initials['S'] = initials['S'] * (1-proportion_protected)
initials['R'] = 1 - sum(initials['S']+initials['I'])
# Solve
dynamic_rsv = SIR(pars = parameters,init = initials,0:time_horizon)
#PlotMods(dynamic_rsv)
dynamic_cases_program = diff(dynamic_rsv$results$R[c(1,nrow(dynamic_rsv$results))]) * population_size
# prevented cases
dynamic_cases_prevented = dynamic_cases_reference - dynamic_cases_program
# CEA
dynamic_incr_cost = program_costs - (dynamic_cases_prevented * cost_per_episode)
dynamic_qaly_gain = dynamic_cases_prevented * qaly_loss_per_episode
# ICER
dynamic_icer = dynamic_incr_cost / dynamic_qaly_gain
# PRINT RESULTS
round(c(dynamic_cases_reference=dynamic_cases_reference,
dynamic_cases_program=dynamic_cases_program,
dynamic_qaly_gain=dynamic_qaly_gain,
dynamic_icer=dynamic_icer),digits=2)
## dynamic_cases_reference dynamic_cases_program dynamic_qaly_gain
## 160638.94 121111.63 2221.28
## dynamic_icer
## 22452.17
Inspection of the disease prevalence:
Inspect the cost-effectiveness plane:
plot(x = c(static_qaly_gain,dynamic_qaly_gain),
y = c(static_incr_cost,dynamic_incr_cost),
col = 1:2,
xlab= 'QALY gain',
ylab = 'incremental cost (euro)',
pch=16)
legend('topright',
c('static model',
'dynamic model'),
fill = 1:2,
)
model | reference_infections | program_infections | qaly_gain | incr_cost | program_icer | infections_reduction |
---|---|---|---|---|---|---|
static | 160666 | 141386 | 1083 | 52342662 | 48311 | 0.12 |
dynamic | 160639 | 121112 | 2221 | 49872480 | 22452 | 0.25 |
Compute the Incremental Net Monetary Benefit for the RSV illustration provided, while adhering to willingness-to-pay thresholds of 20,000 and 40,0000 euro per Quality-Adjusted Life Year (QALY).
Impact of Vaccine Uptake: Evaluate the effect of altering vaccine uptake to 0.1, 0.2, 0.7 or 0.9 on ICERs and INMB.
Consistency Across Models: Examine whether changes in vaccine uptake lead to similar outcomes in both disease models. Provide an explanation for the observed results.
Combining Vaccines: Investigate the consequences of combining RSV and Influenza vaccine uptake on ICERs. Consider the influence of admission costs in your analysis.
Matching Static and Dynamic Models: Identify the parameter settings within the dynamic model that would yield results consistent with the static model. Discuss the significance of these settings.
The Role of Discounting: Reflect on the decision not to incorporate discounting. Offer your recommendation on whether discounting should be added and provide a rationale.
The Role of Uncertainty:
Reflect on the decision when
rgamma(100, shape=(122/70)^2, rate = 122/70^2))
rnorm(100,vaccine_efficacy,0.1)
.Try to reproduce the figure below for 100 samples: