library(lgpr)
# 1. STAN UTILS -----------------------------------------------------------
context("STAN functions: utils")
STREAM <- get_stream()
test_that("rstan::get_stream is in namespace", {
expect_true(class(STREAM) == "externalptr")
})
test_that("STAN_expand works for valid input", {
p <- c(0.1, 0.2)
v <- STAN_expand(p, c(2, 3, 2, 3), STREAM)
expect_equal(v, c(0.1, 0.2, 0.1, 0.2))
})
test_that("STAN_expand errors when idx_expand has out of bounds indices", {
p <- c(0.1, 0.2)
idx1 <- c(2, 3, 0, 3)
idx2 <- c(2, 3, 4, 3)
expect_error(STAN_expand(p, idx1, STREAM))
expect_error(STAN_expand(p, idx2, STREAM))
})
test_that("STAN_edit_x_cont works properly", {
x_dis_age <- c(
-24, -12, 0, 12, -24, -12, 0, 12,
0, 0, 0, 0, 0, -12, 0, 12, 16
)
teff <- c(-1, 2, 10)
teff_obs <- c(0, 6, 12)
case_ids <- c(1, 1, 1, 1, 2, 2, 2, 2, 0, 0, 0, 0, 0, 3, 3, 3, 3)
idx_expand <- case_ids + 1
expand_expect <- c(-1, -1, -1, -1, 2, 2, 2, 2, 0, 0, 0, 0, 0, 10, 10, 10, 10)
expect_equal(STAN_expand(teff, idx_expand, STREAM), expand_expect)
t_edit <- STAN_edit_x_cont(x_dis_age, idx_expand, teff_obs, teff, STREAM)
t_expect <- c(-23, -11, 1, 13, -20, -8, 4, 16, 0, 0, 0, 0, 0, -10, 2, 14, 18)
expect_equal(t_edit, t_expect)
})
test_that("STAN_vectorsum works properly", {
vecs <- list(c(1, 10, 1), c(2, 1, 4))
s <- STAN_vectorsum(vecs, 3, STREAM)
expect_equal(s, c(3, 11, 5))
})
# 2. STAN PRIORS ----------------------------------------------------------
require(stats)
context("STAN functions: priors")
test_that("normal prior is correct", {
x <- 0.333
mu <- -0.11
sigma <- 0.23
log_p <- STAN_log_prior(x, c(2, 0), c(mu, sigma, 0), STREAM)
expect_equal(log_p, stats::dnorm(!!x, !!mu, !!sigma, log = TRUE))
})
test_that("student-t prior is correct", {
x <- 0.333
nu <- 16
sigma <- 1
log_p <- STAN_log_prior(x, c(3, 0), c(nu, sigma, 0), STREAM)
expect_equal(log_p, stats::dt(!!x, !!nu, log = TRUE))
})
test_that("gamma prior is correct", {
x <- 0.333
a <- 5
b <- 8
log_p <- STAN_log_prior(x, c(4, 0), c(a, b, 0), STREAM)
expect_equal(log_p, stats::dgamma(!!x, shape = !!a, rate = !!b, log = TRUE))
})
test_that("inverse-gamma prior is correct", {
x <- 0.333
a <- 5
b <- 8
log_p <- STAN_log_prior(x, c(5, 0), c(a, b, 0), STREAM)
expect_equal(
log_p,
lgpr:::dinvgamma_stanlike(!!x, alpha = !!a, beta = !!b, log = TRUE)
)
})
test_that("log-normal prior is correct", {
x <- 0.333
mu <- -0.11
sigma <- 0.23
log_p <- STAN_log_prior(x, c(6, 0), c(mu, sigma, 0), STREAM)
expect_equal(log_p, stats::dlnorm(!!x, !!mu, !!sigma, log = TRUE))
})
test_that("square transform is taken into account", {
x <- 0.333
mu <- -0.11
sigma <- 0.23
log_p <- STAN_log_prior(x, c(6, 1), c(mu, sigma, 0), STREAM)
expect_lt(
log_p, # -38.9
stats::dlnorm((!!x)^2, !!mu, !!sigma, log = TRUE) # -38.5
)
})
n1 <- 323
test_that("input warping function works similarly in R and Stan code", {
x <- sort(rnorm(n = n1))
a <- 0.3 + runif(1)
w1 <- warp_input(x, a)
w2 <- STAN_warp_input(x, a, get_stream())
expect_equal(w1, w2)
})
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.