Nothing
## ----include = FALSE----------------------------------------------------------
knitr::opts_chunk$set(
collapse = TRUE,
comment = "#>",
message = FALSE,
warning = FALSE,
dpi = 300
)
## ----setup, message=FALSE, warning=FALSE, class.source = 'fold-hide'----------
# load finalsize
library(finalsize)
library(socialmixr)
library(ggplot2)
library(colorspace)
## ----class.source = 'fold-hide'-----------------------------------------------
# get UK polymod data
polymod <- socialmixr::polymod
contact_data <- socialmixr::contact_matrix(
polymod,
countries = "United Kingdom",
age.limits = c(0, 5, 18, 40, 65),
symmetric = TRUE
)
# get the contact matrix and demography data
contact_matrix <- t(contact_data$matrix)
demography_vector <- contact_data$demography$population
# scale the contact matrix so the largest eigenvalue is 1.0
contact_matrix <- contact_matrix / max(Re(eigen(contact_matrix)$values))
# divide each row of the contact matrix by the corresponding demography
contact_matrix <- contact_matrix / demography_vector
n_demo_grps <- length(demography_vector)
## ----class.source = 'fold-hide'-----------------------------------------------
r0 <- 1.5
## -----------------------------------------------------------------------------
# susceptibility is higher for the old
susc_variable <- matrix(
data = c(0.75, 0.8, 0.85, 0.9, 1.0)
)
n_susc_groups <- 1L
## -----------------------------------------------------------------------------
p_susc_uniform <- matrix(
data = 1.0,
nrow = n_demo_grps,
ncol = n_susc_groups
)
## -----------------------------------------------------------------------------
# calculate the effective R0 using `r_eff()`
r_eff(
r0 = r0,
contact_matrix = contact_matrix,
demography_vector = demography_vector,
susceptibility = susc_variable,
p_susceptibility = p_susc_uniform
)
## -----------------------------------------------------------------------------
# run final_size with default solvers and control options
# final size with heterogeneous susceptibility
final_size_heterog <- final_size(
r0 = r0,
contact_matrix = contact_matrix,
demography_vector = demography_vector,
susceptibility = susc_variable,
p_susceptibility = p_susc_uniform
)
## -----------------------------------------------------------------------------
# prepare uniform susceptibility matrix
susc_uniform <- matrix(1.0, nrow = n_demo_grps, ncol = n_susc_groups)
# run final size with uniform susceptibility
final_size_uniform <- final_size(
r0 = r0,
contact_matrix = contact_matrix,
demography_vector = demography_vector,
susceptibility = susc_uniform,
p_susceptibility = p_susc_uniform
)
## -----------------------------------------------------------------------------
# assign scenario name and join data
final_size_heterog$scenario <- "heterogeneous"
final_size_uniform$scenario <- "uniform"
# join dataframes
final_size_data <- rbind(
final_size_heterog,
final_size_uniform
)
# prepare age group order
final_size_data$demo_grp <- factor(
final_size_data$demo_grp,
levels = contact_data$demography$age.group
)
# examine the combined data
final_size_data
## ----class.source = 'fold-hide', fig.cap="Final sizes of epidemics in populations wherein susceptibility to the infection is either uniform (green), or heterogeneous (purple), with older individuals more susceptible to the infection.", fig.width=5, fig.height=4----
ggplot(final_size_data) +
geom_col(
aes(
x = demo_grp, y = p_infected,
fill = scenario
),
col = "black",
position = position_dodge(
width = 0.75
)
) +
expand_limits(
x = c(0.5, length(unique(final_size_data$demo_grp)) + 0.5)
) +
scale_fill_discrete_qualitative(
palette = "Cold",
name = "Population susceptibility",
labels = c("Heterogeneous", "Uniform")
) +
scale_y_continuous(
labels = scales::percent,
limits = c(0, 1)
) +
theme_classic() +
theme(
legend.position = "top",
legend.key.height = unit(2, "mm"),
legend.title = ggtext::element_markdown(
vjust = 1
)
) +
coord_cartesian(
expand = FALSE
) +
labs(
x = "Age group",
y = "% Infected"
)
## -----------------------------------------------------------------------------
# immunisation effect
immunisation_effect <- 0.25
## -----------------------------------------------------------------------------
# model an immunised group with a 25% lower susceptibility
susc_immunised <- cbind(
susc_variable,
susc_variable * (1 - immunisation_effect)
)
# assign names to groups
colnames(susc_immunised) <- c("Un-immunised", "Immunised")
n_risk_groups <- ncol(susc_immunised)
## -----------------------------------------------------------------------------
# immunisation rate is uniform across age groups
immunisation_rate <- rep(0.5, n_demo_grps)
# add a second column to p_susceptibility
p_susc_immunised <- cbind(
susceptible = p_susc_uniform - immunisation_rate,
immunised = immunisation_rate
)
## -----------------------------------------------------------------------------
# we run final size over all r0 values
final_size_immunised <- final_size(
r0 = r0,
contact_matrix = contact_matrix,
demography_vector = demography_vector,
susceptibility = susc_immunised,
p_susceptibility = p_susc_immunised
)
## -----------------------------------------------------------------------------
# add scenario identifier
final_size_immunised$scenario <- "immunisation"
# prepare age group order
final_size_heterog$demo_grp <- factor(
final_size_heterog$demo_grp,
levels = contact_data$demography$age.group
)
final_size_immunised$demo_grp <- factor(
final_size_immunised$demo_grp,
levels = contact_data$demography$age.group
)
# examine the data
final_size_immunised
## ----fig.cap="Final size of an SIR epidemic with $R_0$ = 1.5, in a population wherein 50% of each age group is immunised against the infection. The immunisation is assumed to reduce the initial susceptibility of each age group by 25%. This leads to both within- and between-group heterogeneity in susceptibility. Vaccinating even 50% of each age group can substantially reduce the epidemic final size in comparison with a scenario in which there is no immunisation (grey). Note that the final sizes in this figure are all below 50%.", fig.width=5, fig.height=4, class.source = 'fold-hide'----
ggplot(final_size_immunised) +
geom_col(
data = final_size_heterog,
aes(
x = demo_grp, y = p_infected,
fill = "baseline",
colour = "baseline"
),
width = 0.75,
show.legend = TRUE
) +
geom_col(
aes(
x = demo_grp, y = p_infected,
fill = susc_grp
),
col = "black",
position = position_dodge()
) +
facet_grid(
cols = vars(scenario),
labeller = labeller(
scenario = c(
heterogeneous = "Between groups only",
immunisation = "Within & between groups"
)
)
) +
expand_limits(
x = c(0.5, length(unique(final_size_immunised$demo_grp)) + 0.5)
) +
scale_fill_discrete_qualitative(
palette = "Dynamic",
rev = TRUE,
limits = c("Immunised", "Un-immunised"),
name = "Immunisation scenario",
na.value = "lightgrey"
) +
scale_colour_manual(
values = "black",
name = "No immunisation",
labels = "Susceptibility homogeneous\nwithin groups"
) +
scale_y_continuous(
labels = scales::percent,
limits = c(0, 0.5)
) +
theme_classic() +
theme(
legend.position = "bottom",
legend.key.height = unit(2, "mm"),
legend.title = ggtext::element_markdown(
vjust = 1
),
strip.background = element_blank(),
strip.text = element_text(
face = "bold",
size = 11
)
) +
guides(
colour = guide_legend(
override.aes = list(fill = "lightgrey"),
title.position = "top",
order = 1
),
fill = guide_legend(
nrow = 2,
title.position = "top",
order = 2
)
) +
coord_cartesian(
expand = FALSE
) +
labs(
x = "Age group",
y = "% Infected",
title = "Heterogeneous susceptibility",
fill = "Immunisation\nscenario"
)
## -----------------------------------------------------------------------------
# define r0
r0 <- 1.5
# define UK population size and prepare contact matrix
uk_pop <- 67 * 1e6
contact_matrix <- matrix(1.0) / uk_pop
# define susceptibility matrix
susceptibility <- matrix(c(1.0, 0.7), nrow = 1, ncol = 2)
# define p_susceptibility
p_susceptibility <- matrix(c(0.7, 0.3), nrow = 1, ncol = 2)
# running final_size()
final_size(
r0 = r0,
demography_vector = uk_pop,
contact_matrix = contact_matrix,
susceptibility = susceptibility,
p_susceptibility = p_susceptibility
)
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.