#' @srrstats {G5.10} Extended tests can be switched on via setting the
#' environment variable DYNAMITE_EXTENDED_TESTS to "true".
run_extended_tests <- identical(Sys.getenv("DYNAMITE_EXTENDED_TESTS"), "true")
data.table::setDTthreads(1) # For CRAN
test_that("multiple random effects work in fit and predict", {
skip_if_not(run_extended_tests)
set.seed(1)
n <- 40
k <- 10
x <- rnorm(n * k)
u1 <- rep(rnorm(k, sd = 0.2), each = n)
u2 <- 0.5 * u1 + rep(rnorm(k, sd = 0.1), each = n)
u3 <- 0.2 * u1 + rep(rnorm(k, sd = 0.3), each = n)
y1 <- rbinom(n * k, size = 20, prob = plogis(x + u1 + u2 * x))
y2 <- rnorm(n * k, u3 + 2 * x)
d <- data.frame(
year = 1:n, person = rep(1:k, each = n),
y1 = y1, y2 = y2, x = x, tr = 20
)
expect_error(
fit <- dynamite(
obs(y1 ~ x + trials(tr) + random(~x), family = "binomial") +
obs(y2 ~ x + random(~1), family = "gaussian") +
random_spec(),
data = d, time = "year", group = "person",
chains = 1, iter = 2000, refresh = 0
),
NA
)
expect_error(
sumr <- summary(fit, type = "sigma_nu"),
NA
)
expect_equal(sumr$mean, c(0.2338, 0.1331, 0.3339), tolerance = 0.2)
expect_error(
sumr <- summary(fit, type = "corr_nu"),
NA
)
expect_equal(sumr$mean, c(0.336, -0.0522, -0.0712), tolerance = 0.2)
expect_error(
predict(fit, n_draws = 5),
NA
)
newdata <- rbind(
d[(n + 1):nrow(d), ], # remove one person and add two
data.frame(
y1 = c(4, rep(NA, n - 1), 4, rep(NA, n - 1)),
y2 = c(0, rep(NA, n - 1), 0.5, rep(NA, n - 1)),
x = rnorm(2 * n),
person = rep(c(226L, 500L), each = n),
year = seq.int(1, n),
tr = rep(c(10, 25), each = n)
)
)
expect_error(
predict(
fit,
newdata = newdata,
type = "response",
n_draws = 5,
new_levels = "bootstrap"
),
NA
)
expect_error(
predict(
fit,
newdata = newdata,
type = "response",
n_draws = 5,
new_levels = "gaussian"
),
NA
)
expect_error(
predict(
fit,
newdata = newdata,
type = "response",
n_draws = 2,
new_levels = "original"
),
NA
)
})
test_that("centered and noncentered parameterization for random effects work", {
skip_if_not(run_extended_tests)
set.seed(1)
n <- 40
k <- 10
x <- rnorm(n * k)
u1 <- rep(rnorm(k, sd = 0.2), each = n)
u2 <- rep(rnorm(k, sd = 0.1), each = n)
mu <- exp(4 + x + u1 + u2 * x)
phi <- 50
y <- rnbinom(n * k, mu = mu, size = phi)
d <- data.frame(year = 1:n, person = rep(1:k, each = n), y = y, x = x)
fit_centered <- dynamite(
obs(y ~ x + random(~ 1 + x), family = "negbin") +
random_spec(noncentered = FALSE, correlated = TRUE),
data = d, time = "year", group = "person",
chains = 2, iter = 4000, refresh = 0, seed = 1
)
fit_noncentered <- dynamite(
obs(y ~ x + random(~ 1 + x), family = "negbin") +
random_spec(noncentered = TRUE, correlated = TRUE),
data = d, time = "year", group = "person",
chains = 2, iter = 4000, refresh = 0, seed = 1
)
expect_equal(
summary(
fit_centered,
types = c("alpha", "beta", "corr_nu", "sigma_nu", "nu")
)$mean,
summary(
fit_noncentered,
types = c("alpha", "beta", "corr_nu", "sigma_nu", "nu")
)$mean,
tolerance = 0.1
)
expect_equal(
summary(fit_centered, parameter = "phi_y")$mean,
summary(fit_noncentered, parameter = "phi_y")$mean,
tolerance = 0.2
)
fit_centered_nocorr <- dynamite(
obs(y ~ x + random(~ 1 + x), family = "negbin") +
random_spec(noncentered = FALSE, correlated = FALSE),
data = d, time = "year", group = "person",
chains = 2, iter = 4000, refresh = 0, seed = 1
)
fit_noncentered_nocorr <- dynamite(
obs(y ~ x + random(~ 1 + x), family = "negbin") +
random_spec(noncentered = TRUE, correlated = FALSE),
data = d, time = "year", group = "person",
chains = 2, iter = 4000, refresh = 0, seed = 1
)
expect_equal(
summary(
fit_centered_nocorr,
types = c("alpha", "beta", "sigma_nu", "nu")
)$mean,
summary(
fit_noncentered_nocorr,
types = c("alpha", "beta", "sigma_nu", "nu")
)$mean,
tolerance = 0.1
)
expect_equal(
summary(
fit_noncentered,
types = c("alpha", "beta", "sigma_nu", "nu")
)$mean,
summary(
fit_noncentered_nocorr,
types = c("alpha", "beta", "sigma_nu", "nu")
)$mean,
tolerance = 0.1
)
})
test_that("random effects for categorical distribution work", {
skip_if_not(run_extended_tests)
set.seed(1)
f <- obs(x ~ lag(x) + lag(y) + random(~1 + z), family = "categorical") +
obs(y ~ -1 + lag(x) + lag(y) + random(~z), family = "categorical")
fit <- try(
# Suppress, as this produces divergences
suppressWarnings(
dynamite(
dformula = f,
data = categorical_example,
time = "time",
group = "id",
chains = 1,
iter = 2000,
refresh = 0
)
),
silent = TRUE
)
expect_false(inherits(fit, "try-error"))
expect_error(
pred <- predict(fit, n_draws = 5),
NA
)
})
test_that("random effects for multinomial distribution work", {
skip_if_not(run_extended_tests)
set.seed(1)
d <- as.data.frame(t(rmultinom(100, 150, prob = c(0.15, 0.55, 0.3))))
names(d) <- c("y1", "y2", "y3")
d$t <- rep(1:20, each = 5)
d$id <- rep(1:5, 20)
d$x <- rnorm(100)
d$n <- d$y1 + d$y2 + d$y3
fit <- try(
# Suppress, as this produces divergences
suppressWarnings(
dynamite(
obs(c(y1, y2, y3) ~ 1 + random(~ -1 + x) + trials(n), "multinomial"),
data = d,
time = "t",
group = "id",
chains = 1,
iter = 2000,
refresh = 0
)
),
silent = TRUE
)
expect_false(inherits(fit, "try-error"))
expect_error(
pred <- predict(fit, n_draws = 5),
NA
)
})
test_that("random effects for multivariate gaussian distribution work", {
skip_if_not(run_extended_tests)
set.seed(1)
N <- 5
T_ <- 20
S <- crossprod(matrix(rnorm(4), 2, 2))
L <- t(chol(S))
y1 <- matrix(0, N, T_)
y2 <- matrix(0, N, T_)
x <- matrix(0, N, T_)
for (t in 2:T_) {
for (i in 1:N){
mu <- c(0.7 * y1[i, t - 1], 0.4 * y2[i, t - 1] - 0.2 * y1[i, t - 1])
y <- mu + L %*% rnorm(2L)
y1[i, t] <- y[1L]
y2[i, t] <- y[2L]
x[i, t] <- rnorm(1, c(0.5 * y1[i, t - 1]), 0.5)
}
}
d <- data.frame(
y1 = c(y1),
y2 = c(y2),
x = c(x),
t = rep(1:T_, each = N),
id = 1:N
)
fit <- try(
# Suppress, as this produces divergences
suppressWarnings(
dynamite(
dformula =
obs(c(y1, y2) ~ -1 + random(~ 1) + varying(~ x) | x, "mvgaussian") +
splines(df = 10) ,
data = d,
time = "t",
group = "id",
chains = 1,
iter = 2000,
refresh = 0
)
),
silent = TRUE
)
expect_false(inherits(fit, "try-error"))
expect_error(
pred <- predict(fit, ndraws = 5),
NA
)
})
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.