knitr::opts_chunk$set( collapse = TRUE, comment = "#>", dpi=300, fig.width=7 )
# 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.
# 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)
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)
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)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.