Learn R Programming

Infectious disease model library and utilities

Explore a range of infectious disease models in a consistent framework. The primary aim of idmodelr is to provide a library of infectious disease models for researchers, students, and other interested individuals. These models can be used to understand the underlying dynamics and as a reference point when developing models for research. idmodelr also provides a range of utilities. These include: plotting functionality; a simulation wrapper; scenario analysis tooling; an interactive dashboard; tools for handling mult-dimensional models; and both model and parameter look up tables. Unlike other modelling packages such as pomp, libbi and EpiModel, idmodelr serves primarily as an educational resource. It is most comparable to epirecipes but provides a more consistent framework, an R based workflow, and additional utility tooling. After users have explored model dynamics with idmodelr they may then implement their model using one of these packages in order to utilise the model fitting tools they provide. For newer modellers, this package reduces the barrier to entry by containing multiple infectious disease models, providing a consistent framework for simulation and visualisation, and signposting towards other, more research, focussed resources.

Installation

Install the CRAN version:

install.packages("idmodelr")

Alternatively install the development version from GitHub:

# install.packages("devtools")
devtools::install_github("seabbs/idmodelr")

Documentation

Testing

Quick start

In this quick start guide we are going to be defining, simulating and plotting a Susceptible-Infected-Recovered deterministic compartmental model with simple population demographics (births = deaths). The first step is to load the idmodelr package.

library(idmodelr)

The next step is to find the model of interest amongst those implemented in idmodelr. model_details lists all of the models implemented in idmodelr and can be search using dplyr, base R, or other dataframe tools.

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union

model_details %>% 
  dplyr::filter(model_family %in% "SIR") %>% 
  knitr::kable()
modelmodel_familytimetyperecoveredexposedtreatedsusceptiblerisk_stratifiednon_exponentialsimple_demographicsvaccinationdisease_examplelanguageparameters
SIR_odeSIRcontinuousdeterministicnonononononononononeRbeta, tau
SIR_demographics_odeSIRcontinuousdeterministicnonononononoyesnononeRbeta, tau , mu
SIR_vaccination_odeSIRcontinuousdeterministicnononononononoyesnoneRbeta , tau , lambda
SIR_vaccination_demographics_odeSIRcontinuousdeterministicnonononononoyesyesnoneRbeta , tau , lambda, alpha , mu

Now look at the model and the model help file (?SIR_demographics_ode) to get an understanding of how the model is constructed.

SIR_demographics_ode
#> function (t, x, params) 
#> {
#>     S <- x[1]
#>     I <- x[2]
#>     R <- x[3]
#>     with(as.list(params), {
#>         N = S + I + R
#>         dS = -beta * S * I/N - mu * S + mu * N
#>         dI = beta * S * I/N - tau * I - mu * I
#>         dR = tau * I - mu * R
#>         derivatives <- c(dS, dI, dR)
#>         list(derivatives)
#>     })
#> }
#> <bytecode: 0x7fb5c4a7da08>
#> <environment: namespace:idmodelr>

Check the parameters required by the model using required_parameters. This returns a table containing all the parameters that must be defined in order to use the model as well as descriptive information for each parameter.

parameters <- required_parameters("SIR_demographics_ode")

knitr::kable(parameters)
parameterparameter_familydescriptiontyperisk_stratifiednon_exponential
betatransmissionTransmission rate = the transmission probability per contact * the number of contacts each individual has.ratenono
taurecoveryRecovery rate. The reciprocal of the time infectious.ratenono
mudemographicsThe natural mortality rate. The reciprocal of the average lifespan. (for simple demographics this is also the birth rate.ratenono

Parameterise the model.

parameters <- data.frame(
  beta = 3, ##Transmission rate = contact rate * transmission probablity
  tau = 0.5, ## Rate recovcery = 1 / duration of infection
  mu = 1/81 ## Natural birth/death rate = 1 / average lifespan
)

Check the initial conditions required by looking at the start of the model function. In most cases this should match up to the model name (i.e S, I and R for an SIR model) but risk stratification etc. will require additional compartments.

inits <- data.frame(
  S = 999,
  I = 1,
  R = 0
  )

Specify the timespan over which to run the model.

times <- seq(0, 50, 0.1)

Simulate the model.

traj <- simulate_model(model = SIR_demographics_ode,
                       sim_fn = solve_ode, ##as solving an ode
                       inits = inits,
                       params = parameters,
                       times = times)


traj
#> # A tibble: 501 × 4
#>     time     S     I      R
#>    <dbl> <dbl> <dbl>  <dbl>
#>  1   0    999   1    0     
#>  2   0.1  999.  1.28 0.0567
#>  3   0.2  998.  1.64 0.129 
#>  4   0.3  998.  2.11 0.222 
#>  5   0.4  997.  2.70 0.342 
#>  6   0.5  996.  3.46 0.494 
#>  7   0.6  995.  4.43 0.690 
#>  8   0.7  993.  5.67 0.940 
#>  9   0.8  991.  7.25 1.26  
#> 10   0.9  989.  9.28 1.67  
#> # … with 491 more rows
#> # ℹ Use `print(n = ...)` to see more rows

Summarise the model.

summarise_model(traj) %>% 
  knitr::kable()
Final size: SFinal size: IFinal size: REpidemic peak timeEpidemic peakEpidemic duration
136318333.5533Inf

Plot the model trajectory.

plot_model(traj, facet = FALSE)
#> Warning: `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> =
#> "none")` instead.

Vary the model parameters, by increasing the mortality rate, and then simulate the updated model.

parameters_up <- parameters
parameters_up[["mu"]] <- 1 / 20


traj_up <- simulate_model(model = SIR_demographics_ode,
                          sim_fn = solve_ode,
                          inits, 
                          parameters_up,
                          times)

Plot the original trajectory and the updated trajectory. What has the impact of increasing mortality been?

plot_model(traj, traj_up, facet = TRUE)
#> Warning: `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> =
#> "none")` instead.

See the package vignettes for more help getting started and some additional ideas for exploring infectious disease model dynamics.

Dashboard

A shiny application has been developed that showcases some of the functionality of the idmodelr package. This application allows the parameter spaces of a range of models built into idmodelr to be explored in an interactive session. It is designed to be used as a teaching aid when introducing people to the concepts behind infectious disease models without requiring them to interact with the underlying code. The code for the dashboard can be found here. It can be run locally using the following (Note: this will install required packages to your system),

#install.packages("shiny")
shiny::runGitHub("exploreidmodels", "seabbs")

Contributing

Contributing a model

Additional models are extremely welcome!

To add models in the same family as those already implemented (i.e SIR_ode) please follow the implemented coding style closely (alternatively open an issue explaining why this style needs updating). Models should be named using their compartments in capitals followed by lower case model details, and finally the model type. An example of this is the SIR_demographics_ode model. For highly complex models only the most major model details should be listed (aim for less than 40 characters). An entry for model_details is also required (see model_details.R). If new parameters have been used then a description must be added to parameter_details (see parameter_details.R). Please consider also adding to the testing suite for your new model (or flagging the lack of tests). Models can either be added via a pull request or via an issue.

To add a new family of models (i.e stochastic models) please open an issue outlining your proposed approach. A new family of models is likely to require at least its own solve_ (equivalent to solve_ode) function and may also require other package changes. Models implemented in other languages (i.e C) are also very welcome.

Other contributions

File an issue here if there is any other feature, that you think is missing from the package, or better yet submit a pull request!

Please note that the idmodelr project is released with a Contributor Code of Conduct. By contributing to this project, you agree to abide by its terms.

Docker

This packge was developed in a docker container based on the tidyverse docker image. To run the docker image run:

docker run -d -p 8787:8787 --name idmodelr -e USER=seabbs -e PASSWORD=seabbs seabbs/idmodelr

The rstudio client can be found on port :8787 at your local machines ip. The default username:password is seabbs:seabbs, set the user with -e USER=username, and the password with - e PASSWORD=newpasswordhere. The default is to save the analysis files into the user directory. Alternatively, access the development environment via binder.

Copy Link

Version

Install

install.packages('idmodelr')

Monthly Downloads

31

Version

0.4.0

License

GPL-3

Issues

Pull Requests

Stars

Forks

Maintainer

Sam Abbott

Last Published

September 2nd, 2022

Functions in idmodelr (0.4.0)

SHLITR_demographics_ode

Susceptible-High-risk-latent-Low-risk-latent-Infected-Treated-Recovered Model with Simple Demographics
SHLITR_ode

Susceptible-High-risk-latent-Low-risk-latent-Infected-Treated-Recovered Model
SIRS_demographics_ode

Susceptible-Infected-Recovered-Susceptible Model with Simple Demographics
SIRS_vaccination_ode

Susceptible-Infected-Recovered-Susceptible Model with Vaccination
SIS_demographics_ode

Susceptible-Infected-Susceptible Model with Simple Demographics
SIRS_vaccination_demographics_ode

Susceptible-Infected-Recovered-Susceptible Model with Simple Demographics and Vaccination
SIS_ode

Susceptible-Infected-Susceptible Model
SIR_vaccination_ode

Susceptible-Infected-Recovered Model with Vaccination
SIR_vaccination_demographics_ode

Susceptible-Infected-Recovered Model with Simple Demographics and Vaccination
SI_ode

Susceptible-Infected Model
SI_demographics_ode

Susceptible-Infected Model with Simple Demographics
parameter_details

Parameter Details
plot_model

Plot Compartment Populations over Time for a Model Simulation
SIR_demographics_ode

Susceptible-Infected-Recovered Model with Simple Demographics
aggregate_model

A Function to Apply Multiple Aggregations to Model Output
add_pointer_struct

Adds Pointer Structure to R objects
SIRS_ode

Susceptible-Infected-Recovered-Susceptible Model
aggregate_model_internal

An Internal Function to Aggregate Model Output Using other Idmodelr functions.
SHLITR_risk_ode

Susceptible-High-risk-latent-Low-risk-latent-Infected-Treated-Recovered Model, Stratified by Risk
combine_strat_model_output

Reduces the Dimensionality of a Stratified Model
SHLITR_risk_demographics_ode

Susceptible-High-risk-latent-Low-risk-latent-Infected-Treated-Recovered Model with Demographics, Stratified by Risk
generate_parameter_permutations

A Function to Generate Parameter Permutations
SIR_ode

Susceptible-Infected-Recovered Model
idmodelr-package

idmodelr: Infectious Disease Model Library and Utilities
summarise_var_by_strat

Sum a Stratified Variable by Stratification Level
estimate_norm_dist_from_ci

A Function to Estimate a Normal Distribution from Credible or Confidence Intervals
combine_to_age_model

Combine an Infectious Disease Model To a Demographic Model
gather_strat_multi_variable

A Function to Gather Multiple Stratified Variables into a Tidy Format
required_parameters

Lookup the Details of Parameters Required by a Model
model_details

Model Details
gather_strat_variable

A Function to Gather a Stratified Variable into a Tidy Format
scenario_analysis

A Function to Perform Scenario Analysis for a Generic Model Object.
summarise_model

Summarise a Model Simulation
model_df_to_vector

Extracts a Single Column, Summarises if from Simulation
summarise_strat_var

Sum a Stratified Variable
solve_ode

A Simple Wrapper for lsoda
simulate_model

A Function to Simulate a Model from a Generic Simulation Function, with Pre and Post Processing
SEI_ode

Susceptible-Exposed-Infected Model
SEI_demographics_ode

Susceptible-Exposed-Infected Model with Simple Demographics
SEIR_ode

Susceptible-Exposed-Infected-Recovered Model
SHLIR_demographics_ode

Susceptible-High-risk-latent-Low-risk-latent-Infected-Recovered Model with Simple Demographics
SEIS_demographics_ode

Susceptible-Exposed-Infected-Susceptible Model with Simple Demographics
SEIRS_ode

Susceptible-Exposed-Infected-Recovered-Susceptible Model
SEIRS_demographics_ode

Susceptible-Exposed-Infected-Recovered-Susceptible Model with Simple Demographics
SEIR_demographics_ode

Susceptible-Exposed-Infected-Recovered Model with Simple Demographics
SHLIR_ode

Susceptible-High-risk-latent-Low-risk-latent-Infected-Recovered Model
SEIS_ode

Susceptible-Exposed-Infected-Susceptible Model