Effectiveness and efficiency of immunisation strategies to prevent RSV among infants and older adults in Germany: a modelling study
Fabienne Krauer1, Felix Guenther2, Marina Treskova-Schwarzbach2, Viktoria Schoenfeld2, Mihaly Koltai1, Mark Jit1, David Hodgson1, Udo Schneider3, Ole Wichmann2, Thomas Harder2, Frank G. Sandmann2, Stefan Flasche1,4
1 London School of Hygiene & Tropical Medicine
2 Robert Koch Institute
3 Techniker Krankenkasse
4 Centre for Global Health, Charite – Universitaetsmedizin Berlin
This study is currently published as a preprint on Medrxiv. You are free to use and adapt this model provided you cite the publication and this repository according to scientific citation standards.
Background
Recently, several novel RSV immunisation products that protect infants and older adults against RSV disease have been licensed in Europe. We estimated the effectiveness and efficiency of introducing these RSV immunisation strategies in Germany.
Methods
We used a Bayesian framework to fit an age-structured dynamic transmission model of RSV to sentinel surveillance and RSV-specific hospitalisation data in Germany from 2015-2019. The calibrated model was used to evaluate different RSV intervention strategies over five years: long-acting, single-dose monoclonal antibodies (mAbs) in high-risk infants aged 1-5 months; long-acting mAbs in all infants aged 1-5 months; seasonal vaccination of pregnant women and one-time seasonal vaccination of older adults (75+/65+/55+ years). We performed sensitivity analysis on vaccine uptake, seasonal vs. year-round maternal vaccination, and the effect of under-ascertainment for older adults.
Results
The model was able to match the various RSV datasets. Replacing the current short-acting mAB for high-risk infants with long-acting mAbs prevented 1.1% of RSV-specific hospitalisations in infants per year at the same uptake. Expanding the long-acting mAB programme to all infants prevented 39.3% of infant hospitalisations per year. Maternal vaccination required a larger number to be immunised to prevent one additional hospitalisation than a long-acting mAB for the same uptake. Vaccination of adults older than 75 years at an uptake of 40% in addition to Nirsevimab in all infants prevented an additional 4.5% of all RSV-hospitalisations over five years, with substantial uncertainty in the correction for under-ascertainment of the RSV burden.
Conclusions
Immunisation has the potential to reduce the RSV disease burden in Germany.
The main model code is written in Julia and fitted with Turing. You can download Julia here.
This repository contains all Julia and R code for this analysis as well as the input data and the final posterior samples (chains). The scripts, which you can run from the console are:
script name | description |
---|---|
scripts/fit.jl | fits the model to the RSV data. Produces a date-time-stamped directory for each seed with the chain object, an arguments object, the initial thetas and the model object |
scripts/visualize.jl | to quickly visualize the results of the selected fit(s). Produces a PDF file |
scripts/postprocessing.jl | simulates the posterior predictive of the selected fit(s). Produces several csv files and figures |
scripts/vaccsim.jl | simulates the theoretical disease dynamics under different vaccination scenarios, based on the posteriors from the selected fit(s). Produces a csv file |
The repo also contains a src
directory with several functions, which are all sourced when the project is compiled:
| src/models.jl | Contains the turingmodel |
| src/differential_equations/ | Contains the ODE models for the fitting and the vaccination simulation |
To get started with this project, clone the Github repository into your local directory. You then need to instantiate the project, which downloads all the necessary packages with the correct version numbers. This only has to be done before the first use.
Open a Julia console and do:
julia> using Pkg
julia> Pkg.add("DrWatson") # install globally, for using `quickactivate`
julia> Pkg.activate("path/to/this/project")
julia> Pkg.instantiate()
The structure and workflow of the code is as follows:
- Initial data cleaning and reshaping. This is done with the R files 1-3.
- Fitting of the model to the different datasets. This is done with
fit.jl
. This scripts takes several arguments: seed is any seed no. you prefer. initialize samples from the prior for the initial draw. verbose returns more detailed information of what the script is doing at any time, we recommend to turn it on. The fitting script stores the model, the trace, the arguments and the state after adaptation in a date-time stamped folder within theoutput
directory. To reproduce our results use the seeds 1-4 and the following commands: (replace "seed" with the individual seed you choose). If you are using VSCode, you can run several instances of Julia in separate terminals to run the scripts in parallel. Keep an eye on CPU and memoary usage though. Depending on your computer and the seed, a fit takes about 48 hours to complete. There is currently no option for multithreading.
julia --project scripts/fit.jl seed --initialize --verbose
If you receive an error, you can print the error message to a log file using
julia --project scripts/fit.jl seed --initialize --verbose 2>&1 > log.log
- Diagnostics/visualization. To inspect the trace plots and the marginal posterior distributions as well as the fit to the data sets, do
julia --project scripts/visualize.jl --verbose --prefix=prefix --ignore-commit
where prefix is the date or date-time prefix of the posterior directories you want to include in the diagnostics. To reproduce our results, use -prefix=20-8-2023_8
. You can also type out the individual directory names serially instead of using the prefix:
julia --project scripts/visualize.jl --verbose output/20-8-2023_8-40-8-909 output/20-8-2023_8-40-3-073 --ignore-commit
- Postprocessing. To generate the posterior predictive of the fit and resulting figures, do:
julia --project scripts/postprocessing.jl --verbose --prefix=prefix --ignore-commit
To reproduce our results, use the prefix as in point 3.
- Vaccination strategies.
To simulate the main vaccination strategies, do:
julia --project scripts/vaccsim.jl --prefix=prefix --ignore-commit --verbose
To simulate the sensitivity vaccination strategies, do:
julia --project scripts/vaccsim.jl --prefix=prefix --ignore-commit --verbose --sensitivity --comparator ="0" --strategies="[1, 2, 3, 4, 5, 6, 7, 8]"