Package 'finalsize'

Title: Calculate the Final Size of an Epidemic
Description: Calculate the final size of a susceptible-infectious-recovered epidemic in a population with demographic variation in contact patterns and susceptibility to disease, as discussed in Miller (2012) <doi:10.1007/s11538-012-9749-6>.
Authors: Pratik Gupte [aut, cph] , Edwin Van Leeuwen [aut, cph] , Adam Kucharski [aut, cph] , Rosalind Eggo [ctb, cre] , Hugo Gruson [ctb] , Thibaut Jombart [ctb] , Andree Valle-Campos [ctb] , Joshua W. Lambert [rev]
Maintainer: Rosalind Eggo <[email protected]>
License: MIT + file LICENSE
Version: 0.2.1.9000
Built: 2024-10-11 03:30:31 UTC
Source: https://github.com/epiverse-trace/finalsize

Help Index


Calculate the final size of an epidemic

Description

An internal function that interfaces between the R function final_size() and functions in the package header.

Usage

.final_size(parameters)

Arguments

parameters

A named list of parameters for the final size calculation. See the R function documentation for details and input checking.


Final size of an epidemic

Description

final_size calculates the final size of an epidemic outbreak with a given R0R_0, with options for specifying a population with heterogeneous mixing, and with heterogeneous susceptibility to infection such as that conferred by an immunisation programme.

Usage

final_size(
  r0,
  contact_matrix = matrix(1),
  demography_vector = 1,
  susceptibility = matrix(1),
  p_susceptibility = matrix(1),
  solver = c("iterative", "newton"),
  control = list()
)

Arguments

r0

The basic reproductive number R0R_0 of the disease.

contact_matrix

Social contact matrix. Entry mijm_{ij} gives average number of contacts in group ii reported by participants in group jj . Defaults to the singleton matrix [1][1], representing a homogeneously mixing population.

demography_vector

Demography vector. Entry viv_{i} gives proportion of total population in group ii (model will normalise if needed). Defaults to 1, representing a population where demographic structure is not important (or not known), and where all individuals are assumed to belong to the same demographic group.

susceptibility

A matrix giving the susceptibility of individuals in demographic group ii and risk group kk. Defaults to the singleton matrix [1][1], representing a population where all individuals are fully susceptible to infection.

p_susceptibility

A matrix giving the probability that an individual in demography group ii is in risk (or susceptibility) group kk. Each row represents the overall distribution of individuals in demographic group ii across risk groups, and each row must sum to 1.0. Defaults to the singleton matrix [1][1], representing a population where all individuals are fully susceptible.

solver

Which solver to use. Options are "iterative" (default) or "newton", for the iterative solver, or the Newton solver, respectively. Special conditions apply when using the Newton solver, see the control argument.

control

A list of named solver options, see Solver options.

Details

Specifying heterogeneous mixing and susceptibility

final_size() allows for heterogeneous population mixing and susceptibility, and this is described in the dedicated vignettes:

  1. Heterogeneous population mixing: See vignette on "Modelling heterogeneous social contacts" (vignette("varying_contacts", package = "finalsize"));

  2. Heterogeneous susceptibility to infection: See vignette on "Modelling heterogeneous susceptibility" (vignette("varying_susceptibility", package = "finalsize")).

Solver options

The control argument accepts a list of solver options, with the iterative solver taking two extra arguments than the Newton solver. This is an optional argument, and default options are used within the solver functions if an argument is missing. Arguments provided override the solver defaults.

Common options
  1. iterations: The number of iterations over which to solve for the final size, unless the error is below the solver tolerance. Default = 10000.

  2. tolerance: The solver tolerance; solving for final size ends when the error drops below this tolerance. Defaults to set 1e-6. Larger tolerance values are likely to lead to inaccurate final size estimates.

Iterative solver options

  1. step_rate: The solver step rate. Defaults to 1.9 as a value found to work well.

  2. adapt_step: Boolean, whether the solver step rate should be changed based on the solver error. Defaults to TRUE.

Value

A data.frame of the proportion of infected individuals, within each demography group and susceptibility group combination. If the demography groups and susceptibility groups are named, these names are added to relevant columns. If the groups are not named, synthetic names are added of the form ⁠demo_grp_<i>⁠, for each demographic group ii.

Examples

## For a given R_0
r0 <- 2.0
final_size(r0)

## For a population with multiple demographic groups
# load example POLYMOD data included in the package
data(polymod_uk)
contact_matrix <- polymod_uk$contact_matrix
demography_vector <- polymod_uk$demography_vector

# define the number of age and susceptibility groups
n_demo_grps <- length(demography_vector)
n_risk_grps <- 3

# In this example, all risk groups from all age groups are fully
# susceptible, and the final size in each group is influenced only by
# differences in social contacts
susceptibility <- matrix(
  data = 1, nrow = n_demo_grps, ncol = n_risk_grps
)

p_susceptibility <- matrix(
  data = 1, nrow = n_demo_grps, ncol = n_risk_grps
)
# p_susceptibility rows must sum to 1.0
p_susceptibility <- p_susceptibility / rowSums(p_susceptibility)

# using default arguments for `solver` and `control`
final_size(
  r0 = r0,
  contact_matrix = contact_matrix,
  demography_vector = demography_vector,
  susceptibility = susceptibility,
  p_susceptibility = p_susceptibility
)

## Using manually specified solver settings for the iterative solver
control <- list(
  iterations = 100,
  tolerance = 1e-3,
  step_rate = 1.9,
  adapt_step = TRUE
)

final_size(
  r0 = r0,
  contact_matrix = contact_matrix,
  demography_vector = demography_vector,
  susceptibility = susceptibility,
  p_susceptibility = p_susceptibility,
  solver = "iterative",
  control = control
)

## Using manually specified solver settings for the newton solver
control <- list(
  iterations = 100,
  tolerance = 1e-3
)

final_size(
  r0 = r0,
  contact_matrix = contact_matrix,
  demography_vector = demography_vector,
  susceptibility = susceptibility,
  p_susceptibility = p_susceptibility,
  solver = "newton",
  control = control
)

Example POLYMOD social contact data for the U.K.

Description

An example of social contact and demography data for use with finalsize, accessed from the POLYMOD social contacts dataset using the socialmixr package. Data are for the United Kingdom, and age limits are set at 0, 20, and 40 years, with symmetric = TRUE. Code to get these data is given in data-raw/polymod_uk.R.

Usage

polymod_uk

Format

polymod_uk

A list with two named elements:

contact_matrix

A contact matrix with mean contacts between age groups. This matrix is scaled by its largest real eigenvalue, and each row is scaled by the corresponding element in the demography_vector.

demography_vector

A vector with the number of individuals in each of three age groups: 0 – 20, 20 – 40, 40+.

Source

doi:10.1371/journal.pmed.0050074; obtained using socialmixr::polymod. See further methods in data-raw/polymod_uk.R.


Converts between epidemiological parameters related to R0R_0

Description

Converts between R0R_0 and the transmission rate λ\lambda, or calculates the effective reproduction number ReffR_\text{eff} for a population, while accounting for population characteristics including demographic heterogeneity in social contacts, heterogeneity in the demographic distribution, and heterogeneity in susceptibility to infection.

Uses the R0 (R0R_0), contact matrix (CC), population (NN), and infectious period (γ\gamma) to calculate the transmission rate using the following equation.

λ=R0/(Max(EV(C))γ)\lambda = R_0 / ({Max}(EV(C)) \gamma)

where EV(C)EV(C) denotes the eigenvalues of the matrix CC which is calculated from the social contacts matrix scaled by the number of individuals in each demographic and susceptibility group in the population.

Usage

lambda_to_r0(
  lambda,
  contact_matrix,
  demography_vector,
  susceptibility,
  p_susceptibility,
  infectious_period = 1.8
)

r0_to_lambda(
  r0,
  contact_matrix,
  demography_vector,
  susceptibility,
  p_susceptibility,
  infectious_period = 1.8
)

r_eff(r0, contact_matrix, demography_vector, susceptibility, p_susceptibility)

Arguments

lambda

The transmission rate of the disease, also called the 'force of infection' (λ\lambda). This is different from the effective transmission rate (β\beta).

contact_matrix

Social contact matrix. Entry mijm_{ij} gives average number of contacts in group ii reported by participants in group jj

demography_vector

Demography vector. Entry viv_{i} gives proportion of total population in group ii.

susceptibility

A matrix giving the susceptibility of individuals in demographic group ii and risk group kk.

p_susceptibility

A matrix giving the probability that an individual in demography group ii is in risk (or susceptibility) group kk. Each row represents the overall distribution of individuals in demographic group ii across risk groups, and each row must sum to 1.0.

infectious_period

Duration of the infectious period in days. Default value is 1.8 days.

r0

The basic reproductive number R0R_0 of the infection.

Details

Given the transmission rate (λ\lambda), social contacts matrix (cc), demography (NN), the distribution PP of each demographic group ii into susceptibility groups SS, and the infectious period (γ\gamma)

  • r_eff() calculates the effective reproductive number;

  • lamda_to_r0() calculates the R0R_0 from the transmission rate as

    R0=Max(EV(C))×λγR_0 = {Max}(EV(C)) \times \lambda \gamma

  • r0_to_lambda() calculates the transmission rate as

    λ=R0/(Max(EV(C))γ)\lambda = R_0 / ({Max}(EV(C)) \gamma)

    Note that this is also called the 'force of infection' and is different from the effective transmission rate often denoted β\beta.

Here, EV(C)EV(C) denotes the eigenvalues of the matrix CC which is calculated from the social contacts matrix scaled by the number of individuals in each demographic and susceptibility group in the population.

Value

Returns a single number for the calculated value.

Examples

#### Prepare data ####
# Get example dataset and prepare contact matrix and demography
data(polymod_uk)
contact_matrix <- polymod_uk$contact_matrix
demography_vector <- polymod_uk$demography_vector

# define lambda
lambda <- 0.3

# define infectious period of 5 days
infectious_period <- 5
# define the number of age and susceptibility groups
n_demo_grps <- length(demography_vector)
n_risk_grps <- 3

# In this example, risk varies across groups
susceptibility <- matrix(
  data = c(0.5, 0.7, 1.0), nrow = n_demo_grps, ncol = n_risk_grps
)

# risk does not vary within groups
p_susceptibility <- matrix(
  data = 1, nrow = n_demo_grps, ncol = n_risk_grps
)
# p_susceptibility rows must sum to 1.0
p_susceptibility <- p_susceptibility / rowSums(p_susceptibility)

#### Effective R ####
r0 <- 2.0
r_eff(
  r0 = r0,
  contact_matrix = contact_matrix,
  demography_vector = demography_vector,
  susceptibility = susceptibility,
  p_susceptibility = p_susceptibility
)

#### Transmission rate to R0 ####
lambda_to_r0(
  lambda, contact_matrix, demography_vector,
  susceptibility, p_susceptibility,
  infectious_period
)

#### R0 to Transmission rate ####
r0 <- 1.5
r0_to_lambda(
  r0, contact_matrix, demography_vector,
  susceptibility, p_susceptibility,
  infectious_period
)