Metapopulation

# Load the requisite packages:
library(malariasimulation)
library(malariaEquilibrium)
# Set colour palette:
cols  <- c("#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2", "#D55E00", "#CC79A7")

The metapopulation model runs the individual-based model for multiple parameterized units (countries, regions, admins, etc.) simultaneously. The inputted mixing matrix allows for the transmission of one unit to affect the transmission of another unit. ‘Mixing’ in the model occurs through the variables foim_m and EIR.

Here we will set up a case study of three distinct units and compare output with various transmission mixing patterns.

Run metapopulation simulation

Parameterisation

# set variables
year <- 365
human_population <- 1000
sim_length <- 5 * year
EIR_vector <- c(1, 2, 5)

# get parameters
ms_parameterize <- function(x){ # index of EIR
  
  params <- get_parameters(list(human_population = human_population,
                                model_seasonality = FALSE,
                                individual_mosquitoes = FALSE))
  
  # setting treatment
  params <- set_drugs(params, list(AL_params))
  params <- set_clinical_treatment(params, drug = 1, timesteps = 1, coverages = 0.40)

  params <- set_equilibrium(params, init_EIR = EIR_vector[x])
  
  return(params)
  
}

# creating a list of three parameter lists
paramslist <- lapply(seq(1, length(EIR_vector), 1), ms_parameterize)

Simulation

Our parameters for the three distinct units are stored in the object paramslist. Next we will run the metapopulation model with these parameters. We will plug in three mixing matrices - A) isolated, B) semi-mixed, C) perfectly mixed.

# isolated
mix_1 <- diag(length(EIR_vector))

# semi-mixed
mix_2 <- matrix(c(0.8, 0.1, 0.1, 
                  0.1, 0.8, 0.1,
                  0.1, 0.1, 0.8),
               nrow = 3, ncol = 3)

# perfectly-mixed
mix_3 <- matrix(rep(1/3, 9), nrow = 3, ncol = 3)

# run model
set.seed(123)

metapop_loop <- function(mixing, mixnam){ # mixing matrix 

  output <- run_metapop_simulation(timesteps = sim_length,
                                   parameters = paramslist,
                                   correlations = NULL,
                                   mixing_tt = 1,
                                   export_mixing = list(mixing), 
                                   import_mixing = list(mixing), 
                                   p_captured = list(matrix(rep(0, 9), nrow = 3, ncol = 3)),
                                   p_captured_tt = 1,
                                   p_success = 0.95)
  
  # convert to dataframe and label EIR and mixing matrix type
  output <-  do.call('rbind', output)
  output$EIR <- c(sort(rep(EIR_vector, sim_length)))
  
  return(output)
  
}

output1 <- metapop_loop(mix_1)
output1$mix <- 'isolated'
  
output2 <- metapop_loop(mix_2)
output2$mix <- 'semi-mixed'
  
output3 <- metapop_loop(mix_3)
output3$mix <- 'perfectly-mixed'
  
output <- rbind(output1, output2, output3)

# get mean PfPR 2-10 by year
output$prev2to10 = output$p_detect_lm_730_3650 / output$n_age_730_3650
output$year = ceiling(output$timestep / 365)
output$mix = factor(output$mix, levels = c('isolated', 'semi-mixed', 'perfectly-mixed'))
output <- aggregate(prev2to10 ~ mix + EIR + year, data = output, FUN = mean)

Visualisation

Now let’s visualize the results of mixing on PfPR2-10:

Panel_spec <- rbind(c(0,0.37,0,1),
                    c(0.37,0.635,0,1),
                    c(0.635,0.9,0,1),
                    c(0.9,1,0,1))

Margin_spec <- rbind(c(0.8,0.8,0.3,0.1),
                     c(0.8,0.1,0.3,0.1),
                     c(0.8,0.1,0.3,0.1))


Mix_vec <- unique(output$mix)
EIR_vec <- unique(output$EIR)

Xlab_vec <- c("","Time (years)","")
Ylab_vec <- c(expression(paste(italic(Pf),"PR"[2-10])),"","")
New_vec <- c(F,T,T)

Plot_Mixing <- function(output){
  for(i in 1:3){
    par(fig=Panel_spec[i,], cex = 0.8, mai = Margin_spec[i,], new = New_vec[i])
    with(subset(output,output$mix == Mix_vec[i] & output$EIR == EIR_vec[1]),{
      plot(x = year, y = prev2to10, type = "l", col = cols[1], lwd = 2,
           ylim = c(0,0.36), yaxt = "n",
           xaxs = "i", yaxs = "i",
           ylab = Ylab_vec[i], xlab = Xlab_vec[i])
      abline(h = seq(0.05,0.25, by = 0.05), lty = 2, col = "grey80", lwd = 0.5)
      sapply(2:4, function(x){segments(x0 = x, x1 = x, y0 = 0, y1 = 0.3,
                                       lty = 2, col = "grey80",lwd = 0.5)})
      # grid(lty = 2, col = "grey80", lwd = 0.5)
      if(i ==1){axis(side = 2, at = seq(0,0.4,by=0.1))}
      title(gsub("(^[[:alpha:]])", "\\U\\1", Mix_vec[i], perl=TRUE), line = -1.4, cex.main = 0.9)
      abline(h = 0.3)
      
    })
    for(j in 2:3){
            with(subset(output,output$mix == Mix_vec[i] & output$EIR == EIR_vec[j]),
                 points(x = year, y = prev2to10, type = "l", col = cols[j], lwd = 2))
    }
  }
  par(fig=c(0.9,1,0,1), cex = 0.8, new = T, xpd = T, mai = c(0,0,0,0))
  legend("left", legend = EIR_vec, col = cols[1:3], lwd = 2,
         bty = "n", lty = 1, title = "EIR", y.intersp = 2)
}

Plot_Mixing(output)