tests/testthat/test-bayes-mixed.R

context("Tests Bayesian regression code (rrreg.bayes) with mixed effects")

## Define design parameters
p <- 2/3  # probability of answering honestly in Forced Response Design
p1 <- 1/6 # probability of forced 'yes'
p0 <- 1/6 # probability of forced 'no'

nigeria$county <- sample(1:10, nrow(nigeria), replace = T)

set.seed(1)

## starting values constructed from MLE model
mle.estimates <- rrreg(rr.q1 ~ cov.asset.index + cov.married + 
                         I(cov.age/10) + I((cov.age/10)^2) + cov.education + cov.female, 
                       data = nigeria, 
                       p = p, p1 = p1, p0 = p0,
                       design = "forced-known")

library(MASS)
draws <- mvrnorm(n = 3, mu = coef(mle.estimates), 
                 Sigma = vcov(mle.estimates) * 9)

test_that("basic code runs with all defaults", {
  bayes <- rrreg.bayes(rr.q1 ~ cov.asset.index + cov.married + 
                         I(cov.age/10) + I((cov.age/10)^2) + cov.education + cov.female,   
                       data = nigeria, p = p, p1 = p1, p0 = p0, beta.tune = .0001, 
                       Psi.tune = .001, group.mixed = "county",
                       design = "forced-known")
  
  expect_is(bayes, "rrreg.bayes")
  
  expect_equal(ncol(bayes$beta), 7)
  expect_equal(ncol(bayes$gamma), 10)
  expect_equal(ncol(bayes$Psi), 1)
  
})

test_that("basic code runs varying the burnin / thin / n.draws options", {

  expect_is(
    bayes <- rrreg.bayes(rr.q1 ~ cov.asset.index + cov.married + 
                           I(cov.age/10) + I((cov.age/10)^2) + cov.education + cov.female,   
                         data = nigeria, p = p, p1 = p1, p0 = p0, beta.tune = .0001,
                         Psi.tune = .001, group.mixed = "county",
                         n.draws = 250, burnin = 100,
                         design = "forced-known"),
    "rrreg.bayes"
  )
  
  expect_is(
    bayes <- rrreg.bayes(rr.q1 ~ cov.asset.index + cov.married + 
                           I(cov.age/10) + I((cov.age/10)^2) + cov.education + cov.female,   
                         data = nigeria, p = p, p1 = p1, p0 = p0, beta.tune = .0001,
                         Psi.tune = .001, group.mixed = "county",
                         n.draws = 250, burnin = 100, thin = 10,
                         design = "forced-known"),
    "rrreg.bayes"
  )
  
})


test_that("basic code runs setting customized Metropolis options", {
  skip_on_cran()
  
  expect_is(
    bayes <- rrreg.bayes(rr.q1 ~ cov.asset.index + cov.married + 
                           I(cov.age/10) + I((cov.age/10)^2) + cov.education + cov.female,   
                         data = nigeria, p = p, p1 = p1, p0 = p0, beta.tune = .0001, 
                         Psi.tune = .001, group.mixed = "county",
                         beta.start = draws[1,],
                         n.draws = 250, burnin = 100, thin = 10,
                         design = "forced-known"),
    "rrreg.bayes"
  )
  
  expect_is(
    bayes <- rrreg.bayes(rr.q1 ~ cov.asset.index + cov.married + 
                           I(cov.age/10) + I((cov.age/10)^2) + cov.education + cov.female,   
                         data = nigeria, p = p, p1 = p1, p0 = p0, beta.tune = .0001, 
                         Psi.tune = .001, group.mixed = "county",
                         beta.start = draws[1,], beta.mu0 = rep(0, 7), 
                         beta.A0 = diag(7) * 1,
                         n.draws = 250, burnin = 100, thin = 10,
                         design = "forced-known"),
    "rrreg.bayes"
  )
  
  
})

test_that("basic code runs setting customized Metropolis options for mixed effects", {
  
  expect_is(
    bayes <- rrreg.bayes(rr.q1 ~ cov.asset.index + cov.married + 
                           I(cov.age/10) + I((cov.age/10)^2) + cov.education + cov.female,   
                         data = nigeria, p = p, p1 = p1, p0 = p0, beta.tune = .0001, 
                         Psi.tune = .001, group.mixed = "county",
                         Psi.start = 20, Psi.df = 3, Psi.scale = .1,
                         n.draws = 250, burnin = 100, thin = 10,
                         design = "forced-known"),
    "rrreg.bayes"
  )

})

test_that("basic code runs when there are covariates sent to the mixed model",{
  
  bayes.mixed.cov <- rrreg.bayes(rr.q1 ~ cov.asset.index + cov.married + 
                                   I(cov.age/10) + I((cov.age/10)^2) + cov.education + cov.female,   
                                 data = nigeria, p = p, p1 = p1, p0 = p0, beta.tune = .0001, 
                                 Psi.tune = .001, group.mixed = "county",
                                 Psi.start = 20, Psi.df = 3, Psi.scale = .1,
                                 n.draws = 250, burnin = 100, thin = 10,
                                 design = "forced-known", formula.mixed = ~ cov.education)
  
  expect_equal(
    length(coef(bayes.mixed.cov)$beta), 7
  )
  expect_is(
    coef(bayes.mixed.cov)$beta, "numeric"
  )
  expect_equal(
    length(coef(bayes.mixed.cov, ranef = T)$gamma), 20
  )
  expect_is(
    coef(bayes.mixed.cov, ranef = T)$gamma, "numeric"
  )
  expect_equal(
    length(coef(bayes.mixed.cov, ranef = T)$Psi), 3
  )
  expect_is(
    coef(bayes.mixed.cov, ranef = T)$Psi, "numeric"
  )
  expect_equal(
    length(coef(bayes.mixed.cov)), 1
  )
  expect_equal(
    length(coef(bayes.mixed.cov, ranef = T)), 3
  )
  
  expect_is(
    vcov(bayes.mixed.cov), "matrix" 
  )
  expect_equal(
    length(sd.rrreg.bayes(bayes.mixed.cov)$beta), 7
  )
  
  expect_output(
    print(bayes.mixed.cov), "Randomized Response Technique Bayesian Regression"
  )
  
  expect_output(
    print(summary(bayes.mixed.cov)), "Individual-level predictors"
  )
  
  expect_is(
    as.list(bayes.mixed.cov), "rrreg.bayes.list"
  )
  
  expect_equal(names(coef(bayes.mixed.cov, ranef = T)$Psi), 
               c("(Intercept) (Intercept)", "cov.education (Intercept)",
                 "cov.education cov.education"))
  
  expect_equal(names(sd.rrreg.bayes(bayes.mixed.cov, ranef = T)$Psi), 
               c("(Intercept) (Intercept)", "cov.education (Intercept)",
                 "cov.education cov.education"))
  
          
})

test_that("standard functions coef, sd.rrreg.bayes, summary work", {
  
  bayes <- rrreg.bayes(rr.q1 ~ cov.asset.index + cov.married + 
                         I(cov.age/10) + I((cov.age/10)^2) + cov.education + cov.female,   
                       data = nigeria, p = p, p1 = p1, p0 = p0, beta.tune = .0001, 
                       Psi.tune = .001, group.mixed = "county",
                       n.draws = 500, burnin = 250, thin = 1,
                       design = "forced-known")
  
  expect_equal(
    length(coef(bayes)$beta), 7
  )
  expect_is(
    coef(bayes)$beta, "numeric"
  )
  expect_equal(
    length(coef(bayes, ranef = T)$gamma), 10
  )
  expect_is(
    coef(bayes, ranef = T)$gamma, "numeric"
  )
  expect_equal(
    length(coef(bayes, ranef = T)$Psi), 1
  )
  expect_is(
    coef(bayes, ranef = T)$Psi, "numeric"
  )
  expect_equal(
    length(coef(bayes)), 1
  )
  expect_equal(
    length(coef(bayes, ranef = T)), 3
    )
  
  expect_is(
    vcov(bayes), "matrix" 
  )
  expect_equal(
    length(sd.rrreg.bayes(bayes)$beta), 7
  )
  
  expect_output(
    print(bayes), "Randomized Response Technique Bayesian Regression"
  )
  
  expect_output(
    print(summary(bayes)), "Individual-level predictors"
  )
  
  expect_is(
    as.list(bayes), "rrreg.bayes.list"
  )
  
  expect_equal(names(coef(bayes, ranef = T)$Psi), 
               c("(Intercept) (Intercept)"))
  
  expect_equal(names(sd.rrreg.bayes(bayes, ranef = T)$Psi), 
               c("(Intercept) (Intercept)"))
  
}) 

test_that("using string, numeric, or factor group variable gets the same answer", {
  
  nigeria$county.fac <- as.factor(sample(c("aa 1", "bb 2", "cc 3"), nrow(nigeria), replace = T))
  nigeria$county.str <- as.character(nigeria$county.fac)
  nigeria$county.num <- as.numeric(nigeria$county.fac)
  
  set.seed(1)
  bayes.num <- rrreg.bayes(rr.q1 ~ cov.asset.index + cov.married + 
                         I(cov.age/10) + I((cov.age/10)^2) + cov.education + cov.female,   
                       data = nigeria, p = p, p1 = p1, p0 = p0, beta.tune = .0001, 
                       Psi.tune = .001, group.mixed = "county.num",
                       n.draws = 500, burnin = 250, thin = 1,
                       design = "forced-known")
 
  set.seed(1)
  bayes.str <- rrreg.bayes(rr.q1 ~ cov.asset.index + cov.married + 
                             I(cov.age/10) + I((cov.age/10)^2) + cov.education + cov.female,   
                           data = nigeria, p = p, p1 = p1, p0 = p0, beta.tune = .0001, 
                           Psi.tune = .001, group.mixed = "county.str",
                           n.draws = 500, burnin = 250, thin = 1,
                           design = "forced-known")
  
  set.seed(1)
  bayes.fac <- rrreg.bayes(rr.q1 ~ cov.asset.index + cov.married + 
                             I(cov.age/10) + I((cov.age/10)^2) + cov.education + cov.female,   
                           data = nigeria, p = p, p1 = p1, p0 = p0, beta.tune = .0001, 
                           Psi.tune = .001, group.mixed = "county.fac",
                           n.draws = 500, burnin = 250, thin = 1,
                           design = "forced-known")
  
  expect_equal(as.numeric(coef(bayes.num, ranef = T)$gamma[which(names(coef(bayes.num, 
                                                               ranef = T)$gamma) == "2")]),
             as.numeric(coef(bayes.fac, ranef = T)$gamma[which(names(coef(bayes.fac, 
                                                               ranef = T)$gamma) == "bb 2")]))
  
  expect_equal(as.numeric(coef(bayes.num, ranef = T)$gamma[which(names(coef(bayes.num, 
                                                                            ranef = T)$gamma) == "2")]),
               as.numeric(coef(bayes.str, ranef = T)$gamma[which(names(coef(bayes.str, 
                                                                            ranef = T)$gamma) == "bb 2")]))
  
})

test_that("doing multiple chains works as well as coef, sd.rrreg.bayes, summary work", {
  
  bayes.1 <- rrreg.bayes(rr.q1 ~ cov.asset.index + cov.married + 
                           I(cov.age/10) + I((cov.age/10)^2) + cov.education + cov.female,   
                         data = nigeria, p = p, p1 = p1, p0 = p0,
                         Psi.tune = .001, group.mixed = "county",
                         beta.tune = .0001, beta.start = draws[1,],
                         n.draws = 500, burnin = 250, thin = 1,
                         design = "forced-known")
  
  bayes.2 <- rrreg.bayes(rr.q1 ~ cov.asset.index + cov.married + 
                           I(cov.age/10) + I((cov.age/10)^2) + cov.education + cov.female,   
                         data = nigeria, p = p, p1 = p1, p0 = p0,
                         Psi.tune = .001, group.mixed = "county",
                         beta.tune = .0001, beta.start = draws[2,],
                         n.draws = 500, burnin = 250, thin = 1,
                         design = "forced-known")
  
  bayes.3 <- rrreg.bayes(rr.q1 ~ cov.asset.index + cov.married + 
                           I(cov.age/10) + I((cov.age/10)^2) + cov.education + cov.female,   
                         data = nigeria, p = p, p1 = p1, p0 = p0,
                         Psi.tune = .001, group.mixed = "county",
                         beta.tune = .0001, beta.start = draws[3,],
                         n.draws = 500, burnin = 250, thin = 1,
                         design = "forced-known")
  
  bayes <- as.list(bayes.1, bayes.2, bayes.3)
  
  expect_is(bayes, "rrreg.bayes.list")
  
  expect_equal(
    length(coef(bayes)$beta), 7
  )
  expect_is(
    coef(bayes)$beta, "numeric"
  )
  expect_equal(
    length(coef(bayes, ranef = T)$gamma), 10
  )
  expect_is(
    coef(bayes, ranef = T)$gamma, "numeric"
  )
  expect_equal(
    length(coef(bayes, ranef = T)$Psi), 1
  )
  expect_is(
    coef(bayes, ranef = T)$Psi, "numeric"
  )
  expect_equal(
    length(coef(bayes)), 1
  )
  expect_equal(
    length(coef(bayes, ranef = T)), 3
  )
  
  
  expect_output(
    print(bayes), "Randomized Response Technique Bayesian Regression"
  )
  
  summ <- summary(bayes)
  
  expect_output(
    print(summ), "Individual-level predictors"
  )
  
  expect_output(
    print(summ), "Gelman-Rubin statistics"
  )
  
}) 

Try the rr package in your browser

Any scripts or data that you put into this service are public.

rr documentation built on May 24, 2022, 5:05 p.m.