context("Stan input generation")
test_that("stan inputs are built correctly", {
sc <- data.frame(x1=rnorm(5), group=factor(c("a","b","a","b","a")))
state <- ubmsSubmodel("Occ", "state", sc, ~x1+(1|group), "plogis",
uniform(-5,5), normal(0,2.5), gamma(1,1))
det <- ubmsSubmodel("Det", "det", sc, ~x1, "plogis",
uniform(-5,5), normal(0,2.5), gamma(1,1))
sl <- ubmsSubmodelList(state, det)
y <- matrix(c(1,0,0,1,1,1,0,0,1), nrow=3, byrow=T)
resp <- ubmsResponse(y, "binomial", "P")
inp <- build_stan_inputs("occu", resp, sl, log_lik=FALSE)
expect_is(inp, "list")
expect_equal(names(inp), c("stan_data", "pars"))
gs1 <- name_to_modelcode("occu")
gs2 <- get_stan_data(resp)
gs3 <- get_stan_data(state)
gs4 <- get_stan_data(det)
gs5 <- list(prior_dist_shape=c(0,0,0), prior_pars_shape=matrix(rep(0,6),nrow=3),
prior_dist_scale=c(0,0,0), prior_pars_scale=matrix(rep(0,6),nrow=3))
gs_all <- c(gs1,gs2,gs3,gs4,gs5)
expect_equal(inp$stan_data, gs_all)
})
test_that("parameter list for stan is generated correctly",{
sc <- data.frame(x1=rnorm(5), group=factor(c("a","b","a","b","a")))
state <- ubmsSubmodel("Occ", "state", sc, ~x1+(1|group), "plogis",
uniform(-5,5), normal(0,2.5), gamma(1,1))
det <- ubmsSubmodel("Det", "det", sc, ~x1, "plogis",
uniform(-5,5), normal(0,2.5), gamma(1,1))
sl <- ubmsSubmodelList(state, det)
expect_equal(get_pars(det), "beta_det")
expect_equal(get_pars(state), c("beta_state", "b_state", "sigma_state"))
expect_equal(get_pars(sl, "occu", log_lik=FALSE),
c("beta_state", "b_state", "sigma_state", "beta_det"))
expect_equal(get_pars(sl, "occu", log_lik=TRUE),
c("beta_state", "b_state", "sigma_state", "beta_det", "log_lik"))
})
test_that("get_stan_data pulls necessary info from response object",{
y <- matrix(c(1,0,0,1,1,1,0,0,1), nrow=3, byrow=T)
resp <- ubmsResponse(y, "binomial", "P")
dat <- get_stan_data(resp)
expect_is(dat, "list")
expect_equal(names(dat), c("y", "y_dist", "z_dist", "M", "T", "Tsamp",
"Tsamp_size", "J", "R", "si", "K", "Kmin",
"aux1","aux2","aux3","n_aux1","n_aux2","n_aux3"))
expect_equal(dat$y, as.vector(t(y)))
expect_equal(dat$y_dist, 0)
expect_equal(dat$z_dist, 1)
expect_equal(dat$M, 3)
expect_equal(dat$T, 1)
expect_equal(dat$Tsamp, c(1,1,1))
expect_equal(dat$Tsamp_size, 3)
expect_equal(dat$J, matrix(c(3,3,3), ncol=1))
expect_equal(dat$R, 9)
expect_equal(dim(dat$si), c(3, 6))
expect_equal(dat$K, max(y) + 20)
expect_equal(dat$Kmin, matrix(c(1,1,1), ncol=1))
})
test_that("dist_code returns integer code for distribution", {
expect_equal(dist_code("binomial"), 0)
expect_equal(dist_code("P"),1)
})
test_that("get_stan_data pulls necessary info from submodel",{
sc <- data.frame(x1=-1:3)
submod <- ubmsSubmodel("Occ", "state", sc, ~x1, "plogis",
uniform(-5,5), normal(0,2.5), gamma(1,1))
dat <- get_stan_data(submod)
expect_is(dat, "list")
expect_equal(names(dat),
paste0(c("X","offset", "n_obs","n_fixed","n_group_vars",
"has_random","n_random", "Zdim", "Zw", "Zv", "Zu",
"prior_dist", "prior_pars"),
"_", submod@type))
expect_equivalent(dat[[1]], model.matrix(submod))
expect_equal(dat[[2]], model_offset(submod))
expect_equal(dat[[3]], nrow(model.matrix(submod)))
expect_equal(dat[[4]], ncol(model.matrix(submod)))
expect_equal(dat[[5]], get_group_vars(submod@formula))
expect_equal(dat[[6]], has_random(submod))
expect_equivalent(dat[8:11], get_sparse_Z(Z_matrix(submod)))
expect_equivalent(dat[[12]], c(2,1,5))
expect_equivalent(dat[[13]], matrix(c(-5,5,0,0,1.581139,0,1,1,0),nrow=3), tol=1e-6)
})
test_that("get_stan_data pulls only priors from scalar submodel",{
ss <- ubmsSubmodelScalar("Fake", "fake", "plogis", normal(0,2.5))
pr <- process_priors(ss)
names(pr) <- paste0(names(pr),"_fake")
expect_equal(get_stan_data(ss), pr)
})
test_that("get_sparse_Z collapses Z into sparse parts",{
Z1 <- matrix(0, nrow=0, ncol=0)
Z2 <- matrix(c(1,0,0,0, 0,0,1,0, 0,0,0,0, 0,0,1,0), nrow=4)
expect_equal(get_sparse_Z(Z1),
list(Zdim=c(0,0,1,1,1), Zw=as.array(0),
Zv=as.array(0), Zu=as.array(0)))
expect_equal(get_sparse_Z(Z2),
list(Zdim=c(nrow(Z2), ncol(Z2), w=3, v=3, u=5),
Zw=c(1,1,1), Zv=c(1,2,4),
Zu=c(1,2,2,4,4)))
})
test_that("get_group_vars returns number of grouping variables",{
expect_equal(get_group_vars(~x), 0)
expect_equal(get_group_vars(~(1|x)), 1)
expect_equal(get_group_vars( ~(1|x) + (1|y)), 2)
})
test_that("get_nrandom returns number of levels of each grouping variable",{
dat <- data.frame(x=factor(c("a","b","c")), y=factor(c("d","e","e")))
expect_equal(get_nrandom(~x, dat), as.array(0))
expect_equal(get_nrandom(~(1|x), dat), as.array(3))
form <- ~(1|x) + (1|y)
expect_equal(get_nrandom(form, dat), as.array(c(3,2)))
form <- ~(1|x/y)
expect_error(get_nrandom(form, dat),
"Nested random effects (using / and :) are not supported", fixed=TRUE)
form <- ~(1|x:y)
expect_error(get_nrandom(form, dat),
"Nested random effects (using / and :) are not supported", fixed=TRUE)
})
test_that("get_nrandom handles situation where a factor level is missing in data",{
dat <- data.frame(x=factor(c("a","b","c"),levels=letters[1:4]))
expect_equivalent(get_nrandom(~(1|x), dat), 4)
})
test_that("split_formula works",{
inp <- ~1~1
expect_equal(split_formula(inp), list(det=~1, state=~1))
inp <- ~x1~x2
expect_equal(split_formula(inp), list(det=~x1, state=~x2))
inp <- ~x1+(1|x2)~x3
expect_equal(split_formula(inp), list(det=~x1+(1|x2), state=~x3))
inp <- ~1~verylong1 + verylong2 + verylong3 + verylong4 + verylong5 + verylong6 +
verylong7 + verylong8 + verylong9 + verylong10 +
(1|fake)
expect_silent(split_formula(inp))
expect_equal(split_formula(inp), list(det=~1, state=~verylong1 + verylong2 + verylong3 + verylong4 + verylong5 + verylong6 +
verylong7 + verylong8 + verylong9 + verylong10 +
(1|fake)))
inp <- ~x1
expect_error(split_formula(inp))
inp <- y~x1
expect_error(split_formula(inp))
})
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.