Modelling the final size of an epidemic using finalsize requires us to represent the susceptibility status of multiple demographic groups, as well as the proportions of each demographic group in potentially many susceptibility groups. This is done in final size calculations by representing the relevant system of differential equations (Miller 2012) in matrix form. R’s matrix class allows us to easily represent multiple demographic groups with multiple susceptibility groups.
This guide explains how to construct susceptibility (susceptibility
) and demography-in-susceptibility (p_susceptibility
) matrices to represent various scenarios that we might wish to model when estimating epidemic final sizes.
New to finalsize? It may help to read the “Get started” vignette first!
You need to create two matrices, susceptibility
and p_susceptibility
, to pass to the two arguments of the final_size()
function. Here are five case examples with different scenarios for the content of each matrix.
Represents the probability of infection of each combination of demographic and infection-risk groups.
\[ i \; demographic \; groups \left.\vphantom{\begin{matrix} s_{1,1} & s_{1,2} & \cdots & s_{1,j} \\ s_{2,1} & s_{2,2} & \cdots & s_{2,j} \\ \vdots & \vdots & \ddots & \vdots \\ s_{i,1} & s_{i,2} & \cdots & s_{i,j} \end{matrix}}\right\{ \overbrace{ \begin{matrix} s_{1,1} & s_{1,2} & \cdots & s_{1,j} \\ s_{2,1} & s_{2,2} & \cdots & s_{2,j} \\ \vdots & \vdots & \ddots & \vdots \\ s_{i,1} & s_{i,2} & \cdots & s_{i,j} \end{matrix}}^{\displaystyle j \; susceptibility \; groups} \quad s: susceptibility \]
Each element \(\{i, j\}\) in this matrix represents the susceptibility of individuals in demographic group \(\{i\}\) (rows), and susceptibility group \(\{j\}\) (columns).
A common example of a demographic group in a population is an age group, and each population is typically made up of multiple age groups.
Examples of infection-risk groups may include individuals of different immunization status, or with different prior exposure to pathogens. Final size calculations allow us to specify a different susceptibility to infection for each demography and risk group combination (e.g. fully vaccinated people over 65 years old).
Represents the proportion (or probability) that individuals in a demographic group are also in a specific susceptibility group.
\[ i \; demographic \; groups \left.\vphantom{\begin{matrix} p_{1,1} & p_{1,2} & \cdots & p_{1,j} \\ p_{2,1} & p_{2,2} & \cdots & p_{2,j} \\ \vdots & \vdots & \ddots & \vdots \\ p_{i,1} & p_{i,2} & \cdots & p_{i,j} \end{matrix}}\right\{ \overbrace{ \begin{matrix} p_{1,1} & p_{1,2} & \cdots & p_{1,j} \\ p_{2,1} & p_{2,2} & \cdots & p_{2,j} \\ \vdots & \vdots & \ddots & \vdots \\ p_{i,1} & p_{i,2} & \cdots & p_{i,j} \end{matrix}}^{\displaystyle j \; susceptibility \; groups} \quad p: probability \]
Each element \(\{i, j\}\) in this matrix represents the proportion of each demographic group \(\{i\}\) that falls into the susceptibility group \(\{j\}\). Consequently, each of its rows must always sum to 1.0.
Here we share five case examples with different scenarios and how each influences the content and structure of the two matrices.
This scenario assumes that all individuals from all age groups in the population of interest have 80% susceptibility to the infection.
# susceptibility matrix
susceptibility <- tibble(
age_group = c("[0,5)", "[5,18)", "[18,40)", "[40,65)", "65+"),
susceptible = c(0.8, 0.8, 0.8, 0.8, 0.8)
) %>%
column_to_rownames(var = "age_group") %>%
as.matrix()
susceptibility
#> susceptible
#> [0,5) 0.8
#> [5,18) 0.8
#> [18,40) 0.8
#> [40,65) 0.8
#> 65+ 0.8
In this example, all individuals and age groups are equally susceptible to infection; thus, the susceptibility matrix (susceptibility
) has only a single column with identical values.
# demography-in-susceptibility matrix
p_susceptibility <- tibble(
age_group = c("[0,5)", "[5,18)", "[18,40)", "[40,65)", "65+"),
susceptible = c(1.0, 1.0, 1.0, 1.0, 1.0)
) %>%
column_to_rownames(var = "age_group") %>%
as.matrix()
p_susceptibility
#> susceptible
#> [0,5) 1
#> [5,18) 1
#> [18,40) 1
#> [40,65) 1
#> 65+ 1
The susceptibility matrix (susceptibility
) and the demography-in-susceptibility matrix (p_susceptibility
) must always have the same dimensions.
\[ 4 \; demo. \; groups \left.\vphantom{\begin{matrix} s_{1,1} \\ s_{2,1} \\ s_{3,1} \\ s_{4,1} \end{matrix}}\right\{ \overbrace{ \begin{matrix} s_{1,1} \\ s_{2,1} \\ s_{3,1} \\ s_{4,1} \end{matrix}}^{\displaystyle 1 \; susceptibility \; group} \quad 4 \; demo. \; groups \left.\vphantom{\begin{matrix} p_{1,1} \\ p_{2,1} \\ p_{3,1} \\ p_{4,1} \end{matrix}}\right\{ \overbrace{ \begin{matrix} p_{1,1} \\ p_{2,1} \\ p_{3,1} \\ p_{4,1} \end{matrix}}^{\displaystyle 1 \; susceptibility \; group} \]
This scenario assumes that, in the population, there is different susceptibility to the infection between individuals of different age groups, from 20% (infants) to 100% (65+).
# susceptibility matrix
susceptibility <- tibble(
age_group = c("[0,5)", "[5,18)", "[18,40)", "[40,65)", "65+"),
susceptible = c(0.2, 0.5, 0.6, 0.9, 1.0)
) %>%
column_to_rownames(var = "age_group") %>%
as.matrix()
susceptibility
#> susceptible
#> [0,5) 0.2
#> [5,18) 0.5
#> [18,40) 0.6
#> [40,65) 0.9
#> 65+ 1.0
# demography-in-susceptibility matrix
p_susceptibility <- tibble(
age_group = c("[0,5)", "[5,18)", "[18,40)", "[40,65)", "65+"),
susceptible = c(1.0, 1.0, 1.0, 1.0, 1.0)
) %>%
column_to_rownames(var = "age_group") %>%
as.matrix()
p_susceptibility
#> susceptible
#> [0,5) 1
#> [5,18) 1
#> [18,40) 1
#> [40,65) 1
#> 65+ 1
This scenario assumes that, in the population, there is different susceptibility to the infection:
between individuals of different age groups from 20% (infants) to 100% (65+), and
within individuals of the same age group due the immunization effect of 25% to the 40% of each of the age groups.
immunization_effect <- 0.25
# susceptibility matrix
susceptibility <- tibble(
age_group = c("[0,5)", "[5,18)", "[18,40)", "[40,65)", "65+"),
unimmunised = c(0.2, 0.5, 0.6, 0.9, 1.0)
) %>%
mutate(immunised = unimmunised * (1 - immunization_effect)) %>%
column_to_rownames(var = "age_group") %>%
as.matrix()
susceptibility
#> unimmunised immunised
#> [0,5) 0.2 0.150
#> [5,18) 0.5 0.375
#> [18,40) 0.6 0.450
#> [40,65) 0.9 0.675
#> 65+ 1.0 0.750
# demography-in-susceptibility matrix
p_susceptibility <- tibble(
age_group = c("[0,5)", "[5,18)", "[18,40)", "[40,65)", "65+"),
immunised = c(0.4, 0.4, 0.4, 0.4, 0.4)
) %>%
mutate(unimmunised = 1 - immunised) %>%
column_to_rownames(var = "age_group") %>%
as.matrix()
p_susceptibility
#> immunised unimmunised
#> [0,5) 0.4 0.6
#> [5,18) 0.4 0.6
#> [18,40) 0.4 0.6
#> [40,65) 0.4 0.6
#> 65+ 0.4 0.6
Note that because there are two susceptibility groups, the susceptibility matrix has two columns. The corresponding demography-in-susceptibility matrix must also have two columns!
\[ 4 \; demo. \; groups \left.\vphantom{\begin{matrix} s_{1,1} & s_{1,2} \\ s_{2,1} & s_{2,2} \\ s_{3,1} & s_{3,2} \\ s_{4,1} & s_{4,2} \end{matrix}}\right\{ \overbrace{ \begin{matrix} s_{1,1} & s_{1,2} \\ s_{2,1} & s_{2,2} \\ s_{3,1} & s_{3,2} \\ s_{4,1} & s_{4,2} \end{matrix}}^{\displaystyle 2 \; suscept. \; groups} \quad 4 \; demo. \; groups \left.\vphantom{\begin{matrix} p_{1,1} & p_{1,2} \\ p_{2,1} & p_{2,2} \\ p_{3,1} & p_{3,2} \\ p_{4,1} & p_{4,2} \end{matrix}}\right\{ \overbrace{ \begin{matrix} p_{1,1} & p_{1,2} \\ p_{2,1} & p_{2,2} \\ p_{3,1} & p_{3,2} \\ p_{4,1} & p_{4,2} \end{matrix}}^{\displaystyle 2 \; suscept. \; groups} \]
This scenario assumes that, in the population, there is different susceptibility to the infection:
between individuals of different age groups from 20% (infants) to 100% (65+), and
within individuals of the same age group due the immunization effect of 25%.
The immunization uptake rate is also different for each of the age groups: immunization increases with age from 20% (infants) to 90% (65+)
immunization_effect <- 0.25
# susceptibility matrix
susceptibility <- tibble(
age_group = c("[0,5)", "[5,18)", "[18,40)", "[40,65)", "65+"),
unimmunised = c(0.2, 0.5, 0.6, 0.9, 1.0)
) %>%
mutate(immunised = unimmunised * (1 - immunization_effect)) %>%
column_to_rownames(var = "age_group") %>%
as.matrix()
susceptibility
#> unimmunised immunised
#> [0,5) 0.2 0.150
#> [5,18) 0.5 0.375
#> [18,40) 0.6 0.450
#> [40,65) 0.9 0.675
#> 65+ 1.0 0.750
# demography-in-susceptibility matrix
p_susceptibility <- tibble(
age_group = c("[0,5)", "[5,18)", "[18,40)", "[40,65)", "65+"),
immunised = c(0.2, 0.4, 0.6, 0.7, 0.9)
) %>%
mutate(unimmunised = 1 - immunised) %>%
column_to_rownames(var = "age_group") %>%
as.matrix()
p_susceptibility
#> immunised unimmunised
#> [0,5) 0.2 0.8
#> [5,18) 0.4 0.6
#> [18,40) 0.6 0.4
#> [40,65) 0.7 0.3
#> 65+ 0.9 0.1
This scenario assumes that, in the population, there is different susceptibility to the infection:
between individuals of different age groups from 20% (infants) to 100% (65+), and
within individuals of the same age group due the immunization effect of 25% to the 40% of each of the age groups.
Additionally, 10% of individuals in each of the age groups have 100% susceptibility, due to no immunization or not exposed to similar pathogens previously.
immunization_effect <- 0.25
# susceptibility matrix
susceptibility <- tibble(
age_group = c("[0,5)", "[5,18)", "[18,40)", "[40,65)", "65+"),
susceptible = c(1.0, 1.0, 1.0, 1.0, 1.0),
unimmunised = c(0.2, 0.5, 0.6, 0.9, 1.0)
) %>%
mutate(immunised = unimmunised * (1 - immunization_effect)) %>%
column_to_rownames(var = "age_group") %>%
as.matrix()
susceptibility
#> susceptible unimmunised immunised
#> [0,5) 1 0.2 0.150
#> [5,18) 1 0.5 0.375
#> [18,40) 1 0.6 0.450
#> [40,65) 1 0.9 0.675
#> 65+ 1 1.0 0.750
# demography-in-susceptibility matrix
p_susceptibility <- tibble(
age_group = c("[0,5)", "[5,18)", "[18,40)", "[40,65)", "65+"),
susceptible = c(0.1, 0.1, 0.1, 0.1, 0.1),
immunised = c(0.4, 0.4, 0.4, 0.4, 0.4)
) %>%
mutate(unimmunised = 1 - immunised - susceptible) %>%
column_to_rownames(var = "age_group") %>%
as.matrix()
p_susceptibility
#> susceptible immunised unimmunised
#> [0,5) 0.1 0.4 0.5
#> [5,18) 0.1 0.4 0.5
#> [18,40) 0.1 0.4 0.5
#> [40,65) 0.1 0.4 0.5
#> 65+ 0.1 0.4 0.5
Recall that in the demography-in-susceptibility matrix (p_susceptibility
) each row must always sum to 1.0!