Primary functionality: applying vaccination activities to a population
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):
$$\rm{immunity}_{\rm new} = \min(\rm{immunity}_{\rm prev} + \rm{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
$$ \rm{immunity}_{\rm new} = \rm{coverage} + \rm{immunity}_{\rm prev} - \rm{coverage}*\rm{immunity}_{\rm prev}$$
The inverse: inferring vaccination activities from a population
It is not possible to infer the vaccination activities that have
given rise to a particular immunity profile of a population by age and
over time: The same profile can be reached with different
targeting
choices (where different targeting
choices will require different amount of vaccine). Furthermore, if there
are cohorts that reached 100% immunity, there may have been double
vaccination of some individuals that left no trace in the immunity
profile. However, the function vacc_from_immunity()
does
infer the vaccination activities from a population immunity profile as
far as possible, returning an obejct of class
popim_vacc_activities
.
To this end, in addition to passing the popim_population
object of interest, the user needs to specify a targeting
option (which will be assumed for all vaccination activities that are
identified). The inferred vaccination activities will be the minimal
activities possible to give rise to the observed immunity profile given
the targeting
option supplied.