apply_vacc() applies the vaccination activities listed in the input object vacc (a data.frame object of class popim_vacc_activities) to the popim_population object pop, then returns the updated population object pop.

apply_vacc(pop, vacc)

Arguments

pop

An object of class popim_population such as created by popim_population().

vacc

An object of class popim_vacc_activities such as created by popim_vacc_activities().

Value

The input popim_population class object pop with updated column immunity to reflect the vaccination activities supplied in vacc.

Details

Once objects holding data on the population and vaccination activities have been set up, the primary functionality provided by popim is to apply the vaccination activities to the population to evaluate the population immunity by age over time that results from the given vaccination activities, which is done with the function apply_vacc().

Assumptions when applying vaccination activities to the population

  • 100% vaccine effectiveness

  • no wastage of doses

  • no waning immunity

  • mortality is independent of immunity status

While the first two are clearly unrealistic assumptions, if there is a constant vaccine effectiveness (<100%), or a constant wastage factor, the results can easily be scaled up by these constant factors to obtain more realistic values for vaccine demand.

For a potentially deadly disease one would expect that mortality due to the disease would be strongly correlated with immunity status, however, even the most devastating outbreaks typically only affect a small part of the population, and therefore all-cause mortality will be much less impacted by mortality due to the specific disease. This means that this assumption is closer to reality than it might appear at first.

Waning immunity is a potentially important factor to consider for many vaccines, particularly when looking at the long term benefits of vaccination. However, allowing for this is currently not implemented.

Description of the algorithm

The vaccination activities object has columns for coverage, the proportion of the target population that will be vaccinated, and doses, the number of vaccine doses to be administered in the activity. Given a target population size this is redundant (and potentially conflicting) information. The function apply_vacc() will always use coverage information in preference over doses, if this is non-missing. If coverage is missing, the target population size (based on the population size of the region and age groups targeted) will be calculated and the corresponding coverage calculated as doses / target_population.

While the function apply_vacc() will calculate the coverage if it is missing with respect to the target population size, without modifying the input popim_vacc_activities object, the function complete_vacc_activities() will fill in missing coverage and doses information from the other, and check for inconsistencies in activities that have both data on coverage and doses. This is done with respect to a particular popim_population object which contains the relevant population sizes.

Vaccinating a cohort with no previous immunity

When vaccination is applied to a particular birth cohort that has no immunity, the result is simply that the proportion of the cohort receiving the vaccine will be immune from the time of the vaccination onwards, i.e., the immunity for this cohort will be set to equal the coverage of the vaccination activity in question. Due to the annual time step, vaccination is assumed to take effect at the end of the year in which it is implemented, so the immunity is updated from the next year onwards.

Vaccinating a cohort with previous immunity

When a vaccination activity is applied to a cohort that has some previous immunity, we need to make some assumptions about who will be vaccinated in the new activity. There are 3 different options implemented which are governed by the parameter targeting, one of the input parameters to the function apply_vacc(). This parameter can take the values "targeted", "random" or "correlated".

"targeted" targeting

The most effective way to implement a new vaccination activity is to use "targeted" targeting, meaning that the vaccine is targeted at previously non-immunised individuals. This means that the new immunity of after the vaccination activity is simply the sum of the previous immunity and the coverage of the current vaccination activity (capped by 1 which indicates complete immunity of the cohort in question):

immunity_new = min(immunity_prev + coverage, 1)

While this is not a realistic assumption in many settings, it can be useful for instance in multi-year campaigns that target the same region (but possibly proceed sub-region by sub-region) over several years. This multi-year campaign would be coded as separate vaccination activities for each year, using the option targeting = "targeted".

"random" targeting

A reasonable first assumption might be to use targeting = "random", meaning that individuals will receive vaccination irrespective of their previous immunity status. The immunity after the new campaign is applied is calculated according to

immunity_new = coverage + immunity_prev - coverage * immunity_prev

"correlated" targeting

On the opposite end of the spectrum is the most pessimistic assumption that might apply in situations where there is unequal access to vaccination: under "correlated" targeting, people who have previously been immunised get vaccinated first in the new vaccination activity, and those previously not immune will only receive any vaccine if the new coverage extends further:

immunity_new = max(immunity_prev, coverage)

Note that the order in which vaccination activities are applied to a population does not matter under any of the targeting assumptions.

Author

Tini Garske

Examples

## set up population and vaccination activities:
pop <- popim_population(region = "UK", year_min = 2000, year_max = 2005,
                        age_min = 0, age_max = 10)
vacc <- popim_vacc_activities(region = "UK", year = c(2001, 2002),
                              age_first = 0, age_last = 0,
                              coverage = 0.8, doses = NA,
                              targeting = "random")

## update the population immunity based on the vaccination activities:
pop <- apply_vacc(pop, vacc)