## ----include = FALSE---------------------------------------------------------- knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) ## ----setup-------------------------------------------------------------------- library(superspreading) library(ggplot2) library(ggtext) ## ----prep-dispersion-plot----------------------------------------------------- epidemic_params <- expand.grid( R = 2.35, R_lw = 1.5, R_up = 3.2, k = seq(0, 1, 0.1), num_init_infect = seq(0, 10, 1) ) ## ----calc-prob-endemic-------------------------------------------------------- # results are transposed to pivot to long rather than wide data prob_epidemic <- t(apply(epidemic_params, 1, function(x) { median <- probability_epidemic( R = x[["R"]], k = x[["k"]], num_init_infect = x[["num_init_infect"]] ) lower <- probability_epidemic( R = x[["R_lw"]], k = x[["k"]], num_init_infect = x[["num_init_infect"]] ) upper <- probability_epidemic( R = x[["R_up"]], k = x[["k"]], num_init_infect = x[["num_init_infect"]] ) c(prob_epidemic = median, prob_epidemic_lw = lower, prob_epidemic_up = upper) })) epidemic_params <- cbind(epidemic_params, prob_epidemic) ## ----subset-prob-epidemic----------------------------------------------------- # subset data for a single initial infection homogeneity <- subset(epidemic_params, num_init_infect == 1) ## ----plot-dispersion, fig.cap="The probability that an initial infection (introduction) will cause a sustained outbreak (transmission chain). The dispersion of the individual-level transmission is plotted on the x-axis and probability of outbreak -- calculated using `probability_epidemic()` -- is on the y-axis. This plot is reproduced from @kucharskiEarlyDynamicsTransmission2020 figure 3A.", fig.width = 8, fig.height = 5---- # plot probability of epidemic across dispersion ggplot(data = homogeneity) + geom_ribbon( mapping = aes( x = k, ymin = prob_epidemic_lw, ymax = prob_epidemic_up ), fill = "grey70" ) + geom_line(mapping = aes(x = k, y = prob_epidemic)) + geom_vline( mapping = aes(xintercept = 0.2), linetype = "dashed" ) + annotate(geom = "text", x = 0.15, y = 0.75, label = "SARS") + geom_vline( mapping = aes(xintercept = 0.4), linetype = "dashed" ) + annotate(geom = "text", x = 0.45, y = 0.75, label = "MERS") + scale_y_continuous( name = "Probability of large outbreak", limits = c(0, 1) ) + scale_x_continuous(name = "Extent of homogeneity in transmission") + theme_bw() ## ----prep-introductions-plot-------------------------------------------------- introductions <- subset(epidemic_params, k == 0.5) ## ----plot-introductions, fig.cap="The probability that an a number of introduction events will cause a sustained outbreak (transmission chain). The number of disease introductions is plotted on the x-axis and probability of outbreak -- calculated using `probability_epidemic()` -- is on the y-axis. This plot is reproduced from Kucharski et al. (2020) figure 3B.", fig.width = 8, fig.height = 5---- # plot probability of epidemic across introductions ggplot(data = introductions) + geom_pointrange( mapping = aes( x = num_init_infect, y = prob_epidemic, ymin = prob_epidemic_lw, ymax = prob_epidemic_up ) ) + scale_y_continuous( name = "Probability of large outbreak", limits = c(0, 1) ) + scale_x_continuous(name = "Number of introductions", n.breaks = 6) + theme_bw() ## ----plot-introductions-multi-k, fig.cap="The probability that an a number of introduction events will cause a sustained outbreak (transmission chain). The number of disease introductions is plotted on the x-axis and probability of outbreak -- calculated using `probability_epidemic()` -- is on the y-axis. Different values of dispersion are plotted to show the effect of increased transmission variability on an epidemic establishing", fig.width = 8, fig.height = 5---- # plot probability of epidemic across introductions for multiple k ggplot(data = epidemic_params) + geom_point( mapping = aes( x = num_init_infect, y = prob_epidemic, colour = k ) ) + scale_y_continuous( name = "Probability of large outbreak", limits = c(0, 1) ) + labs(colour = "Dispersion (*k*)") + scale_x_continuous(name = "Number of introductions", n.breaks = 6) + scale_colour_continuous(type = "viridis") + theme_bw() + theme(legend.title = element_markdown()) ## ----prep-exinction-plot------------------------------------------------------ extinction_params <- expand.grid( R = seq(0, 5, 0.1), k = c(0.01, 0.1, 0.5, 1, 4, Inf), num_init_infect = 1 ) # results are transposed to pivot to long rather than wide data prob_extinct <- apply(extinction_params, 1, function(x) { median <- probability_extinct( R = x[["R"]], k = x[["k"]], num_init_infect = x[["num_init_infect"]] ) median }) extinction_params <- cbind(extinction_params, prob_extinct) ## ----plot-extinction, fig.cap="The probability that an infectious disease will go extinct for a given value of $R$ and $k$. This is calculated using `probability_extinct()` function. This plot is reproduced from @lloyd-smithSuperspreadingEffectIndividual2005 figure 2B.", fig.width = 8, fig.height = 5---- # plot probability of extinction across R for multiple k ggplot(data = extinction_params) + geom_point( mapping = aes( x = R, y = prob_extinct, colour = factor(k) ) ) + scale_y_continuous( name = "Probability of extinction", limits = c(0, 1) ) + labs(colour = "Dispersion (*k*)") + scale_x_continuous( name = "Reproductive number (*R*)", n.breaks = 6 ) + scale_colour_viridis_d() + theme_bw() + theme( axis.title.x = element_markdown(), legend.title = element_markdown() ) ## ----------------------------------------------------------------------------- # For R = 0.8 proportion_cluster_size( R = 0.8, k = seq(0.1, 1, 0.1), cluster_size = c(5, 10, 25) ) # For R = 3 proportion_cluster_size( R = 3, k = seq(0.1, 1, 0.1), cluster_size = c(5, 10, 25) ) ## ----prep-containment-plot---------------------------------------------------- contain_params <- expand.grid( R = 3, k = c(0.1, 0.5, 1, Inf), num_init_infect = 1, control = seq(0, 1, 0.05) ) prob_contain <- apply(contain_params, 1, function(x) { probability_contain( R = x[["R"]], k = x[["k"]], num_init_infect = x[["num_init_infect"]], pop_control = x[["control"]] ) }) contain_params <- cbind(contain_params, prob_contain) ## ----plot-containment, fig.cap="The probability that an outbreak will be contained (i.e. not exceed 100 cases) for a variety of population-level control measures. The probability of containment is calculated using `probability_contain()`. This plot is reproduced from Lloyd-Smith et al. (2005) figure 3C.", fig.width = 8, fig.height = 5---- # plot probability of epidemic across introductions for multiple k ggplot(data = contain_params) + geom_point( mapping = aes( x = control, y = prob_contain, colour = factor(k) ) ) + scale_y_continuous( name = "Probability of containment", limits = c(0, 1) ) + scale_x_continuous(name = "Control measures (*c*)", n.breaks = 6) + labs(colour = "Dispersion (*k*)") + scale_colour_viridis_d() + theme_bw() + theme( axis.title.x = element_markdown(), legend.title = element_markdown() )