knitr::opts_chunk$set( collapse = TRUE, comment = "#>", fig.path = "man/figures/README-", out.width = "100%" )
This R package provides tools for simulating species geographic range dynamics. Range simulations combine a demographic module that simulates local population change as a function of species characteristics and environmental conditions, and a dispersal module that simulates movement among grid cells.
This is a project of Barracuda, an NSF-funded research program focused on modeling landscape adaptation to climate change. The package is still under development, and API changes and additional features will be implemented over time.
You can install the development version of deranged from GitHub with:
# install.packages("devtools") devtools::install_github("matthewkling/deranged")
If you're on MacOS and encounter compilation errors when attempting to install the package, installing the latest version of gfortran may solve the issue.
In this toy example we'll run a range simulation for an imaginary plant species. We'll use a stage-based population matrix model representing three life history stages: seeds, juveniles, and adults.
First we'll mock up some spatial data. The convenience function landscape_template
generates a skeleton object with the necessary data structure, a list with two components. The first piece, n
, is a 3-D array of initial population sizes for each life history stage for each spatial grid cell; here we'll start with 10 adults in one of the grid cells. The second piece, e
, is a 4-D array of environmental data, which maximally can include multiple environmental variables that vary spatially and temporally; in this example we'll use a single, time-invariant environmental grid with values ranging in a spatial gradient from 0 to 1.
library(deranged) set.seed(123) stages <- c("s", "j", "a") # names for life history stages ls <- landscape_template(n_row = 25, n_col = 25, names = stages) # spatial data template ls$n[10,10,3] <- 10 # start with 10 adults in one grid cell ls$e[] <- seq(0, 1, length.out = prod(dim(ls$e))) # set environmental values
The other input to the simulation is a set of parameters representing the species' biology. This includes demographic parameters and dispersal parameters. Here we'll use species_template
to create a parameter object, and then set some of the parameter values to fit our species.
For this matrix model, the demographic parameters represent probabilities of transitioning from one stage to another at each time step; these probabilities can be constant, or they can vary as a function of population levels (density dependence) or environmental values (environmental dependence). A given transition probability is calculated as the intercept term from the alpha
matrix, plus the coefficients from the beta
array multiplied by population levels, plus the coefficients from the gamma
array multiplied by environmental values. In this example we'll make juvenile survival depend on the environment, and we'll make juvenile-adult transitions depend on the number of adults.
The other parameters control dispersal distances. Users can supply any arbitrary probability density function, but for now we'll stick with the lognormal distribution included in the template and just modify its parameter values.
sp <- species_template(n_env = dim(ls$e)[4], names = stages) # invariant transitions sp$alpha["j", "s"] <- .01 sp$alpha["a", "a"] <- .9 sp$fecundity["a"] <- 100 # environmentally dependent juvenile survival sp$alpha["j", "j"] <- .1 sp$gamma["j", "j", "v1"] <- .8 # density dependent juvenile-adult transition sp$alpha["a", "j"] <- .1 sp$beta["a", "j", "a"] <- -.001 # parameters for lognormal dispersal kernel sp$kernel$params$L <- .3 sp$kernel$params$S <- 3
Using these landscape and species inputs, we can now simulate
range dynamics over time. At each time step, the species goes through a demographic transition, and then dispersal occurs. The function returns an array of populations over space and time.
d <- simulate(sp, ls, # data and parameter inputs from above n_steps = 200, # number of iterations to simulate record = 3) # record populations for life stage 3 (adults)
We can quickly visualize the output using a couple plotting functions. The first plot below shows population time series for 10 random grid cells, with populations in many cells leveling off due to density dependence. The second plot shows snapshots of spatial population patterns over time, with an east-west gradient in population size resulting from the spatial environmental gradient.
library(tidyverse) d %>% plot_lines() %>% print() d %>% plot_heatmaps() %>% print()
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.