sim_ts: Simulate the values of a response variable

View source: R/sim_ts.R

sim_tsR Documentation

Simulate the values of a response variable

Description

This function is used to simulate values of a response according to (a) user-defined functions for the effects of covariates and (b) a user-defined function for the simulation of 'observed' values of a response from the linear predictor. The function can incorporate linear and smooth functions of factors and continuous explanatory variables. The function can incorporate a random intercept term. For factors, the user needs to specify dummy variables in the formula (see below).

Usage

sim_ts(
  alpha = 0,
  alpha_sigma_random = 0,
  compute_lp = list(),
  sim_obs = function(lpi) {
     lpi + stats::arima.sim(list(order = c(1, 0, 0), ar =
    0.95), n = length(lpi), sd = 50)
 },
  dat,
  fct = NULL,
  seed = NULL
)

Arguments

alpha

A numeric value which defines the model intercept.

alpha_sigma_random

A numeric value which defines the random variation in intercept among factor levels (see below).

compute_lp

A named list which is used to compute the linear predictor. The name of each element should correspond to the name of a variable which is found in dat. Each element should consist of (a) a function which takes in 'x', the values of that variable in dat and any other parameters, and (b) a named list of parameters and parameter values.

sim_obs

A function which takes in the values of the linear predictor for each factor level and simulates the values of the response from the linear predictor.

dat

A dataframe which contains variables used to predict the values of a response.

fct

(optional) A character input which defines the name of a column in dat which distinguishes different time series (i.e., those for different individuals).

seed

(optional) A number passed to set.seed which ensures simulated observations are reproducible.

Value

A numeric vector of the simulated response variable

Author(s)

Edward Lavender

Examples


#### Simulate a dataframe which we will use to simulate the depth of a
# ... hypothetical animal through time.
# We will simulate a small time series (2 days in length) for two individuals,
# ... one male and one female.
# We will include sex, length, sun_angle, lunar_phase and julian_day in the dataframe:
set.seed(2)
dat <-
  assemble_ts(start_date = "2016-01-01",
                    start_date_variable = FALSE,
                    max_duration_days = 2,
                    duration_days_variable = FALSE,
                    resolution_minutes = 120,
                    n_individuals = 2,
                    longitude = 5,
                    latitude = 65,
                    tz = "UTC",
                    covariates = c("sex", "length", "sun_angle", "lunar_phase", "julian_day"),
                    parameters = list(sex = list(Pf = 0.5, replace = FALSE),
                                      length = list(shape = 25, scale = 4,
                                                    plot_density_curve = FALSE))
  )

#### Simulate 'observed' depths
# We will simulate depths in the scenario that depth is affected by
# ... linear functions of sex and length
# ... and smooth functions of sun_angle, lunar_phase and julian_day.
## (a) Record sex in terms of 0s/1s
dat$sex <- (dat$sex == "M") + 0
# (b) Define a named list that we'll use to compute the values of the linear predictor
# For each variable we'll specify a function and a named list of parameters
# ... to be passed to that function.
compute_lp <- list(sex = list(f = linear,
                              param = list(a = 0, b = 25)
),
length = list(f = linear,
              param = list(a = 0, b = 5)
),
sun_angle = list(f = sigmoid,
                 param = list(x0 = 0, L = 100, k = 0.2)
),
lunar_phase = list(f = quadratic,
                   param = list(a = -5, b = 1, h = 3, k = 25)
),
julian_day = list(f = quadratic,
                  param = list(a = -0.001, b = 1, h = 183, k = 15)
)
)
## (b) Simulate observations:
dat$depth <-
  sim_ts(
    alpha = 0,
    alpha_sigma_random = 0,
    compute_lp = compute_lp,
    sim_obs = function(lpi){
    lpi + stats::arima.sim(list(order = c(1,0,0), ar = 0.95), n = length(lpi), sd = 50) },
    dat = dat,
    fct = "individual",
    seed = 1)

# Visualise simulated depth time series
plot(dat$timestamp, dat$depth, type = "n")
lines(dat$timestamp[dat$individual == 1], dat$depth[dat$individual == 1])
lines(dat$timestamp[dat$individual == 2], dat$depth[dat$individual == 2])


edwardlavender/Tools4ETS documentation built on Nov. 29, 2022, 7:41 a.m.