--- title: "popim" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{popim} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>", out.width = "100%", fig.dim = c(8,6) ) ``` ```{r setup} library(popim) ``` **POPulation IMmunity** This repository contains functions to run a demographic model of vaccine exposure over time, tracking the vaccine-derived immunity by age through time, following implementation of one or more vaccination activities that can target the population as a whole or selectively target specific age groups. ## Installation You can install the development version of popim from [GitHub](https://github.com/) with: ``` r # install.packages("devtools") devtools::install_github("mrc-ide/popim") ``` ## Example 1: A simple population without specified population size ### Population setup This package defines an S3 class `popim_population` which is a dataframe with at least the columns year, age, cohort (the year of birth for the individuals tracked in this row), and immunity (as a proportion of this cohort). Year, age and cohort are tracked as annual time steps and age groups. A basic, totally naive population dataframe can be setup using the function `popim_population()`: ```{r example} library(popim) pop <- popim_population(region = c("UK", "FRA"), year_min = 2000, year_max = 2010, age_min = 0, age_max = 10) dim(pop) head(pop) ``` This dataframe has 242 columns (2 regions x 11 age groups 0 - 10 x 11 years 2000 - 2020). ### Add vaccination activities Next, we read in a file containing some vaccination activites into an object of the class `popim_vacc_activities`. ```{r read_vacc} vacc <- read_vacc_activities("../inst/extdata/vacc_activities.csv") vacc ``` All vaccination activities target the UK. The first is a campaign targeting all age groups of our dummy population, which took place 2 years before the dawn of time. As immunity is assumed not to wane, the effects of this are still there, and therefore the functions here keep track of this. The remaining vaccination activities are routine vaccination of infants (restricted to age 0) with an increasing population of the target cohort to be vaccinated. We now apply these vaccination activities sequentially to the population using the function `apply_vacc()`. ```{r apply_vacc} pop <- apply_vacc(pop, vacc) ``` ### Visualisation The resulting vaccine-derived immunity of the population can be visualised with the function `plot_immunity()`. This is based on ggplot2, and the returned graph object can be further modified - here in order to achieve tick marks that suit the data better. ```{r plot_immunity} library(ggplot2) ## needed to amend the plot returned from plot_population() g <- plot_immunity(pop) g + scale_x_continuous(breaks = seq(2000, 2010, by = 2)) + scale_y_continuous(breaks = seq(0, 10, by = 2)) ``` As all vaccination activities target the "UK", the population in "FRA" has no immunity at all. In the "UK", the top left corner it shows the immunity remaining in the older age groups from the initial campaign, while the infant vaccination from 2005 onwards results in immuity in the lower right corner - and the increasing coverage highlights how cohorts age through time and therefore move through the plot in a diagonal fashion. ## Example 2: A population with specified size and age distribution ### Population setup A more realistic scenario is to read in some real population data to set up the popim_population, and then apply some vaccination activities to this. Information on the vaccination activities may be given in coverage (typical for routine infant vaccination) or doses (typical for mass vaccination campaigns). ```{r read_population} pop <- read_popim_pop(file = "../inst/extdata/pop_sample.csv") ``` We have read in population data for India ("IND") and Nigeria ("NGA") for the period from 1950 to 2100. The age range covered is 0 to 100 year, and the population is set up as fully unvaccinated: ```{r check_population} dim(pop) head(pop) table(pop$region) range(pop$year) range(pop$age) ``` ### Add vaccination activities Now we read in some vaccination activities for Nigeria: some campaigns targeting all age groups, and some routine vaccination targeting only infants: ```{r apply_campaigns} campaigns <- read_vacc_activities("../inst/extdata/vacc_campaigns_NGA.csv") campaigns routine <- read_vacc_activities("../inst/extdata/vacc_routine_NGA.csv") routine ``` Note that in this dataset the extent of the campaigns is given in the number of vaccine doses administered (assuming no wastage, so this equates to the number of people vaccinated), while the routine vaccination is given as coverage, i.e., the proportion of the targeted age cohort to be vaccinated. If we know the population size that is targeted, we can convert between doses and coverage, and there is a function `complete_vacc_activities()` to fill in whichever one is missing: ```{r complete_vacc} campaigns_complete <- complete_vacc_activities(campaigns, pop) campaigns_complete routine_complete <- complete_vacc_activities(routine, pop) routine_complete |> head() ``` We now apply first the campaigns, then the routine vaccination to the population, and visualise the resulting population immunity. Note that we can use either the original or completed versions of the vaccination activities. ```{r plot_immunity_2} pop <- apply_vacc(pop, campaigns) plot_immunity(pop) pop <- apply_vacc(pop, routine) plot_immunity(pop) ``` ### Summary The overall population immunity can be aggregated across ages using the function `calc_pop_immunity()`: ```{r calc_pop_immunity} pop_agg <- calc_pop_immunity(pop) pop_agg ggplot(pop_agg, aes(x = year, y = immunity, col = region)) + geom_point() ``` ### Infer vaccination activities from `popim_population` object Given a `popim_population` object, the vaccination activities that would be needed to achieve the specified population immunity can be inferred with the function `vacc_from_immunity()`, given an assumption on the targeting method of the vaccination activities. Using this function on the population we have just constructed does indeed yield the original vaccination activities back: ```{r } vacc_act <- vacc_from_immunity(pop, targeting = "random") vacc_act ```