This function simulates a timeseries for the number of occurrences of a species.
Usage
simulate_timeseries(
initial_average_occurrences = 50,
n_time_points = 1,
temporal_function = NA,
...,
seed = NA
)Arguments
- initial_average_occurrences
A positive numeric value indicating the average number of occurrences to be simulated at the first time point. This value serves as the mean (lambda) of a Poisson distribution.
- n_time_points
A positive integer specifying the number of time points to simulate.
- temporal_function
A function generating a trend in number of occurrences over time, or
NA(default). Ifn_time_points> 1 and a function is provided, it defines the temporal pattern of number of occurrences.- ...
Additional arguments to be passed to
temporal_function.- seed
A positive numeric value setting the seed for random number generation to ensure reproducibility. If
NA(default), thenset.seed()is not called at all. If notNA, then the random number generator state is reset (to the state before calling this function) upon exiting this function.
See also
Other occurrence:
create_spatial_pattern(),
sample_occurrences_from_raster(),
simulate_random_walk()
Examples
# 1. Use the function simulate_random_walk()
simulate_timeseries(
initial_average_occurrences = 50,
n_time_points = 10,
temporal_function = simulate_random_walk,
sd_step = 1,
seed = 123
)
#> [1] 46 52 66 54 52 43 56 38 46 43
# 2. Using your own custom function, e.g. this linear function
my_own_linear_function <- function(
initial_average_occurrences = initial_average_occurrences,
n_time_points = n_time_points,
coef) {
# Calculate new average abundances over time
time <- seq_len(n_time_points) - 1
lambdas <- initial_average_occurrences + (coef * time)
# Identify where the lambda values become 0 or lower
zero_or_lower_index <- which(lambdas <= 0)
# If any lambda becomes 0 or lower, set all subsequent lambdas to 0
if (length(zero_or_lower_index) > 0) {
zero_or_lower_indices <- zero_or_lower_index[1]:n_time_points
lambdas[zero_or_lower_indices] <- 0
}
# Return average abundances
return(lambdas)
}
# Draw n_sim number of occurrences from Poisson distribution using
# the custom function
n_sim <- 10
n_time_points <- 50
slope <- 1
list_abundances <- vector("list", length = n_sim)
# Loop n_sim times over simulate_timeseries()
for (i in seq_len(n_sim)) {
abundances <- simulate_timeseries(
initial_average_occurrences = 50,
n_time_points = n_time_points,
temporal_function = my_own_linear_function,
coef = slope
)
list_abundances[[i]] <- data.frame(
time = seq_along(abundances),
abundance = abundances,
sim = i
)
}
# Combine list of dataframes
data_abundances <- do.call(rbind.data.frame, list_abundances)
# Plot the simulated abundances over time using ggplot2
library(ggplot2)
ggplot(data_abundances, aes(x = time, y = abundance, colour = factor(sim))) +
geom_line() +
labs(
x = "Time", y = "Species abundance",
title = paste(
n_sim, "simulated trends using custom linear function",
"with slope", slope
)
) +
scale_y_continuous(limits = c(0, NA)) +
scale_x_continuous(breaks = seq(0, n_time_points, 5)) +
theme_minimal() +
theme(legend.position = "")
