Nothing
## ----include = FALSE--------------------------------------
knitr::opts_chunk$set(
collapse = TRUE,
comment = "#>",
fig.width = 7,
fig.height = 6,
fig.path = ""
)
## ----setup------------------------------------------------
library(poems)
library(epizootic)
nsims <- 1
parallel_cores <- 1
timesteps <- 23
## ----region-----------------------------------------------
library(raster)
epizootic::finch_region
region <- Region$new(template_raster = finch_region)
raster::plot(region$region_raster, colNA = "blue",
main = "Study Region")
## ----bsl--------------------------------------------------
data("bsl_raster")
raster::plot(bsl_raster, colNA = "blue",
main = "Breeding Season Length (days)")
## ----carrying-capacity------------------------------------
data("habitat_suitability")
raster::plot(habitat_suitability, colNA = "blue",
main = "Habitat Suitability")
## ----initial-abundance------------------------------------
data("initial_abundance")
region$raster_from_values(initial_abundance[1, ]) |>
raster::plot(colNA = "blue", main = "Susceptible Juveniles")
## ----fixed parameters-------------------------------------
model_template <- DiseaseModel$new(
simulation_function = "disease_simulator",
region = region,
time_steps = timesteps,
populations = region$region_cells,
replicates = 1,
stages = 2, # life cycle stages
compartments = 4, # disease compartments
seasons = 2, # seasons in a year
mortality_unit = list(c(1, 1, 0, 0, 1, 1, 0, 0), # is mortality seasonal
c(1, 1, 0, 0, 1, 1, 0, 0)), # or daily?
fecundity_unit = rep(1, 8), # is fecundity seasonal or daily?
fecundity_mask = rep(c(0, 1), 4), # which stages/compartments reproduce
transmission_unit = rep(0, 4), # Is transmission rate seasonal or daily?
transmission_mask = c(1, 1, 0, 0, 1, 1, 0, 0), # which compartments can become # infected
recovery_unit = rep(0, 4), # is recovery rate seasonal or daily?
recovery_mask = c(0, 0, 1, 1, 0, 0, 1, 1), # which compartments can recover
breeding_season_length = bsl_raster,
hs = habitat_suitability,
abundance = initial_abundance,
dispersal_type = "stages", # indicates that life cycle stages disperse
# differently
simulation_order = list(c("transition", "season_functions", "results"),
c("dispersal", "season_functions", "results")),
results_selection = c("abundance"), # what do want included in the result?
results_breakdown = "segments", # are the results broken down by life cycle
# stage, disease compartment, or both?
season_functions = list(siri_model_summer, siri_model_winter),
verbose = FALSE,
random_seed = 648,
attribute_aliases = list(
mortality_Sj_summer = "mortality$summer$a",
mortality_Sa_summer = "mortality$summer$b",
mortality_I1j_summer = "mortality$summer$c",
mortality_I1a_summer = "mortality$summer$d",
mortality_Rj_summer = "mortality$summer$e",
mortality_Ra_summer = "mortality$summer$f",
mortality_I2j_summer = "mortality$summer$g",
mortality_I2a_summer = "mortality$summer$h",
mortality_Sj_winter = "mortality$winter$a",
mortality_Sa_winter = "mortality$winter$b",
mortality_I1j_winter = "mortality$winter$c",
mortality_I1a_winter = "mortality$winter$d",
mortality_Rj_winter = "mortality$winter$e",
mortality_Ra_winter = "mortality$winter$f",
mortality_I2j_winter = "mortality$winter$g",
mortality_I2a_winter = "mortality$winter$h",
beta_Sj_summer = "transmission$summer$a",
beta_Sa_summer = "transmission$summer$b",
beta_Rj_summer = "transmission$summer$c",
beta_Ra_summer = "transmission$summer$d",
beta_Sj_winter = "transmission$winter$a",
beta_Sa_winter = "transmission$winter$b",
beta_Rj_winter = "transmission$winter$c",
beta_Ra_winter = "transmission$winter$d",
recovery_I1j_summer = "recovery$summer$a",
recovery_I1a_summer = "recovery$summer$b",
recovery_I2j_summer = "recovery$summer$c",
recovery_I2a_summer = "recovery$summer$d",
recovery_I1j_winter = "recovery$winter$a",
recovery_I1a_winter = "recovery$winter$b",
recovery_I2j_winter = "recovery$winter$c",
recovery_I2a_winter = "recovery$winter$d",
dispersal1 = "dispersal$a",
dispersal2 = "dispersal$b"
)
)
## ----test consistency and completeness--------------------
model_template$is_complete()
model_template$is_consistent()
## ----lhs--------------------------------------------------
lhs_generator <- LatinHypercubeSampler$new()
# Dispersal parameters
lhs_generator$set_beta_parameter("dispersal_p_juv", alpha = 9.834837,
beta = 2.019125)
lhs_generator$set_beta_parameter("dispersal_p_adult", alpha = 1.5685,
beta = 2.365266)
lhs_generator$set_truncnorm_parameter("dispersal_r_juv", lower = 0, upper = 1500,
mean = 725.9071, sd = sqrt(204006.6))
lhs_generator$set_normal_parameter("dispersal_r_adult", mean = 679.4172,
sd = sqrt(18594.59))
lhs_generator$set_uniform_parameter("dispersal_source_n_k_cutoff", lower = 0,
upper = 1)
lhs_generator$set_uniform_parameter("dispersal_source_n_k_threshold", lower = 0,
upper = 1)
lhs_generator$set_uniform_parameter("dispersal_target_n_k_cutoff", lower = 0,
upper = 1)
lhs_generator$set_uniform_parameter("dispersal_target_n_k_threshold", lower = 0,
upper = 1)
# Population growth parameters
lhs_generator$set_uniform_parameter("abundance_threshold", lower = 0, upper = 25, decimals = 0)
lhs_generator$set_uniform_parameter("initial_release", lower = 5, upper = 50, decimals = 0)
lhs_generator$set_uniform_parameter("density_max", lower = 186000, upper = 310000, decimals = 0)
lhs_generator$set_poisson_parameter("fecundity", lambda = 8.509018)
# Transmission parameters
lhs_generator$set_uniform_parameter("beta_Sa_winter", lower = 0, upper = 0.07588)
lhs_generator$set_uniform_parameter("beta_Sa_summer", lower = 0, upper = 0.007784)
lhs_generator$set_triangular_parameter("Sj_multiplier", lower = 0, upper = 8.5,
mode = 3)
lhs_generator$set_beta_parameter("beta_I2_modifier", alpha = 1.547023,
beta = 0.4239236)
# Mortality parameters
lhs_generator$set_beta_parameter("mortality_Sj_winter", alpha = 3.962104,
beta = 2.228683)
lhs_generator$set_beta_parameter("mortality_Sa_winter", alpha = 21.89136,
beta = 19.59278)
lhs_generator$set_beta_parameter("mortality_Sj_summer", alpha = 14.51403,
beta = 21.53632)
lhs_generator$set_beta_parameter("mortality_I1j_summer", alpha = 2.756404,
beta = 62.47181)
lhs_generator$set_beta_parameter("mortality_I1j_winter", alpha = 2.756404,
beta = 62.47181)
lhs_generator$set_beta_parameter("mortality_I1a_summer", alpha = 1.771183,
beta = 27.19457)
lhs_generator$set_beta_parameter("mortality_I1a_winter", alpha = 1.678424,
beta = 41.15975)
lhs_generator$set_beta_parameter("mortality_I2_modifier", alpha = 1.033367,
beta = 3.505319)
# Recovery parameters
lhs_generator$set_beta_parameter("recovery_I1", alpha = 9.347533,
beta = 620.1732)
lhs_generator$set_beta_parameter("recovery_I2", alpha = 1.181112,
beta = 29.18489)
# How many birds are infected in DC at timestep 1?
lhs_generator$set_uniform_parameter("infected_t1", lower = 1, upper = 20, decimals = 0)
sample_data <- lhs_generator$generate_samples(number = nsims,
random_seed = 630)
sample_data$sample <- 1:nsims
sample_data$mortality_Sa_summer <- 0
sample_data$mortality_I2j_summer <- sample_data$mortality_I2_modifier * sample_data$mortality_I1j_summer
sample_data$mortality_I2j_winter <- sample_data$mortality_I2_modifier * sample_data$mortality_I1j_winter
sample_data$mortality_I2a_winter <- sample_data$mortality_I2_modifier * sample_data$mortality_I1a_winter
sample_data$mortality_I2a_summer <- sample_data$mortality_I2_modifier * sample_data$mortality_I1a_summer
sample_data$mortality_Rj_summer <- sample_data$mortality_Sj_summer
sample_data$mortality_Ra_summer <- sample_data$mortality_Sa_summer
sample_data$mortality_Rj_winter <- sample_data$mortality_Sj_winter
sample_data$mortality_Ra_winter <- sample_data$mortality_Sa_winter
sample_data
## ----spatial correlation----------------------------------
env_corr <- SpatialCorrelation$new(region = region,
amplitude = 0.99,
breadth = 850,
distance_scale = 1000)
env_corr$calculate_compact_decomposition(decimals = 4)
## ----adult dispersal--------------------------------------
b_lookup <- data.frame(d_max = -Inf, b = 0:904)
for (i in 2:904) {
b_lookup$d_max[i] <- which.max(exp(-1*(1:1501)/b_lookup$b[i]) <= 0.19)
}
b_lookup$d_max[905] <- 1501
adult_dispersal_gen <- DispersalGenerator$new(
region = region,
spatial_correlation = env_corr,
distance_classes = seq(10, 1500, 10),
distance_scale = 1000, # km
dispersal_function_data = b_lookup,
inputs = c("dispersal_p_adult",
"dispersal_r_adult"),
attribute_aliases = list(dispersal_r_adult = "dispersal_max_distance",
dispersal_p_adult = "dispersal_proportion",
dispersal_adult = "dispersal_data"),
decimals = 3
)
# This stage is computationally intensive
distance_matrix <- adult_dispersal_gen$calculate_distance_matrix()
adult_dispersal_gen$calculate_distance_data(distance_matrix = distance_matrix)
## ----juvenile dispersal-----------------------------------
juvenile_dispersal_gen <- DispersalGenerator$new(
region = region,
spatial_correlation = env_corr,
distance_classes = seq(10, 1500, 10),
distance_scale = 1000, # km
dispersal_function_data = b_lookup,
decimals = 3,
inputs = c("dispersal_p_juv",
"dispersal_r_juv"),
attribute_aliases = list(dispersal_r_juv = "dispersal_max_distance",
dispersal_p_juv = "dispersal_proportion",
dispersal_source_n_k_cutoff = "dispersal_source_n_k$cutoff",
dispersal_juv = "dispersal_data"),
decimals = 3
)
juvenile_dispersal_gen$distance_data <- adult_dispersal_gen$distance_data
## ----capacity-gen-----------------------------------------
capacity_gen <- Generator$new(
description = "capacity",
region = region,
generate_rasters = FALSE,
time_steps = timesteps,
generative_requirements = list(
initial_abundance = "function",
carrying_capacity = "function"
),
inputs = c("density_max", "hs", "abundance", "infected_t1"),
outputs = c("initial_abundance", "carrying_capacity")
)
# Here we subset the habitat suitability raster to have only the region cells,
# and we add the burn in. Also, we tell the generator to generate the
# carrying_capacity based on "density_max" and "hs".
capacity_gen$add_function_template(
param = "carrying_capacity",
function_def = function(params) {
hs_matrix <- params$hs |> as.matrix() |>
_[params$region$region_indices, 1:params$time_steps]
hs_matrix[!is.finite(hs_matrix)] <- 0
# round the density values
round(params$density_max * hs_matrix)
},
call_params = c("density_max", "hs", "region",
"time_steps")
)
# Here we tell the generator what function to use to generate initial_abundance
# based on the number of finches first infected in Washington, D.C.
capacity_gen$add_function_template(
param = "initial_abundance",
function_def = function(params) {
abundance <- params$abundance
infected_adults <- round(runif(1, 0, params$infected_t1))
infected_juv <- params$infected_t1 - infected_adults
abundance[3, 3531] <- infected_juv
abundance[4, 3531] <- infected_adults
return(abundance)
},
call_params = c("abundance", "infected_t1")
)
test_capacity <- capacity_gen$generate(input_values = list(density_max = 186000, infected_t1 = 5, hs = habitat_suitability, abundance = initial_abundance))
raster::plot(
region$raster_from_values(test_capacity[[1]][1,]),
main = "Initial abundance of susceptible juveniles",
colNA = "blue"
)
## ----simulate---------------------------------------------
handler <- SimulationHandler$new(
sample_data = sample_data,
model_template = model_template,
generators = list(juvenile_dispersal_gen,
adult_dispersal_gen,
capacity_gen),
parallel_cores = parallel_cores,
results_dir = tempdir()
)
sim_log <- handler$run()
sim_log$summary
## ----results----------------------------------------------
results <- qs::qread(file.path(tempdir(), "sample_1_results.qs"))
str(results)
## ----time-series------------------------------------------
plot(y = results$all$abundance_segments$stage_1_compartment_2[, 1],
x = 1994:2016,
ylab = "Abundance", xlab = "Year",
main = "Juveniles Infected for the First Time (Summer)")
## ----map--------------------------------------------------
region$raster_from_values(results$abundance_segments$stage_2_compartment_1[ , 23, 1]) |>
raster::plot(colNA = "blue", main = "Susceptible Adults in Summer 2016")
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.