Nothing
context("Test predictions")
test_that("Gaussian predictions work", {
set.seed(1)
y <- rnorm(10, cumsum(rnorm(10, 0, 0.1)), 0.1)
model <- ar1_lg(y,
rho = uniform(0.9, 0, 1), mu = 0,
sigma = halfnormal(0.1, 1),
sd_y = halfnormal(0.1, 1))
set.seed(123)
mcmc_results <- run_mcmc(model, iter = 1000)
future_model <- model
future_model$y <- rep(NA, 3)
set.seed(1)
pred <- predict(mcmc_results, future_model, type = "mean",
nsim = 100)
expect_gt(mean(pred$value[pred$time == 3]), -0.5)
expect_lt(mean(pred$value[pred$time == 3]), 0.5)
# Posterior predictions for past observations:
set.seed(1)
expect_error(yrep <- predict(mcmc_results, model, type = "response",
future = FALSE, nsim = 100), NA)
set.seed(1)
expect_error(meanrep <- predict(mcmc_results, model, type = "mean",
future = FALSE, nsim = 100), NA)
expect_equal(mean(yrep$value - meanrep$value), 0, tol = 0.1)
ufun <- function(x) {
T <- array(x[1])
R <- array(exp(x[2]))
H <- array(exp(x[3]))
dim(T) <- dim(R) <- dim(H) <- c(1, 1, 1)
P1 <- matrix(exp(x[2])^2) / (1 - x[1]^2)
list(T = T, R = R, P1 = P1, H = H)
}
pfun <- function(x) {
ifelse(x[1] > 1 | x[1] < 0, -Inf, sum(-0.5 * exp(x[2:3])^2 + x[2:3]))
}
expect_error(model2 <- ssm_mlg(matrix(model$y, length(model$y), 1),
Z = 1, H = model$H, T = model$T, R = model$R,
a1 = model$a1, P1 = model$P1,
init_theta = c(rho = 0.9, sigma = log(0.1), sd_y = log(0.1)),
update_fn = ufun, prior_fn = pfun, state_names = "signal"), NA)
set.seed(123)
expect_error(mcmc_results2 <- run_mcmc(model2, iter = 1000),
NA)
# transform manually
mcmc_results2$theta[, 2:3] <- exp(mcmc_results2$theta[, 2:3])
expect_equal(mcmc_results$theta, mcmc_results2$theta)
expect_equal(mcmc_results$alpha, mcmc_results2$alpha)
expect_equal(mcmc_results$posterior, mcmc_results2$posterior)
# transform back to predict...
mcmc_results2$theta[, 2:3] <- log(mcmc_results2$theta[, 2:3])
future_model2 <- model2
future_model2$y <- matrix(NA, 3, 1)
set.seed(1)
expect_error(pred2 <- predict(mcmc_results2, future_model2, type = "mean",
nsim = 100), NA)
expect_equal(pred, pred2)
# Posterior predictions for past observations:
set.seed(1)
expect_error(yrep2 <- predict(mcmc_results2, model2, type = "response",
future = FALSE, nsim = 100), NA)
set.seed(1)
expect_error(meanrep2 <- predict(mcmc_results2, model2, type = "mean",
future = FALSE, nsim = 100), NA)
expect_equal(yrep, yrep2)
expect_equal(meanrep, meanrep2)
expect_error(predict(mcmc_results2, model, type = "response",
future = FALSE, nsim = 100))
expect_error(predict(mcmc_results2, model2, type = "response",
future = FALSE, nsim = 0))
expect_error(predict(mcmc_results2, model2, type = "response",
future = 5, nsim = 100))
expect_error(predict(mcmc_results2, model = 465, type = "response",
future = FALSE, nsim = 100))
mcmc_results3 <- run_mcmc(model2, iter = 1000, output_type = "theta")
expect_error(predict(mcmc_results3, model2, type = "response",
future = FALSE, nsim = 100))
class(model) <- "aa"
expect_error(predict(mcmc_results3, model2, type = "response",
future = FALSE, nsim = 100))
set.seed(1)
y <- rnorm(10, cumsum(rnorm(10, 0, 0.1)), 0.1)
model <- bsm_lg(y,
sd_level = halfnormal(1, 1),
sd_slope = halfnormal(0.1, 0.1),
sd_y = halfnormal(0.1, 1))
mcmc_results <- run_mcmc(model, iter = 1000)
future_model <- model
future_model$y <- rep(NA, 3)
expect_error(predict(mcmc_results, future_model, type = "mean",
nsim = 1000), paste0("The number of samples should be smaller than or ",
"equal to the number of posterior samples 500."))
expect_error(predict(mcmc_results, future_model, type = "state",
nsim = 50), NA)
set.seed(1)
expect_error(pred <- predict(mcmc_results, future_model, type = "mean",
nsim = 500), NA)
expect_gt(mean(pred$value[pred$time == 3]), 0)
expect_lt(mean(pred$value[pred$time == 3]), 0.5)
# Posterior predictions for past observations:
set.seed(1)
expect_error(yrep <- predict(mcmc_results, model, type = "response",
future = FALSE, nsim = 100), NA)
set.seed(1)
expect_error(meanrep <- predict(mcmc_results, model, type = "mean",
future = FALSE, nsim = 100), NA)
expect_equal(mean(yrep$value - meanrep$value), 0, tol = 0.1)
})
test_that("Non-gaussian predictions work", {
set.seed(1)
y <- rpois(10, exp(cumsum(rnorm(10, 0, 0.1))))
model <- ar1_ng(y,
rho = uniform(0.9, 0, 1), mu = 0,
sigma = halfnormal(0.1, 1), distribution = "poisson")
set.seed(123)
expect_error(mcmc_results <- run_mcmc(model, iter = 1000, particles = 5), NA)
future_model <- model
future_model$y <- rep(NA, 3)
set.seed(1)
expect_error(pred <- predict(mcmc_results, future_model, type = "mean",
nsim = 100), NA)
expect_gt(mean(pred$value[pred$time == 3]), 1)
expect_lt(mean(pred$value[pred$time == 3]), 1.5)
# Posterior predictions for past observations:
set.seed(1)
expect_error(yrep <- predict(mcmc_results, model, type = "response",
future = FALSE, nsim = 100), NA)
set.seed(1)
expect_error(meanrep <- predict(mcmc_results, model, type = "mean",
future = FALSE, nsim = 100), NA)
expect_equal(mean(yrep$value - meanrep$value), 0, tol = 0.5)
update_fn <- function(x) {
T <- array(x[1])
R <- array(exp(x[2]))
dim(T) <- dim(R) <- c(1, 1, 1)
P1 <- matrix(exp(x[2])^2) / (1 - x[1]^2)
list(T = T, R = R, P1 = P1)
}
prior_fn <- function(x) {
ifelse(x[1] < 0 | x[1] > 1, -Inf, - 0.5 * exp(x[2])^2 + x[2])
}
model2 <- ssm_ung(model$y, Z = 1, T = model$T, R = model$R, a1 = model$a1,
P1 = model$P1, distribution = "poisson", update_fn = update_fn,
prior_fn = prior_fn, init_theta = c(rho = 0.9, log(model$theta[2])),
state_names = "signal")
set.seed(123)
expect_error(mcmc_results2 <- run_mcmc(model2, iter = 1000, particles = 5),
NA)
# transform manually
mcmc_results2$theta[, 2] <- exp(mcmc_results2$theta[, 2])
expect_equal(mcmc_results$theta, mcmc_results2$theta)
expect_equal(mcmc_results$alpha, mcmc_results2$alpha)
expect_equal(mcmc_results$posterior, mcmc_results2$posterior)
# transform back for predict
mcmc_results2$theta[, 2] <- log(mcmc_results2$theta[, 2])
future_model2 <- model2
future_model2$y <- rep(NA, 3)
set.seed(1)
expect_error(pred2 <- predict(mcmc_results2, future_model2, type = "mean",
nsim = 100), NA)
expect_equal(pred, pred2)
# Posterior predictions for past observations:
set.seed(1)
expect_error(yrep2 <- predict(mcmc_results2, model2, type = "response",
future = FALSE, nsim = 100), NA)
set.seed(1)
expect_error(meanrep2 <- predict(mcmc_results2, model2, type = "mean",
future = FALSE, nsim = 100), NA)
expect_equal(yrep, yrep2)
expect_equal(meanrep, meanrep2)
expect_error(predict(mcmc_results2, model, type = "response",
future = FALSE, nsim = 100))
})
test_that("Predictions for nlg_ssm work", {
skip_on_cran()
set.seed(1)
n <- 10
x <- y <- numeric(n)
y[1] <- rnorm(1, exp(x[1]), 0.1)
for(i in 1:(n-1)) {
x[i+1] <- rnorm(1, 0.9 * x[i], 0.1)
y[i+1] <- rnorm(1, exp(x[i+1]), 0.1)
}
pntrs <- cpp_example_model("nlg_ar_exp")
expect_error(model <- ssm_nlg(y = y, a1 = pntrs$a1, P1 = pntrs$P1,
Z = pntrs$Z_fn, H = pntrs$H_fn, T = pntrs$T_fn, R = pntrs$R_fn,
Z_gn = pntrs$Z_gn, T_gn = pntrs$T_gn,
theta = c(mu = 0, rho = 0.9, log_R = log(0.1), log_H = log(0.1)),
log_prior_pdf = pntrs$log_prior_pdf,
n_states = 1, n_etas = 1, state_names = "state"), NA)
expect_error(mcmc_results <- run_mcmc(model, iter = 5000, particles = 10),
NA)
future_model <- model
future_model$y <- rep(NA, 3)
expect_error(pred <- predict(mcmc_results, particles = 10,
future_model, type = "mean", nsim = 1000), NA)
expect_gt(mean(pred$value[pred$time == 3]), 0.5)
expect_lt(mean(pred$value[pred$time == 3]), 1.5)
# Posterior predictions for past observations:
set.seed(1)
expect_error(yrep <- predict(mcmc_results, model, type = "response",
future = FALSE, nsim = 100), NA)
set.seed(1)
expect_error(meanrep <- predict(mcmc_results, model, type = "mean",
future = FALSE, nsim = 100), NA)
expect_equal(mean(yrep$value - meanrep$value), 0, tol = 0.5)
})
test_that("Predictions for mng_ssm work", {
set.seed(1)
n <- 20
x <- cumsum(rnorm(n, sd = 0.5))
phi <- 2
y <- cbind(rnbinom(n, size = phi, mu = exp(x)),
rpois(n, exp(x)))
Z <- matrix(1, 2, 1)
T <- 1
R <- 0.5
a1 <- 0
P1 <- 1
update_fn <- function(theta) {
list(R = array(theta[1], c(1, 1, 1)), phi = c(theta[2], 1))
}
prior_fn <- function(theta) {
ifelse(all(theta > 0), sum(dnorm(theta, 0, 1, log = TRUE)), -Inf)
}
expect_error(model <- ssm_mng(y, Z, T, R, a1, P1, phi = c(2, 1),
init_theta = c(0.5, 2),
distribution = c("negative binomial", "poisson"),
update_fn = update_fn, prior_fn = prior_fn), NA)
expect_error(mcmc_results <- run_mcmc(model, iter = 5000, particles = 10),
NA)
future_model <- model
future_model$y <- matrix(NA, 3, 2)
expect_error(pred <- predict(mcmc_results, particles = 10,
future_model, type = "mean", nsim = 1000), NA)
expect_gte(min(pred$value), 0)
expect_lt(max(pred$value), 1000)
# Posterior predictions for past observations:
set.seed(1)
expect_error(yrep <- predict(mcmc_results, model, type = "response",
future = FALSE, nsim = 100), NA)
set.seed(1)
expect_error(meanrep <- predict(mcmc_results, model, type = "mean",
future = FALSE, nsim = 100), NA)
expect_equal(mean(yrep$value - meanrep$value), 0, tol = 0.5)
})
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.