turnover {secr} | R Documentation |
sim.popn
can simulate a multi-session population with known between-session survival, recruitment and movement probabilities. The parameter settings to achieve this are passed to sim.popn
in its ‘details’ argument. Components of ‘details’ that are relevant to turnover are described below; see sim.popn
for others.
Multi-session populations are generated in sim.popn
whenever its argument ‘nsessions’ is greater than 1. If details$lambda
remains NULL (the default) then the population for each successive session is generated de novo from the given density model (model2D, D etc.). If a value is specified for details$lambda
then only the first population is generated de novo; remaining populations are generated iteratively with probabilistic mortality, recruitment and movement as described here.
sim.popn
details argumentComponent | Description | Default |
phi | per capita survival rate \phi | 0.7 |
survmodel | probability model for number of survivors | ``binomial" |
lambda | finite rate of increase \lambda = N_{t+1} / N_t | none |
recrmodel | probability model for number of recruits | ``poisson" |
superN | optional superpopulation size for `multinomial' recruitment model | see below |
Nrecruits | number of recruits to add at t+1 for `specified' recruitment model | 0 |
movemodel | ``static", ``uncorrelated", ``normal", ``exponential", ``t2D" or a user function | ``static" |
move.a | first parameter of movement kernel (replacing sigma.m) | 0 |
move.b | second parameter of movement kernel | 1 |
edgemethod | treatment of animals that cross the boundary | ``wrap" |
sigma.m | deprecated in 3.2.1; use move.a | 0 |
wrap | deprecated in 3.1.6; use edgemethod | TRUE i.e. edgemethod = ``wrap" |
Survival is usually thought of as a Bernoulli process (outcome 0 or 1 for each individual) so the number of survivors S
is a binomial variable (survmodel = "binomial"). Another approach is to fix the proportion surviving, but this can be done exactly only when \phi N
is an integer. A (slightly ad hoc) solution is to randomly choose between the two nearest integers with probability designed in the long term (over many sessions) to give the required \phi
(survmodel = "discrete").
Per capita recruitment (f
) is the difference between lambda and phi (f = \lambda - \phi
), which must be non-negative (phi > lambda causes an error). The number of recruits B is a random variable whose probability distribution is controlled by details$recrmodel:
Value | Probability model |
"constantN" | Exact replacement of animals that die (B = N_t - S ) |
"binomial" | Binomial number of recruits (B ~ bin(N_t, f ) |
"poisson" | Poisson number of recruits (B ~ pois(f N_t )) |
"discrete" | Minimum-variance number of recruits (see Survival) |
"multinomial" | The POPAN model, conditioning on superpopulation size (e.g., Schwarz and Arnason 1996)) |
"specified" | Add the number of recruits specified in Nrecruits (may be vector) |
In the case of binomial recruitment there is a maximum of one recruit per existing individual, so lambda <= (phi+1). Multinomial recruitment requires a value for the superpopulation size. This may be provided as the details component "superN". If not specified directly, a value is inferred by projecting a trial initial (simulated) population using the specified phi and lambda.
Specifying the integer number of recruits in each year (recrmodel ‘specified’) overrides the value of lambda, but a non-null value should be given for lambda.
Individuals may shift their home range centre between sessions. Movement probability is governed by a circular kernel specified by ‘movemodel’ and the parameter values ‘move.a’ and ‘move.b’ (optional). By default there is no movement between sessions (movemodel = "static"). Other options are
``IND" | ``uncorrelated" | individuals are randomly assigned a new, independent location within the buffered area |
``BVN" | ``normal" | bivariate normal (Gaussian) kernel with parameter move.a (previously called sigma.m) |
``BVE" | ``exponential" | negative exponential (Laplace) kernel with parameter move.a |
``BVT" | ``t2D" | circular 2-dimensional t-distribution with scale parameter move.a and shape parameter move.b = df/2 (2Dt of Clark et al. 1999) |
``RDE" | exponential distribution of radial distance (Ergon & Gardner, 2014) | |
``RDG" | gamma distribution of radial distance (Ergon & Gardner, 2014) | |
``RDL" | log-normal distribution of radial distance (Ergon & Gardner, 2014) | |
(parameterized with move.a = exp(mu), move.b = 1/CV^2 = 1 / (exp(SD^2) - 1) | ||
The package openCR >=1.4.0 provides functions for constructing and plotting these kernels and summarising their properties (make.kernel
; plot
and summary
methods for kernel objects). The secr function extractMoves
is useful for checking simulations of movement.
Models IND, BVN, BVE, and RDE may also be zero-inflated (suffix “zi"). The parameter ‘move.a’ (INDzi) or ‘move.b’ (BVNzi, BVEzi, RDEzi) is the zero-inflation probability. See Examples.
In secr <3.2.1 sigma.m was also used to indicate two special cases; these continue to work but may be discontinued in the future:
sigma.m = 0 corresponds to movemodel = ‘static’
sigma.m < 0 corresponds to movemodel = ‘uncorrelated’
In secr >= 4.4.0, the ‘movemodel’ component may also be a user-provided function with these characteristics: two or three arguments, the first being the number of centres to be moved (e.g., n) and the others parameters of the dispersal distribution (e.g., a,b); the function should return a matrix of n rows and 2 columns, the displacements in the x- and y-directions. The output is a set of random points from the bivariate dispersal kernel. The function will be called with the current number of centres and parameter values move.a and move.b as needed.
If movement takes an animal across the boundary of the arena (buffered area) in sim.popn
the component "edgemethod" comes into play. By default, locations are toroidally wrapped i.e. the animal re-joins the population on the opposing edge. Other options are “clip” (discard), “clipandreplace” (assign new identity at original location), “stop” (stop just inside the boundary), “reflect” (bounce off edges to the limit of the dispersal), “normalize” = “truncate” (truncate kernel and scale probability to 1.0) and “none" (allow centres outside the buffered area). The “normalize” option (new in secr 4.3.3) can take longer as it repeatedly relocates each individual until its destination lies within the bounding box, up to a maximum of 500 attempts.
Clark, J. S, Silman, M., Kern, R., Macklin, E. and HilleRisLambers, J. (1999) Seed dispersal near and far: patterns across temperate and tropical forests. Ecology 80, 1475–1494.
Nathan , R., Klein, E., Robledo-Arnuncio, J. J. and Revilla, E. (2012) Dispersal kernels: a review. In: J Clobert et al. Dispersal Ecology and Evolution. Oxford University Press. Pp 187–210.
par (mfrow = c(2,3), mar = c(1,1,1,1))
## birth and death only
grid <- make.grid(nx = 7, ny = 4, detector = 'proximity', spacing = 10)
pop <- sim.popn (Nbuffer = 100, core = grid, nsessions = 6,
details = list(lambda = 0.8, phi = 0.6))
sapply(pop, nrow) ## how many individuals?
plot(pop)
## movement only
pop2 <- sim.popn (Nbuffer = 100, core = grid, nsessions = 6,
details = list(lambda = 1, phi = 1, movemodel = 'normal',
move.a = 10, edgemethod = "wrap"))
pop3 <- sim.popn (Nbuffer = 100, core = grid, nsessions = 6,
details = list(lambda = 1, phi = 1, movemodel = 'normal',
move.a = 10, edgemethod = "clip"))
pop4 <- sim.popn (Nbuffer = 100, core = grid, nsessions = 10,
details = list(lambda = 1, phi = 1, movemodel = 'normal',
move.a = 10, edgemethod = "stop"))
sapply(pop2, nrow) ## how many individuals?
plot(pop2)
## show effect of edgemethod --
## first session blue, last session red
cols <- c('blue',rep('white',4),'red')
par (mfrow=c(1,2))
plot(pop2, collapse = TRUE, seqcol = cols)
plot(pop3, collapse = TRUE, seqcol = cols)
## zero-inflated movement
## move.b is zero-inflation probability
pop5 <- sim.popn (Nbuffer = 1000, core = grid, nsessions = 6,
details = list(lambda = 1, phi = 1, movemodel = 'RDEzi',
move.a = 50, move.b = 0.5, edgemethod = "none"))
mean(do.call(rbind,extractMoves(pop5))$d) # approx 50 * 0.5