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
We let
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
and
As we have defined our variables, one of them is not necessary, since
The Multi-Patch Model
In a model with
Now, we also need to define mosquito movement. We let
We let
Implementation Notes:
In the implementation, we could choose models where the EIP is
distributed over some period but where the fraction maturing after time
Noting that in the modulo arithmetic,
Verification
We can verify our model by solving for steady states.
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