fleet is not yet validated for real use; see the status
note.
This article specifies the daily update that fleet
applies. §1 states the design constraint the rest follows from, §2 what
the state space does and does not carry, sections A to H the P.
falciparum equations as implemented, and §V the P. vivax
model. The implementation is inst/odin/malaria_daily.R,
with its inputs built in R/build_inputs.R and
R/interventions.R. All references to
malariasimulation are to v3.0.0.
Getting started introduces the package with
runnable code, vignette("parameters") covers each
malariasimulation argument, and
vignette("using") covers what to do differently because the
model is a mean field.
1. Scope and design
fleet is a deterministic mean-field counterpart to the
malariasimulation individual-based model (IBM) of
Plasmodium falciparum and P. vivax, advanced one day
at a time on the IBM’s own clock.
Mean field means that the model tracks the distribution of the population over states, not individual people, so the state cannot carry per-individual attributes. A quantity that depends on two attributes of the same person, such as owning a net and being vaccinated, is unavailable by construction. Most of §2.2 and §2.3 follows from this.
fleet follows the IBM’s code rather than its published
equations. malariasimulation resolves a day as a sequence
of processes that all read the state at the start of the day and queue
their changes to its end: immunity decays, the day’s bites are drawn and
deduplicated, infection and each state’s progression are resolved as one
competing draw per person, the mosquito model is stepped across the day,
and the dead are replaced by newborns. fleet applies the
same steps in the same order to the distribution of the population over
states. The IBM’s per-day arithmetic is therefore reproduced by
construction rather than approximated: whole-day sojourns, integer
refractory windows, the delay lines behind the EIR, human infectivity
and mosquito incubation, and a boost overwriting the day’s immunity
decay.
The IBM records for each person their net, their spray status, their
vaccination history, their drug and the date they took it, and the date
each of their four immunity functions last boosted. A mean-field model
cannot afford a state dimension for each. fleet keeps two
human structuring dimensions, age and biting heterogeneity (the vivax
model adds a third, §V.1), and represents everything else as a
time-varying coefficient in the daily update, a closure that carries its
average effect, or a discrete state jump between days. §2.1 to §2.3 set
out which is which.
Abbreviations and terms
| Term | Meaning |
|---|---|
| EIR | Entomological inoculation rate, infectious bites per person per
year. fleet reports it per adult per year |
| FOI, FOIM | Force of infection on humans; force of infection on mosquitoes |
| EIP | Extrinsic incubation period, the delay in the mosquito between an infectious blood meal and becoming infectious |
| LM, PCR | Light microscopy; polymerase chain reaction. The two prevalence diagnostics reported |
| ETF, SPC | Early treatment failure; slow parasite clearance. The two
antimalarial-resistance arms malariasimulation
implements |
| PEV, TBV | Pre-erythrocytic vaccine (RTS,S, R21); transmission-blocking vaccine |
| TRA, TBA | Transmission-reducing activity (an antibody-level quantity); transmission-blocking activity (the resulting per-state reduction in infectivity) |
| MDA, SMC, PMC | Mass drug administration; seasonal malaria chemoprevention; perennial malaria chemoprevention |
| EPI | The Expanded Programme on Immunization routine schedule. Unrelated
to set_epi_outputs(), where “epi” means
epidemiological |
| IRS | Indoor residual spraying |
| Stage chain | A linear chain of sequential stages, each left with probability a day, so each lasts a geometric number of days. Its total has mean and variance |
| Delay line | The last
days of a quantity, one value per day, so a lag of
days is read off directly, as the IBM’s LaggedValue and
incubation queue hold it |
| Gauss–Hermite quadrature | A deterministic replacement for Monte Carlo sampling: a small fixed set of representative values and weights that reproduce the distribution’s moments. A tensor rule is the product grid over several such axes |
| Knots | The times at which an interpolated series may change value |
| Seed | The initial state vector, never a random-number seed.
fleet has no random component |
2. State space
2.1 What has a state dimension
Every human compartment is a two-dimensional array over age group
and biting-heterogeneity node
;
every mosquito compartment is indexed by species
.
Human compartments are per-capita densities (fractions of the total
human population), so run time does not depend on
human_population.
| Dimension | Symbol | Default size | Set by | Indexes |
|---|---|---|---|---|
| Age group | 118 |
age_lower = / default_age_lower()
|
The graded age grid described below. Individuals age by a linear-chain (McKendrick) flow between adjacent groups | |
| Biting heterogeneity | 5 |
parameters$n_heterogeneity_groups,
enable_heterogeneity
|
Gauss–Hermite nodes
and weights
of the log-normal relative-biting-rate distribution with variance
(sigma_squared);
.
Fixed at birth and never mixed: a person stays in their stratum for
life, as in the IBM |
|
| Vector species | 1 | set_species() |
Independent aquatic and adult mosquito populations, each with its own biting rate, mortality, carrying capacity and vector-control response, coupled only through the shared human population | |
| EIR delay line | days | 13 | de |
The last days of the per-species EIR , from which the lag is read, interpolating between two days when it is fractional (§B.2) |
| Infectivity delay line | days | 13 | delay_gam |
The last days of the population’s onward infectivity, from which the gametocyte lag is read (§C). The default 12.5 d is read halfway between the values saved 12 and 13 days ago |
| Incubation delay line | days | 9 | dem |
The last days of the per-species flux into incubation : the IBM’s queue of days releases the flux that entered days ago (§D) |
The default age grid is fine in childhood and coarse in adulthood. Group edges are pinned at the conventional reporting ages (0, 1, 2, 3, 5, 7, 10, 15, 20, 30, 40 and 60 y), so output bands fall on group boundaries, and at 21 y, so that whole groups make up the year from which maternal immunity’s mothers are drawn (§B.3). Between two anchors the groups are of equal width. The budget of groups is shared between the anchor intervals in proportion to their width in log(1 + age), because immunity rises with log age rather than with age, weighted 1.25 below 5 y and 0.5 from 21 y to move groups to where the grid’s error arises. An absorbing top group runs from 80 y.
Human compartments are all
.
S_count counts the uninfected, including the
drug-protected, as the IBM counts them; Ph_count gives how
many of them a drug is protecting.
| Compartment | odin | Output column | Meaning |
|---|---|---|---|
S |
S_count (with the
chains) |
Susceptible | |
D |
D_count |
Clinical disease, untreated | |
Tr |
Tr_count (with
) |
Successfully treated, standard clearance | |
Tr_slow |
in Tr_count
|
Successfully treated, slow parasite clearance. A separate compartment, so the two clearance speeds form a mixture of two sojourns rather than one sojourn at the blended mean (§B.4) | |
A |
A_count |
Asymptomatic patent infection | |
U |
U_count |
Sub-patent infection | |
| , |
Tr_c, Tr_cs
|
in Tr_count
|
The chemoprevention treated phase: the clinical and LM-detectable
asymptomatic cases a chemoprevention round treats, which stay detectable
and infectious for the Tr stay (fast and slow clearance). Each has a
stock, J_c or J_cs, of the infectivity it
carries (§E) |
Ph |
Ph_count, and in S_count
|
Post-treatment prophylaxis: a stage chain of stages, so that the whole sojourn matches the mean and variance of the IBM’s Weibull protection rather than lasting a single geometric time (§B.4). is 9 for SP-AQ, 10 for DHA-PQP, 1 for AL (whose 10-day protection is less variable than itself), and 1 with no clinical drugs | |
Ph_c |
as | Chemoprevention prophylaxis (MDA, SMC, PMC). A separate chain, because its drug, and so its mean duration and shape, can differ from the clinical first line: 10 stages for SP-AQ, 9 for DHA-PQP | |
Ph_ct |
as | The protection left after the chemoprevention treated phase, sized as the post-treatment chain is (§E) | |
IB |
ib_mean |
Pre-erythrocytic (anti-infection) immunity | |
ICA |
ica_mean |
Acquired clinical immunity | |
ID |
id_mean |
Anti-parasite (detection) immunity | |
IVA |
iva_mean |
Acquired severe-disease immunity |
The four immunity arrays hold the mean immunity of the individuals in each (age, heterogeneity) cell, not an extensive density, so their ageing term is a difference , with the day’s inflow per head (§B.5), rather than a flux.
Mosquito compartments are all :
| Compartment | Meaning |
|---|---|
| , , | Aquatic early larval, late larval and pupal (odin names
ME, ML, MP). Pupae emerge at
,
and the half that are female enter
.
Males are not modelled, so the factor of
on emergence is a sex ratio, not a loss |
| Susceptible adult females | |
Incubating (exposed) adults (odin Em) |
|
| Infectious adults |
With the defaults (, , ) and no drugs, so that every chain has one stage, there are 10,030 falciparum human states, , and 6 mosquito states per species. To these are added the three delay lines (35 days of history) and the day’s recorded outputs, which are carried as state because a daily update has nowhere else to keep them. Each extra prophylaxis stage adds states. The vivax block (§V) multiplies its compartments by the eight levels of its hypnozoite ladder, which hold the eleven batch counts (§V.1).
2.2 What is captured without a dimension
These mechanisms are per-individual attributes in the IBM and
time-varying (in some cases age-varying) coefficients in
fleet. Each row is a dimension that was not added.
| Mechanism | IBM representation |
fleet representation |
What is lost |
|---|---|---|---|
| Clinical treatment coverage | Per-person Bernoulli draw at a clinical episode | Scalar
,
step-interpolated over the union of all drugs’ timesteps,
splitting the clinical inflow between
and
|
Nothing at the flow level |
| Which drug a person received | Drug index stored per treated individual, determining their efficacy, infectivity and prophylaxis duration | Three scalar series , , , each a coverage-share-weighted blend across the active clinical drugs, step-interpolated over the coverage change times | A first-line switch is modelled (the blend moves in time); a mixed first line is represented by its mean, not its mixture |
| Post-treatment prophylaxis clock | Weibull survival multiplying each treated person’s infection probability, running from the dose | A stage chain entered after , its mean and stage count moment-matched to (§B.4) | The chain reproduces the integrated protection exactly and, for SP-AQ and DHA-PQP, the survival curve to within a few points (§B.4). It protects fully while it lasts, where the IBM’s protection is partial and fades, and AL’s single stage spreads its sharp 10-day protection |
| Early treatment failure | Per-person draw returning a treated case to clinical | Folded into the effective treated fraction (§B.4) | Nothing |
| Bed net ownership, net age, retention, repeat rounds | Per-person net-receipt timestep; efficacy decays from that date; nets lost stochastically | Two scalars per species, and , from the mean-field mixture over all past distributions, each weighted by most-recent-receipt probability retention survival and decaying with its own and | Protection is population-averaged rather than correlated within individuals across bites, so nets and IRS tend to under-suppress transmission relative to the IBM |
| IRS spray status and spray age | Per-person house-spray timestep | Folded into the same , : a mixture over all past rounds weighted by most-recent-spray probability, with no retention factor (sprayed protection never expires in the IBM) | As for bed nets |
| Vaccination status, dose count, booster stratum, antibody titre | Per-person dose history and last-vaccination date. Antibody parameters are not stored: the IBM re-draws all four from their profile distributions every timestep, for every vaccinated person | One
multiplier
on the infection hazard. A campaign’s protection stays with the cohort
it vaccinated, its age band moving up with the time since; repeated
rounds combine as the most recent dose; the vaccinated are partitioned
analytically by the most recent booster each has reached; each stratum’s
efficacy is the average of the Hill efficacy over the IBM’s own 4-D
antibody distribution (create_pev_profile()) |
The antibody average is exact, since the IBM’s draws are
independent. The dose history is lost: vaccination status is
uncorrelated with anything else (nets, treatment) and between rounds,
min_wait re-vaccination exclusion is not applied (set_mass_pev()),
and seasonal boosters become a fixed days-since-primary schedule (with a
warning) |
| TBV antibody titre | Per-person, mapped to transmission-reducing activity | Four infectivity multipliers, one per infectious state (, , , ), because the IBM’s TRA-to-TBA map is state-specific (§C) | Only the mean-field averaging |
| Immunity boosting refractory clock | Per-person last_boosted timestep; a boost fires only if
days have passed |
For bites (), the renewal probability on the day’s bite probability, with the wait rounded as the IBM rounds it; for infections (, , ), a quasi-steady closure for where the recently boosted have got to (§B.5) | The renewal form is exact for the mean inter-boost interval. The closure omits the refractory who are back in within the window, of order of the refractory days in |
| Age-specific mortality, demographic transition | Per-person death hazard by age band and year | , a constant-interpolated series; its row also sets the seed’s age structure (§F) | Ages above the top deathrate_agegroups take the top
rate, where the IBM removes them; a warning is given |
| Maternal immunity | Sampled from a mother aged 20 to 21 drawn at birth | Algebraic, from the population-weighted mean acquired immunity of those aged 20 to 21 (§B.3), with no state variable | Nothing beyond the mean-field average over mothers |
| Seasonality | Daily rainfall drives larval carrying capacity | on a daily grid from the same truncated Fourier series, held at the day’s start value across the day as the IBM holds it (§D) | Nothing (identical functional form) |
| Repeated bites in one day | Bitten individuals are collected in a set, so a person bitten several times counts once and can be infected at most once a day | The day’s infection probability saturates, bitten times , rather than growing with every bite (§B.2) | Nothing: it is the IBM’s own daily probability |
Mass drug administration (MDA, SMC, PMC) is also carried without a
dimension, but as an event rather than a coefficient: fleet
stops at the end of every day that carries a scheduled round, applies a
state jump (§E), and resumes.
2.3 What is not captured
| Feature | Reason | Behaviour |
|---|---|---|
| MDA, SMC or PMC under P. vivax |
malariasimulation itself fails on the combination
(update_mass_drug_admin() reads the falciparum-only
id) |
Error at input |
Individual mosquitoes
(individual_mosquitoes = TRUE) |
fleet is always compartmental |
Ignored |
Intervention correlation (get_correlation_parameters(),
run_simulation(correlations =)) |
Individual-level; the mean field assumes independence between interventions | Warned and ignored |
| Per-individual stochastic variation | Deterministic model | By construction |
| Partner-drug resistance, late clinical or parasitological failure, reinfection during prophylaxis |
malariasimulation itself rejects non-zero values for
these in set_antimalarial_resistance()
|
Cannot reach the model |
A. Notation
Abbreviations and terms are listed in §1.
| Symbol | odin name | Meaning |
|---|---|---|
r_age |
Fraction of age group ageing into the next each day, exponentially fitted (§B.1); (absorbing) | |
mu_age |
Age- and time-specific death rate | |
re |
Fraction of age group leaving it each day | |
psi |
Relative biting rate by age, | |
| , |
zeta, het_wt
|
Heterogeneity node and quadrature weight |
Npop |
Total population density in cell | |
EPS |
Expected infectious bites per person per day | |
p_inf |
Probability a person in , or is infected today | |
hb |
The infection hazard of someone bitten today, for the competing draw | |
b |
Probability an infectious bite establishes infection | |
phi |
Probability an infection is clinical | |
theta |
Probability an infection is severe | |
q |
Probability an asymptomatic infection is LM-detectable | |
cA, cD, cU,
cT
|
Onward infectivity to mosquitoes, by state | |
ft |
Clinical treatment coverage | |
pev_factor |
PEV hazard multiplier | |
| , |
a_spp, mum
|
Human blood-meal rate and adult mortality, per species |
Kcap |
Larval carrying capacity | |
de, delay_gam, dem
|
EIR lag, gametocyte lag, extrinsic incubation period |
B. Human model
Each day takes the state at the start of day (the IBM’s timestep ) to at its end. Every quantity on the right-hand side of an update is evaluated at the start of the day, as every IBM process reads the state before any of the day’s changes land.
B.1 Demography
Ageing is a linear chain over the age grid. Deaths are recycled as births into age group 1, distributed across heterogeneity nodes by the quadrature weights, so the total population is conserved exactly:
Every human compartment carries the same structural terms
where at the ageing inflow is replaced by for and by zero for every other compartment.
The ageing rate is exponentially fitted:
for band width
in days, computed as mu/expm1(mu*h) to avoid cancellation
when
is small. This makes the stationary ratio between adjacent groups
exactly
,
where the obvious
gives
and so always decays too slowly.
tends to
as
.
It is fitted at the baseline mortality
and held constant, so it does not follow set_demography()
in time. A group must be wider than a day, so that
.
The stationary age structure of the daily update is the same as the
continuous chain’s, so the fitting carries over to the daily clock.
B.2 Exposure and the day’s infection probability
The IBM saves each species’
every day and draws today’s bites from the value saved
days ago (lagged_eir$get(t - de)). fleet keeps
the same delay line and, for a fractional lag, interpolates linearly
between the two saved days as LaggedValue does. (For a
fractional de the IBM’s buffer is one day too short and
returns its initial value indefinitely; fleet does not
reproduce this. The default de = 12 is whole.)
The IBM draws the day’s bites as a Poisson total of
times the population mean of
and shares them in proportion to
over the live population (human_pi()), so a person’s
expected bites are
with both means taken over the current population. ( is the quadrature’s , 0.99972 at five nodes, not 1.)
The IBM collects the day’s bitten in a set, so a person bitten several times in one timestep can be infected at most once. They are bitten at least once with probability , and a bitten person in , or is infected with probability , so
Setting parameters$bite_dedup = 0 lets every bite infect
independently instead, with hazard
.
This agrees with the IBM to within 2% at low exposure and exceeds it at
seasonal peaks and in
high-
strata.
One competing draw. In the IBM, infection and disease progression are resolved together, once a day per person. Someone facing infection at hazard and progression at hazard has an event with probability , and it is the infection with probability , so an infection pre-empts that day’s progression. Only the day’s bitten carry an infection hazard, ; the unbitten face progression alone. has no progression and and cannot be infected, so the draw matters for ( at ) and ( at ):
and , likewise with . The day’s infections are ; a fraction of them is clinical, so the daily clinical count is exactly the IBM’s.
B.3 Immunity-dependent probabilities
All four probabilities are Hill functions of the immunity states.
is acquired_immunity_offset: 0 by default for falciparum,
and 0.5 reproduces the IBM’s per-individual +0.5. The IBM
applies that offset only where acquired immunity is strictly positive,
so never-boosted individuals get none. This is one reason a flat
+0.5 on a stratum mean is the worse match, and why 0 is the
default.
with the age-dependent detection and severity modifiers
takes no offset, matching the IBM.
Maternal immunity is algebraic, not a state. The IBM
draws each newborn’s mother uniformly from those aged
in its heterogeneity group, so a newborn inherits, in expectation, their
population-weighted mean immunity. fleet weights each age
group by its share
of that year; on the default grid, with edges at 20 and 21,
is 1 for the groups making up
and 0 elsewhere. Maternal immunity decays with age from birth:
where is the exact mean of over age band ,
and is the same with .
Mean-field bias in severe incidence
Of the three acquired-immunity Hill functions, has the shallowest exponent, not the steepest:
| Function | Exponent | Scale |
|---|---|---|
What distinguishes is its scale. A Hill function is flat well below its scale parameter and approaches its full log-log slope only well above it, so its local slope depends on position. Writing for the denominator term,
which is near 0 for , reaches at , and returns towards 0 once reaches its floor. The same expression with and governs , whose steepest attainable slope, , is the steeper of the two.
Position separates them.
is sixteen times smaller than
,
while the two acquired immunities take nearly the same values at every
age, so they differ almost entirely in what they are divided by. At
fleet’s own seed at the reference EIR of 20:
| Age | ||||
|---|---|---|---|---|
| 1 | 1.80 | 0.12 | ||
| 3 | 6.62 | 0.44 | ||
| 5 | 12.20 | 0.82 | ||
| 10 | 26.31 | 1.79 |
is within 5% of its steepest possible slope from age 3.4 to age 10.5. at age 3 is less than a fifth as steep, and does not overtake until age 10.
On that tail,
is convex in
across almost the whole population, whereas
is concave in
through early childhood at this EIR. This fixes the sign of the
mean-field error within a stratum. fleet evaluates
once per (age group
heterogeneity group), at that stratum’s mean
;
the IBM averages
over individuals whose bite histories differ within the stratum, and by
Jensen’s inequality
,
so the mean field returns the smaller value. fleet resolves
the log-normal biting strata explicitly (§2.1), so only the spread
within an (age,
)
cell is lost, and that is small: refined to 417 age groups,
fleet is within 1% of the IBM on all-age severe incidence
at EIR 20, 50 and 120.
On a coarser grid the remaining error is the grid’s, with the same
sign for the same reason one level up: a group’s severe incidence is
evaluated at its mean immunity, and because
is convex this under-counts wherever immunity changes across the group.
It changes fastest in the young groups, where severe disease
concentrates. The error is first order in the group width:
fleet’s own age profile halves its distance from the
converged one with each doubling of the number of groups. Against the
IBM median, severe incidence at EIR 120 is 7% low on 53 groups and 2%
low on 118, the default. vignette("using") covers what a
coarser grid costs.
B.4 Disease-state equations
Writing
for the day’s infections,
for the slow-parasite-clearance fraction of the treated (set_antimalarial_resistance()),
and
for the effective treated fraction, and omitting the ageing terms of
§B.1 that every compartment carries:
with the later stages of as those of , and the infectivity stocks and leaving with and .
A clinical case is treated successfully with probability and goes to or ; otherwise it goes to . A non-clinical infection of someone in or goes to , and an infected sub-clinically stays in .
Prophylaxis chains. The IBM has no prophylaxis state. It multiplies each treated person’s infection probability by the Weibull survival , and a dose acts from the day after it is given, so a treated cohort’s mean protection on day is . Read as the survival of a whole number of protected days , , its mean is and its variance . A chain of stages, each left with probability a day, lasts a sum of geometric times, with mean and variance , so it matches that mean and variance at . For SP-AQ as chemoprevention this gives 10 stages, which put the chain’s survival within a few points of (0.67 at day 30, against the Weibull’s 0.70 and a single stage’s 0.42). A stage lasts at least a day, so , and is capped at 20.
is entered only after the sojourn, whereas the IBM’s clock runs from the dose in parallel with : someone treated on day 0 is still in on day with probability . The chain therefore carries the protected days left once out of , , and its stage count matches the variance of the whole sojourn, . This gives 9 stages for SP-AQ and 1 for AL, whose 10-day protection is already less variable than itself, so no chain length can sharpen it.
People in a chain are fully protected and are not infectious. This is
the chain’s one departure from the IBM: its protection is all or
nothing, where the IBM’s is partial and fades, so at high transmission
the chain protects dosed children somewhat more than the IBM’s curve
does (see the intervention-impact claim in
fleetcheck).
Two treated compartments. The IBM assigns each successfully treated individual to standard or slow parasite clearance by a Bernoulli draw, giving a mixture of two sojourns, not one at the blended mean. and reproduce that split structurally.
Whole-day sojourns. The IBM advances states once a
day with exit probability
,
so its realised mean dwell is
(5.52 d for
,
not 5). fleet uses the same probabilities,
for
,
so the dwell distributions, not only their means, are the IBM’s. In the
IBM, slow clearance is resolved through the same per-day path as
ordinary treatment.
Chemoprevention compartments. and the treated phase , have no inflow in the daily update; they are filled only by the chemoprevention pulses of §E. The chains carry neither infection risk nor infectivity; the treated phase is detectable and infectious, as the IBM’s Tr is.
B.5 Immunity equations
The IBM boosts immunity on a per-day event with an integer refractory
window: boost_immunity() fires only if
timestep - last_boosted >= u, and the timestep is an
integer, so a person boosted on day
is refractory for the next
days
(
means no window).
The event differs between and the other three. For it is being bitten at least once, , whatever the person’s state, so its boosts are a renewal process with mean gap and daily boosting probability
For
,
and
the event is infection, which also moves the person: someone boosted
today is in
,
or
tomorrow, and whether they are still refractory when next infected
depends on where they have got to. The renewal form, applied in every
state, treats someone in
or
as though reinfected as often as someone in
,
and so under-boosts. A window lasts days and the sojourns in
and
last months, so fleet uses a quasi-steady closure. From
today’s rates, let
be the probability that someone boosted
days ago is in state
today:
(the treated leave for and the protection chain, and cannot be infected before the window ends). is the number of refractory days spent in per boost. With boosting infections a day, the refractory stock is in and in . Those people are infected at ’s and ’s own rates without boosting, so and
each with its own window. The closure omits the refractory who are back in within the window: from they are of order of the refractory days in , and a treated case reaches only through a prophylaxis chain.
A boost replaces the day’s decay. The IBM queues
each immunity’s decay,
,
first in the day, and a boost,
from the start-of-day value, later. The queue applies both in order and
the later update overwrites the earlier for the people it covers
(boost_immunity() is called with no decay of its own), so a
boosted person gains 1 and does not decay that day. Averaged over a
cell,
where is the day’s inflow into the cell per head (births at , ageing from the group below otherwise), with (immunity is zero at birth). The immunities hold the mean immunity of the people in a cell, so ageing moves them as a difference, and the dead carry the cell mean, so death leaves it unchanged. At the boosting levels of high transmission the skipped decay raises equilibrium immunity by a factor of up to , at most about a sixth; the continuous-time formula misses this.
C. Human-to-mosquito infectivity
Onward infectivity is the state-weighted, biting-weighted human
infectiousness. The IBM saves it every day and infects mosquitoes with
the value from
days ago (lagged_infectivity$get(t - delay_gam)).
fleet keeps the same delay line, interpolating linearly
between the two days around a fractional lag as LaggedValue
does
(
d is read halfway between the values saved 12 and 13 days ago). TBV
enters here as per-state, per-age multipliers
:
where is the mean of over the live population, as the IBM normalises it.
D. Mosquito model
The IBM’s mosquito model is a compartmental ODE, integrated across
each day with that day’s biting rate, adult mortality and force of
infection held fixed; fleet does the same. Per species
,
with adult total
and larval total
,
the equations over the day are
Extrinsic incubation. malariasimulation
keeps a queue of
days. Each day it pushes that day’s flux into incubation,
at the start of the day, and pops the oldest. The day’s integration
releases the value at the front, which is the flux that entered
days ago (9 days at the default
),
with the incubation survival
at today’s
(adult_mosquito_eqs.cpp). fleet keeps the same
delay line:
with fixed across the day.
Carrying capacity. The IBM’s aquatic model evaluates
at the solver’s time truncated to a whole day
(carrying_capacity() takes an integer timestep), so
is constant across each day at its start-of-day value.
fleet holds it there too.
Integrating the day. The larval equations are stiff:
late-larval density-dependent mortality runs at about 5 a day at
equilibrium, and far faster when a run starts with larvae far above a
seasonal carrying capacity, as a seasonal run seeded at the annual mean
does. fleet crosses the day in
sub-steps (ode_tuning(n_sub =), default 32) of an
exponential midpoint rule. Every compartment has the form
,
and a step of length
takes it to
,
which is exact for frozen
and
and stays stable and positive however large
is. Each sub-step predicts the half-step state and then takes the full
step with
and
from it, which makes the rule second order: once a run is on its cycle
the error falls fourfold with each doubling of the sub-steps. At 32
sub-steps a seasonal run’s daily EIR is within
of the converged solution at the seasonal trough and
at its peak, comparable to the per-step tolerance to which the IBM
integrates its own mosquito model
(r_tol = a_tol = 1e-4).
Vector control enters only through
and
.
For each species and time, fleet uses
malariasimulation’s own net and IRS decay and combination
algebra, averaged over the net-using and sprayed fractions, to obtain a
mean repellency
and a mean survival
;
then
Oviposition is unaffected: the IBM’s
eggs_laid(beta, mu, f) is algebraically identical to
for all
,
so
is constant and vector control acts only through
and
.
and are read once a day, as the IBM recomputes them every timestep, from series that follow each spray round’s logistic decay and each net distribution’s retention and decay.
E. Chemoprevention
MDA, SMC and PMC are applied as state jumps between days, as the IBM
applies them in update_mass_drug_admin(). The run stops at
the end of every day that carries a scheduled round. At each round the
target age band
is mapped onto the model age grid by fractional overlap
so narrow bands (for example PMC dose ages) are captured rather than dropped, and coarse groups are not over-treated. A fraction
of every state in each affected cell is treated successfully and routed by state, as the IBM routes it:
- the clinical,
,
and the LM-detectable asymptomatic,
,
go to the treated phase
(or
,
the drug’s slow-clearing share under resistance). They stay detectable
and infectious there, at their infectivity times the drug’s
drug_rel_c, for the Tr stay, (or its slow counterpart), and then join the chain ; - everyone else treated moves to the first stage of
:
,
,
the undetected
,
and the existing
,
,
,
and prophylaxis stages. The IBM resets
drug_timefor everyone it treats, so the protection of those already covered is renewed.
runs down its chain to , each stage left with probability a day: is the protected days of the coverage-weighted mixture of the chemoprevention drugs, and is matched to its variance as in §B.4. carries the protection left once out of the Tr stay, sized as the post-treatment chain is (§B.4), since the dose’s clock runs from the round in parallel with that stay. Both are distinct from the clinical chain.
A round takes effect the day after its scheduled timestep, as an IBM event does: it fires after the day’s processes, and its updates land at the end of the day. PMC, which the IBM delivers on an age trigger, is approximated as pulses every 30 days over each dose-age band.
F. Initial conditions
- The
malariasimulationlist is back-translated tomalariaEquilibriumparameter names (R/translate_params.R), andparameters$eq_paramsis merged over the result, taking precedence.set_equilibrium()always stores its own back-translation there, even when called witheq_params = NULL, so after anyset_equilibrium()call it is that stored set, notR/translate_params.R, that supplies every shared constant. - For each heterogeneity node
,
malariaEquilibrium::human_equilibrium_no_het()is solved on the model age grid at and treated fraction , with the coverage in force at timestep 0, as the IBM draws its initial humans (calculate_eq()). This is raw coverage, as the IBM passes it to the solver, which sends that share of clinical cases to treatment; efficacy acts during the run, so a treated seed relaxes onto the model’s own treated state, as the IBM’s does. The solution’s , ,prop, ,IB,ICA,ID,IVAandcAcolumns are used directly. The block is re-solved with a corrected prophylaxis ageing recursion, (upstream divides only the term by , leaving undivided), generalised to the -stage chain: stage 1 is fed by , stage by , and every stage ages at . The re-solve makes the seed the fixed point of the prophylaxis chain implemented here, whose balance is the same on the daily clock as in continuous time. - The equilibrium age structure is recomputed under (which may be the custom-demography baseline row), and the constant-hazard seed is rescaled onto it.
- is split between and by the slow-clearance fraction.
- Mosquito compartments are seeded from
initial_mosquito_counts()at the FOIM implied by the human equilibrium under the coverage in force at timestep 1, asset_equilibrium()sizes the IBM’s (itsinit_foim), withtotal_Mchosen so that exactly. Under the default demography . Under a custom demographytotal_Mis fixed to the IBM’s (ibm_total_M(); seeset_equilibrium()) and is the root oftotal_M(EIR) = total_M_IBM, found byuniroot()on , with steps 2 to 4 re-solved at each trial EIR. is set at the corresponding carrying capacity, floored at of the maximum for species with proportion 0, which would otherwise give in the larval term. - The three delay lines start full of the seed’s own values (the EIR , the incubation flux and the humans’ infectivity), as the IBM’s lagged values default to their initial values and its incubation queue starts full.
The clocks in steps 2 and 5 coincide unless treatment starts after
timestep 0. With the usual
set_clinical_treatment(timesteps = 1), the IBM, and so
fleet, starts untreated humans among mosquitoes sized for a
treated population, and both relax from there.
malariaEquilibrium encodes the continuous-time forms: a
linear force of infection, refractory boosting on the raw rate with the
unrounded
,
no at-risk restriction on boosting, continuous state exits with no
competing draw, and immunity that decays through a boost.
fleet reproduces the IBM’s per-day semantics, so the seed
is a close approximation to fleet’s fixed point, not the
fixed point itself. An undisturbed run’s PfPR(2-10) relaxes by under
0.5% and then holds (0.36% at EIR 20, flat to 0.006% over the last five
of fifteen years). Incidence relaxes further, mostly within five years:
under-5 clinical incidence by -0.3% at EIR 1, +1.5% at EIR 20 and +6% at
EIR 120, and severe incidence by at most 2%. Burn a run in before
reading its incidence. malariasimulation relaxes off its
own malariaEquilibrium seed for the same reason, and by
more, although the two seeds are not identical: the IBM solves on a
fixed 0–99.9 y grid with heterogeneity handled inside
human_equilibrium(), and does not correct the prophylaxis
recursion.
G. Outputs
There is one row per day, 1..timesteps, as
malariasimulation returns. Row
holds the state at the start of day
and the incidence during it, which is what the IBM renders at timestep
,
so row 1 is the seed. The columns are the IBM’s: a parameter list gives
the columns malariasimulation would give it, with the same
names and meanings (tests/testthat/test-output-parity.R
checks this against the IBM). Outputs are computed per age group,
aggregated to output bands in R, as fractions of the total human
population, and multiplied by human_population on
output:
| Output | Definition |
|---|---|
n_age_* |
|
n_detect_lm_*, p_detect_lm_*
|
.
The IBM samples each asymptomatic person’s detection into
n_detect_lm_* and sums the probabilities into
p_detect_lm_*; the expected count is both. Neither is a
prevalence, which is n_detect_lm_* /
n_age_*
|
n_detect_pcr_* |
:
the IBM convention, not malariaEquilibrium’s
sub-patent-weighted pos_PCR
|
n_inc_clinical_*, p_inc_clinical_*
|
: the day’s clinical episodes, the IBM’s count and its expectation |
n_inc_severe_*, p_inc_severe_*
|
: times the day’s infections, because the IBM draws severe cases from the same infected set as clinical ones |
n_inc_* |
, the day’s new infections, |
p_inc_* |
0: malariasimulation 3.0.0 renders it from
incidence_min_ages, a field no parameter list sets |
n_infections |
The day’s new infections at all ages |
ft |
, rendered only when clinical treatment is deployed, as in the IBM |
S_count, A_count, D_count,
U_count, Tr_count
|
Population totals by state as the IBM counts them:
S_count is
plus every prophylaxis chain, Tr_count all four treated
compartments |
ica_mean, icm_mean, ib_mean,
iva_mean, ivm_mean, id_mean
|
Each immunity’s mean over the population,
,
and by age as <name>_mean_* with the band’s
population as n_*, over
<name>_rendering_*. The IBM seeds its infants’
maternal immunity from the equilibrium bin 0.1 years older than they
are, so its icm_mean and ivm_mean run below
these until the seeded infants age out |
EIR, FOIM, Ph_count
|
Not in the IBM’s table.
,
the EIR per adult per year biting humans today (the IBM’s
EIR_<species> is the same lagged quantity in total
bites a day);
;
and the prophylaxis chains, the drug-protected part of
S_count
|
The vivax table differs where the IBM’s does (§V.6).
Mapping age groups onto bands. A band
[lower, upper] holds the whole-day ages lower
to upper, both ends included, as the IBM’s
in_age_range() does. Nobody is under a day old when the IBM
renders a day, since births land at the end of one, so on
fleet’s age axis, which starts at 0 at birth, the band
spans
days: 0_1824 and 1825_5474 tile the axis, and
0_1825 and 1825_5475 share one day’s cohort,
as in the IBM. A model age group contributes the fraction of its own
width inside that span, so over bands that tile a stretch of the axis
the weights sum to exactly 1 per group inside it: no family
double-counts, and none loses anyone it renders. The absorbing top group
is the exception, since it is not a finite interval: a band reaching
above its lower edge takes all of it, and a band ending exactly on that
edge takes none of it, with a warning.
Per-family bands. Each output family is emitted only
over its own *_rendering_ages band list, as in
malariasimulation, with n_age_* over the
union; an empty list renders nothing. postie treats every
output column as an independent age stratum, so if a family were emitted
over the union of all bands, the same ages would appear in two columns
and any person-day-weighted aggregate would count them twice, inflating
all-age clinical incidence by a factor of about 1.21.
H. Daily clock
The model is compiled from odin2 to C++
(src/malaria_daily.cpp) and advanced by dust2 as a
discrete-time system, one update a day; only the mosquito model is
sub-stepped within the day (§D). There is no solver tolerance, and the
sub-step count is the only time-stepping setting. The update from time
to
is the IBM’s timestep
and records that day’s counts, which is why the output rows start at day
1.
Every time-varying input is read at the start of the day. Every intervention series starts at its baseline value at , so the equilibrium seed is preserved. Two kinds of schedule meet the daily clock differently:
- Deployments (nets, spraying, vaccination, a carrying-capacity change) act in the IBM from the day after their timestep: nets, spraying and EPI vaccination are processes whose updates land at the end of the day, mass campaigns are events that fire after the day’s processes, and the carrying capacity is read at the start of the day. Their series carry a knot at that includes the deployment and one at that does not, so the update that reads time (day ) is the first to see it. The value at a knot is day ’s, so a net’s, a spray’s or a vaccine’s efficacy is read one day after deployment, as in the IBM. The vector-control, PEV and TBV series are interpolated linearly between knots, which suits the within-round decay each carries; the knot stops a deployment ramping in from the previous knot of a coarse background grid.
- Settings read on the day (treatment coverage, the drug mix,
resistance, death rates) take effect in the IBM on their own timestep
(
match_timestep(ts, timestep)), so their knots are moved one day earlier and day reads the value scheduled for timestep .
The PEV, TBV, carrying-capacity and (constant-demography) mortality
grids extend a year past timesteps; the vector-control grid
ends exactly at timesteps.
V. P. vivax model
A list from get_parameters(parasite = "vivax") runs a
second human block in the same compiled model. The falciparum block is
held empty, and under falciparum the vivax block collapses to one empty
cell. The biting model (§B.2), the delay lines and the mosquito model
(§D) are shared, fed by whichever block holds the population. A vivax
list uses the falciparum names wherever the two parasites share a
quantity (da, dd, dt,
cd, cu, ct, rc,
uc, rm, pcm and the clinical
curve phi0, phi1, ic0,
kc), so these reach the vivax block through the shared
parameters.
V.1 The hypnozoite dimension
malariasimulation gives each person an integer count of
hypnozoite batches,
.
Relapse is a hazard
,
linear in
,
but immunity, detectability and the U → S rate are not, and a mean count
would not carry them: people with many batches relapse often, so they
are more immune, and more often inside a refractory window (§V.3), than
the average of their age and heterogeneity group. Giving every count its
group’s pooled immunity puts clinical incidence 28% high at EIR 3. Every
vivax compartment and immunity stock is therefore indexed
(age, heterogeneity, level). The first levels hold the batch counts.
When a radical-cure drug’s liver-stage protection outlasts the
blood-stage protection given with it, further levels hold people whose
liver stage is still drug-protected (§V.5).
Counts 0 to 3 and have a level each, and the counts between share levels in pairs: , , for the default , giving eight levels for eleven counts. Within a pair the people follow a Poisson distribution. This is the shape a cell’s count takes when batches arrive with bites and are each lost at ; the cap at truncates it without changing the ratio of one count to the next. Its rate is fitted to the occupancies of the levels either side of the pair: for neighbours whose lowest counts are below and above,
solved by three fixed-point steps in
,
each reducing the error at least
-fold.
The pair’s top count then holds
of its people,
being the top count. These are the people a bite moves up a level; the
rest, at the bottom count, are the only ones a lost batch moves down
one. The level’s relapse hazard is
at its people’s mean count
.
Fitting the rate to the neighbours, rather than reading it from counts 0
and 1, keeps the shape right under radical cure, which empties the high
counts into 0. Against a ladder with a level per count
(ode_tuning(batch_bins = FALSE)), the pairs move no output
of the fleetcheck vivax suite by more than 0.4%, for a
quarter less run time. Pairing
as well would move under-five clinical incidence at EIR 30 by 0.9%,
against a replicate band 2.3% either side of the IBM’s median.
Each day, everyone:
- moves up one batch on an infection that came from a bite, capped at
,
and stays at the same count on a relapse. The bite share of a cell’s
infections is
,
the IBM’s
relative_rates, with (§V.2); - loses a batch with probability
,
whatever their disease state
(
hypnozoite_batch_decay_process), unless a bite formed a batch that day. The IBM queues the decay first and the bite’s , from the start-of-day , later, and the later update overwrites the earlier, at the top batch too, where the bite writes back.
The decay is a separate draw, independent of the day’s infection and progression, so it is applied after them, to the day’s outcome less its batch-formers. Someone who relapses and loses a batch on the same day ends a batch down and infected, as in the IBM, and the dead, reset as newborns by a later update, do not decay at all.
V.2 Infection and progression
The day’s expected infectious bites per person,
,
are those of §B.2, shared over both blocks’ population. Vivax counts
every bite rather than deduplicating them: a person bitten
times is infected with probability
,
which averaged over Poisson bites is
.
Relapse adds
,
and the total is reduced by PEV, as
calculate_vivax_infections() does, so the vaccine also
blocks relapses:
The IBM resolves infection and a person’s own progression (: A → U at , D → A at , U → S at ) in one competing draw a day: an event happens with probability , and it is the infection with share . So, per state,
with , and read at IAA + IAM. The bites are averaged before the draw. This is exact for S, whose infection has no competitor, but for D, A and U the IBM’s per-person draw is nonlinear in the day’s bite count (§V.7).
Everyone in S, U, A and D can be infected; an infected D stays in D.
Infected S and U pass first through LM detectability
:
the rest of S go to U, and the rest of U stay in U. LM-detectable S and
U, and all infected A, then pass through the clinical draw
. Clinical cases are treated
with coverage × efficacy as for falciparum; the rest go to D.
A is LM-detectable by definition, so LM prevalence counts
D, Tr and all of A, and PCR prevalence adds U.
V.3 Immunity, its refractory windows and its spread
IAA (anti-parasite: LM detectability and the U → S duration) and ICA (clinical) are boosted by infection once the refractory window since the last boost has passed (44 days for IAA, 4 for ICA), and decay by a day, a boosted person skipping the day’s decay as in §B.5. Immunity is held as stocks per cell, not means, because the ladder has cells that are exactly empty, where a mean’s inflows would divide by zero.
Who is inside their window is also carried, as a refractory stock per cell. It moves with the people like any other stock (ageing, dying, losing batches, moved up a batch by a bite, taken by radical cure) and is released when the window ends; a day’s infections then boost in the share . A renewal rate , the same in every cell, is correct for someone whose infection risk has been steady for the whole window, but not for vivax, because a bite both boosts a person and moves them up a batch into a cell whose relapse hazard is higher by . A child moving to one batch relapses within IAA’s window two times in three, inside the window of the bite that brought the batch. The renewal rate cannot see that a cell’s newcomers are freshly boosted, and put young children’s IAA 10–11% above the IBM’s; the stock captures it. Each window is a chain of stages passed on with probability a day, on a clock applied after the day’s other moves. ICA’s window runs exactly, one stage a day, and IAA’s as four 11-day stages: an exact 44-day chain changes infants’ IAA by 2.7% of itself and no other output by more than 0.7%, at 2.4 times the cost.
People who share a cell do not share an immunity: their batch history differs, and years with few batches mean far fewer infections. In the IBM at EIR 10 the coefficient of variation of IAA within a cell is 0.5 in infancy and 0.13 by age 20, and the vivax curves are steep (), so the mean clinical probability can be several times the probability at the mean immunity. Each cell therefore also carries , transported exactly as is, with a boost adding and decay multiplying by . The transport is exact because nothing that moves a person between cells depends on their own immunity once their cell is known. The variance a boost injects is that of the refractory renewal process, whose Fano factor ( the share of infections that boost) is far below one for IAA’s 44-day window. The curves are averaged over a gamma distribution with each cell’s mean and variance, at five Gauss–Hermite nodes, through the Wilson–Hilferty map. Against the IBM’s individuals at EIR 10, the gamma average of the LM-detection curve is within 1% of the true cell average at every age, where the curve at the mean is up to 10% off, and the within-cell variance of IAA is 0.96–1.01 times the IBM’s from age 3 to 20.
A boost also moves its person’s mean, by the day’s boost probability , which adds to over and above the variance. ICA carries that term too: with it the injection is exactly one boost’s worth per person-day with no window, and ICA’s spread stays within 6% of the IBM’s rule up to a day. IAA’s long window makes its boosts so regular that the term overshoots, so IAA keeps the renewal term alone. That holds at the daily infection probabilities of EIR 10 and below; above about it drifts from the IBM’s spread, in either direction depending on how steady a cell’s exposure has been (§V.7).
IAA and ICA share nodes: they are boosted by the same infections and
correlate at 0.92–0.97 within a cell below age 40, so “LM-detectable and
clinical” is averaged jointly. The nodes stand for people, so the
clinical curve takes the IBM’s per-person
(acquired_immunity_offset = 0.5, the vivax default).
parameters$immunity_spread = FALSE evaluates the curves at
the cell mean, with no offset.
Maternal immunity is algebraic, as in §B.3: IAM and ICM are times the population-weighted mean IAA and ICA of those aged 20 to 21 in the same heterogeneity group (the mothers the IBM draws from), waning at .
V.4 Treatment
The treated leave Tr at a day into a post-treatment chain that carries the level dimension, since people keep losing batches while protected. Its stage count follows the daily rule of §B.4: eight stages for chloroquine.
V.5 Radical cure
Of everyone treated, a share drug_hypnozoite_efficacy
lose every batch, whether or not the blood stage cleared, since the IBM
draws the two independently. They start liver-stage protection, which
blocks new batches (not infection) for a Weibull time from the dose.
Protection is an attribute of the person, not of their disease state, so
it sits on the level dimension as a chain of levels matched to the
protected days,
stages: eleven for tafenoquine’s 27.
Liver-stage protection matters only while a bite can infect, and nobody in Tr or the post-treatment chain is infected, so protection that ends inside the blood-stage protection given with it guards only the few whose blood stage the drug did not clear. Primaquine’s 4.7 days end inside chloroquine’s 16 after Tr, so primaquine has no protected levels: its four would add half again to every vivax compartment, for an output change below 0.2%. A schedule whose longest liver-stage protection outlasts its shortest blood-stage protection keeps them, sized for the shortest-protecting radical-cure drug on it. A switch from primaquine to tafenoquine therefore keeps four stages: tafenoquine’s mean protection is kept and its spread widened, a standard deviation of 12.5 days against the Weibull’s 6.3. The last level returns to batch 0.
A primaquine stage on such a schedule is left with probability 0.85 a day, faster than Tr is left (0.63), so the chain’s clock acts on what the day leaves: someone who leaves Tr and moves a stage on the same day does both, and no cell can lose more than it holds. The day’s radically cured join the first level after the clock has acted, so a stage is left no earlier than the day after the dose. They take with them their immunity, their refractory windows, and the spread their boosts injected. The immunity they take is that of the nodes that fell ill, not their cell’s mean, since the clinical draw is taken node by node and the less immune fall ill more.
V.6 Seeding and outputs
The seed is the IBM’s own: malariaEquilibriumVivax on
malariasimulation’s durations, solved on
fleet’s age grid under the treatment coverage at timestep
0, with the mosquitoes sized under the coverage at timestep 1, as
set_equilibrium() does. Both use raw coverage, as the IBM
passes it to the solver. With heterogeneity off, the IBM still solves
the heterogeneous equilibrium, sizes the mosquitoes from all of it, and
draws everyone from its first group, the least bitten;
fleet does the same. The IBM draws each person’s state and
batch count from the equilibrium’s S, D, A, U and T within their age and
heterogeneity group, omitting its prophylaxis state, so nobody starts
drug-protected; fleet does the same. Every cell starts at
its mean immunity (no spread), as initial_immunity() starts
the IBM, and nobody starts inside a refractory window, as the IBM’s
last_boosted starts at -1.
Neither model holds that state: both build up a within-cell spread
the equilibrium does not have, so both relax from it together, and
further than a falciparum run does. From EIR 10 down to 0.3 a vivax
run’s LM prevalence settles 2 to 14% above the seed, its clinical
incidence 15 to 21% above it and its realised EIR 4 to 17% above
init_EIR, within about eight years at EIR 3 and over two
decades at 0.3, where it overshoots first. The IBM moves as far: its
realised EIR ends 18%, 13% and 8% above init_EIR at EIR
0.3, 1 and 3. With immunity_spread = FALSE,
fleet holds its seed to within 1.3%, so the spread is what
moves both. There is no infectivity lag: vivax has
delay_gam = 0.
The output table is the IBM’s vivax table: no severe disease and no
p_detect_lm_*, and in their place n_relapses,
n_with_hypnozoites, the immunity means
ica_mean, icm_mean, iaa_mean,
iam_mean and hypnozoites_mean, and their age
bands when incidence_relapse_rendering_*,
n_with_hypnozoites_rendering_* and
<immunity>_rendering_* are set (§G).
V.7 Limitations
- Immunity is correlated with disease state within a cell. The IBM’s immunity-dependent transitions sort people by immunity: clearance from U is faster with more IAA, so S holds more of the immune, and the clinical draw takes the least immune into D (their IAA is 0.6–0.8 times their cell’s mean from age 5). A mean field with one immunity distribution per cell cannot carry that sorting, and carrying immunity per disease state would double or triple the cost of a vivax run. At EIR 10 this leaves LM prevalence and clinical incidence in school-age children 1–3% above the IBM’s.
-
Relapses on days without a bite.
malariasimulation3.0.0 evaluates relapses only on days when someone is bitten, so on a day with no infectious bite anywhere the IBM loses every relapse;fleetkeeps them. This is a defect in the IBM and is not replicated. Such a day occurs with probability about , for the mean infectious bites per person per day and the population: in a 10,000-person run it exceeds 5% only below an EIR of about 0.14, and in 50,000 below about 0.03, unless vector control reduces the day’s bites further. -
The day’s bite count is averaged before the competing
draw. The IBM’s infection-or-progression draw and its
bite-or-relapse split are per person, nonlinear in the day’s bite count
;
fleetgives everyone in a cell the draw at the averaged hazard. This is exact for S, puts D’s infection probability 0.1–0.5% low and A’s and U’s by less, and puts the bite share of infections 0.2–1% low. - Refractory people are infected at their cell’s average rate, although those in Tr and the drug-protected cannot be infected, so under treatment a cell’s infections fall inside a window slightly too often: an estimated up to 1.6% too few IAA boosts under age 2 at 50% chloroquine coverage and EIR 10.
- IAA’s within-cell spread at high transmission. The renewal closure (§V.3) is checked against the IBM at EIR 10 and below. Above a daily infection probability of about 0.05 it drifts from the IBM’s spread, and at the highest EIRs a cell’s variance can compute below zero and is read as none.
- Tr is fully protected, whereas the IBM’s prophylaxis on the day after treatment is , just below one for the vivax drugs.
