Basic Mosquito Infection Dynamics in Discrete Time
Discrete-Time Dynamics
Source:vignettes/RM-dts-Mosquito.Rmd
RM-dts-Mosquito.Rmd
In this vignette, we present a model for the dynamics of malaria infection in adult mosquito populations. We call it a Ross-Macdonald model because it makes the same basic assumptions as the model that Macdonald analyzed in 1952. While that model was developed using differential equations, the equations we describe herein are difference equations.
We begin by discrete-time model in a simple population, with one patch, and then we present the equations for the multi-patch model.
In a Single Patch
We define several variables describing adult female mosquitoes. Let denote the total density of uninfected mosquitoes at time We assume that mosquitoes emerge from aquatic habitats at the rate and that a proportion of mosquitoes, , survives each day. The total density of mosquitoes is described by an equation:
We let denote the proportion of mosquitoes that blood feeds each day, and let denote the density of parous mosquitoes:
To model the infection process we need two additional parameters:
- the proportion of blood meals that are taken on humans
- fraction of human blood meals that infect the mosquito
Let denote the density of uninfected mosquitoes:
Let denote a the density of cohorts of infected mosquitoes infected days ago:
We let denote the oldest cohort of infected mosquitoes that we would wish to track. For mosquitoes infected more than 1 day ago, we let be the fraction that becomes infectious the next day. If we modeled the EIP with a fixed delay, then for , and . Mosquitoes would become infectious on day
and
denote the density of infectious mosquitoes at time
As we have defined our variables, one of them is not necessary, since
The Multi-Patch Model
In a model with patches, the model is defined as before, but now we let , and be vectors of length and we let be a vector of length (where ). We let denote a matrix, where each row is a cohort of mosquitoes, and where column represents the mosquitoes in a location. We let denote the cohort:
Now, we also need to define mosquito movement. We let denote a vector describing the proportion of mosquitoes that emigrates from each patch, and let $\cal K$ denote a matrix describing the fraction of emigrating mosquitoes that end up in every other patch, where $$\mbox{diag}\; {\cal K} = 0.$$ and where the columns sum up to a number that is less than or equal to one, where the gap represents mortality occurring during dispersal.
We let denote the demographic matrix where:
$$\Omega = \mbox{diag}\left( p \left( 1-\sigma \right) \right) + \mbox{diag}\left( p \sigma \right) \cdot {\cal K} $$ Now the dynamics are very similar:
Implementation Notes:
In the implementation, we could choose models where the EIP is distributed over some period but where the fraction maturing after time is continuous. We have chosen a rotating index to track age of infection cohorts in the matrix using modulo arithmetic, each columns tracks a single cohort for days. On the day, the column is added to the one before, and then we compute The computation thus does this:
Noting that in the modulo arithmetic, , we get:
Verification
We can verify our model by solving for steady states.
For we get a recursive relationship:
and for we get:
and
Demo
rm1 <- xds_setup(MYZname = "RM", Xname = "trivial", xds = 'dts')
Om <- with(rm1$MYZpar[[1]], compute_Omega_dts(pp, ssigma, mmu, calK))
dts_solve(rm1, 200) -> rm1
#dts_steady(rm1) -> rm1
with(rm1$outputs$orbits$MYZ[[1]], {
plot(time, M, type = "l")
lines(time, U, col = "darkblue")
lines(time, Y, col = "purple")
lines(time, Z, col = "darkred")
})
xds_plot_YZ(rm1)
compute_MYZ_equil = function(pars, Lambda, kappa, i=1){
with(pars$MYZpar[[i]],{
Mbar <- Lambda/(1-p)
Pbar <- f*Mbar/(1 - p + f)
Ubar <- Lambda/(1-p*exp(-f*q*kappa))
Y1 <- Omega*(1-exp(-f*q*kappa))*Ubar
Yi = Y1
Y = Yi
for(i in 2:(max_eip-1)){
Yi <- Omega*Yi*(1-G[i])
Y = Y+Yi
}
Yn <- Omega*Yi
Y = Y + Yn
Zbar <- Omega*Yn/(1-p)
return(c(M = Mbar, P=Pbar, U=Ubar, Y=Y, Z= Zbar))
})}
compute_MYZ_equil(rm1, 1000, .1)
c(
M = tail(rm1$outputs$orbits$MYZ[[1]]$M, 1),
P = tail(rm1$outputs$orbits$MYZ[[1]]$P, 1),
U = tail(rm1$outputs$orbits$MYZ[[1]]$U, 1),
Y = tail(rm1$outputs$orbits$MYZ[[1]]$Y, 1),
Z = tail(rm1$outputs$orbits$MYZ[[1]]$Z, 1)
)
rm10 <- dts_setup(Xname = "trivial", nPatches = 10, membership = 1:10)
rm10$Lpar[[1]]$scale = 1.5^c(1:10)
dts_solve(rm10, 200) -> rm10