tests/testthat/test-07-lmm_fixef.R

context("blmer numerical results with fixef prior")

source(system.file("common", "lmmData.R", package = "blme"))
lme4Version <- packageVersion("lme4")
control <- lmerControl(optimizer = "bobyqa")

test_that("blmer fits test data with normal(7, TRUE) prior, matching previous version", {
  fixef.prior <- "normal(sd = 7, common.scale = TRUE)"

  startingValues <- c(0.714336877636958, -0.242234853872256, 1.56142829865131, 0.931702840718855, 0.456177995916484, -0.174861679569041, 1.0585277913399, 0.121071648252222, 0.215801873693294)
  result <- if (lme4Version < "1.1-4") c(0.714336904883696, -0.242233333549434, 1.56142849039447, 0.931702729108028, 0.456177204451304, -0.174861811614276, 1.05852821195682, 0.121071547240353, 0.215801842870277) else c(0.714336904883696, -0.242233333549434, 1.56142849039447, 0.931702729108028, 0.456177204451304, -0.174861811614276, 1.05852821195682, 0.121071547240353, 0.215801842870277)
  
  fit <- blmer(y ~ x.1 + x.2 + (1 + x.1 | g.1) + (1 + x.1 + x.2 | g.2), testData, control = control,
               cov.prior = NULL, fixef.prior = fixef.prior, start = startingValues)
  expect_equal(fit@theta, result, tolerance = 5.0e-5)
})

test_that("blmer fits test data with normal(10, FALSE) prior, matching previous version", {
  fixef.prior <- "normal(sd = 10, common.scale = FALSE)"
  
  startingValues <- list(theta = c(0.705301445472825, -0.236130064856711, 1.54070576284237, 0.919298480793096, 0.444958591085821, -0.162201425613492, 1.04498858978601, 0.121905334663798, 0.204897688209115),
                         sigma = 0.969103097682058)
  result <- if (lme4Version < "1.1-4") c(0.705369855182081, -0.236759905121764, 1.54063251814471, 0.919250008248663, 0.444836570608055, -0.162132239807962, 1.04497528986881, 0.121858574203024, 0.204725931113902) else c(0.705369855182081, -0.236759905121764, 1.54063251814471, 0.919250008248663, 0.444836570608055, -0.162132239807962, 1.04497528986881, 0.121858574203024, 0.204725931113902)
  
  fit <- blmer(y ~ x.1 + x.2 + (1 + x.1 | g.1) + (1 + x.1 + x.2 | g.2), testData, control = control,
               cov.prior = NULL, fixef.prior = fixef.prior, start = startingValues)
  expect_equal(fit@theta, result, tolerance = 5.0e-5)
  expect_equal(fit@devcomp$cmp[["sigmaREML"]], if (lme4Version < "1.1-4") 0.969074276597577 else 0.969074276597577, tolerance = 1.0e-6)
})
  
test_that("blmer fits test data with t prior, matching previous version", {
  fixef.prior <- "t(3, scale = c(10^2, 2.5^2), common.scale = FALSE)"
  
  startingValues <- list(theta = c(0.645289664330177, -0.151604332140352, 1.39404761930357, 0.788435718441722, 0.312013729923666, -0.0155461916762167, 0.949082870229164, 0.117100582888698, 0),
                         beta = c(5.32508665168687, 1.16859904165051, 4.0443701271478))
  result <- if (lme4Version < "1.1-4") c(0.645289146996319, -0.151634501090343, 1.39403793373549, 0.788432069261316, 0.312010137757441, -0.0155458970707687, 0.949081665570772, 0.117100684805151, 3.13476220325792e-07) else c(0.645289146996319, -0.151634501090343, 1.39403793373549, 0.788432069261316, 0.312010137757441, -0.0155458970707687, 0.949081665570772, 0.117100684805151, 0)
  fixefResult <- if (lme4Version < "1.1-4") c(5.32507818836626, 1.16860398465568, 4.04437041491386) else c(5.32507818836626, 1.16860398465568, 4.04437041491386)
  
  fit <- blmer(y ~ x.1 + x.2 + (1 + x.1 | g.1) + (1 + x.1 + x.2 | g.2), testData, REML = FALSE, control = control,
               cov.prior = NULL, fixef.prior = fixef.prior, start = startingValues)
  expect_equal(fit@theta, result, tolerance = 5.0e-5)
  expect_equal(fit@beta, fixefResult, tolerance = 5.0e-5)
})

test_that("blmer fits test data with t prior, pulling coefs towards prior mean", {
  fixef.prior <- "t(3, scale = c(10^2, 2.5^2), common.scale = FALSE)"
  
  startingValues <- list(theta = c(0.645289664330177, -0.151604332140352, 1.39404761930357, 0.788435718441722, 0.312013729923666, -0.0155461916762167, 0.949082870229164, 0.117100582888698, 0),
                         beta = c(5.32508665168687, 1.16859904165051, 4.0443701271478))
  fit1 <- blmer(y ~ x.1 + x.2 + (1 + x.1 | g.1) + (1 + x.1 + x.2 | g.2),
                testData, REML = FALSE, control = control, start = startingValues,
                cov.prior = NULL, fixef.prior = fixef.prior)
  
  fixef.prior <- "t(3, mean = 1, scale = c(10^2, 2.5^2), common.scale = FALSE)"
  startingValues <- list(theta = c(0.645231746255695, -0.150874294512127, 1.39279705168843, 0.788899237871713, 0.312993971411181, -0.0165781952291476, 0.9486901278038, 0.116610548693423, 0),
                         beta = c(5.32921718654553, 1.254377710572, 4.0471360557054))
  fit2 <- blmer(y ~ x.1 + x.2 + (1 + x.1 | g.1) + (1 + x.1 + x.2 | g.2),
                testData, REML = FALSE, control = control, start = startingValues,
                cov.prior = NULL, fixef.prior = fixef.prior)
  
  expect_true(all(fit2@beta > fit1@beta))
})

test_that("blme fits test data with normal prior, infinite variances", {
  fixef.prior <- "normal(sd = c(Inf, 2.5, Inf), common.scale = TRUE)"
  startingValues <- list(theta = c(0.65040570391375, -0.155836402048548, 1.40007024700731, 0.792859752406217, 0.309502757134706, -0.00960238340899774, 0.951434187107545, 0.120357370844577, 3.28141165783528e-08))
  fit1 <- blmer(y ~ x.1 + x.2 + (1 + x.1 | g.1) + (1 + x.1 + x.2 | g.2),
                testData, REML = FALSE, control = control, start = startingValues,
                cov.prior = NULL, fixef.prior = fixef.prior)
  
  fixef.prior <- "normal(sd = c(10, 2.5, 10), common.scale = TRUE)"
  startingValues <- list(theta = c(0.656112749203895, -0.160153337136109, 1.41411083191824, 0.801072376964595, 0.314002356189888, -0.0102771543211311, 0.96001117254404, 0.121335386913439, 0))
  fit2 <- blmer(y ~ x.1 + x.2 + (1 + x.1 | g.1) + (1 + x.1 + x.2 | g.2),
                testData, REML = FALSE, control = control, start = startingValues,
                cov.prior = NULL, fixef.prior = fixef.prior)
  
  ## weak test, but mostly that it runs
  expect_true(all(abs(fit2@beta[-2L]) < abs(fit1@beta[-2L])))
})

test_that("blme fits test data with t prior, infinite variances", {
  fixef.prior <- "t(3, scale = c(Inf, 2.5^2, Inf), common.scale = FALSE)"
  startingValues <- list(theta = c(0.647090004202988, -0.153430452141895, 1.39376002360987, 0.788156951920134, 0.307237491068136, -0.00914717614020565, 0.94737787538623, 0.119813551302683, 0),
                         beta = c(5.33515365502806, 1.15350643162013, 4.05528441688043))
  fit1 <- blmer(y ~ x.1 + x.2 + (1 + x.1 | g.1) + (1 + x.1 + x.2 | g.2),
                testData, REML = FALSE, control = control, start = startingValues,
                cov.prior = NULL, fixef.prior = fixef.prior)
  
  fixef.prior <- "t(3, scale = c(10^2, 2.5^2, 2.5^2), common.scale = FALSE)"
  startingValues <- list(theta = c(0.645289664330177, -0.151604332140352, 1.39404761930357, 0.788435718441722, 0.312013729923666, -0.0155461916762167, 0.949082870229164, 0.117100582888698, 0),
                         beta = c(5.32508665168687, 1.16859904165051, 4.0443701271478))
  fit2 <- blmer(y ~ x.1 + x.2 + (1 + x.1 | g.1) + (1 + x.1 + x.2 | g.2),
                testData, REML = FALSE, control = control, start = startingValues,
                cov.prior = NULL, fixef.prior = fixef.prior)
  
  ## weak test, but mostly that it runs
  expect_true(abs(fit2@beta[2L]) > abs(fit1@beta[2L]))
})

test_that("blme fits test data with horseshoe prior, shrinking coefficients close to 0", {
  fixef.prior <- "horseshoe(mean = 0, global.shrinkage = 1, common.scale = FALSE)"
  
  startingValues <- list(theta = c(0.617639687575409, -0.294806814471362, 1.35499090773928, 0.807122870503614, 0.452878790469015, 0.00511880816241064, 1.01339081390872, 0.138288121619745, 5.27691279774817e-05),
                         beta = c(5.15394746118033, 6.90112633576194e-08, 3.98496350360682))
  
  suppressWarnings(fit1 <- blmer(y ~ x.1 + x.2 + (1 + x.1 | g.1) + (1 + x.1 + x.2 | g.2),
                                 testData, REML = FALSE, control = control, start = startingValues,
                                 cov.prior = NULL, fixef.prior = fixef.prior))
  
  expect_true(max(abs(fit1@beta)) / min(abs(fit1@beta)) > 1.0e7)
})

test_that("blmer fits sleep study example in documentation", {
  oldWarnings <- options()$warn
  options(warn = 2)
  
  data("sleepstudy", package = "lme4")
  
  fit <- blmer(Reaction ~ Days + (1 + Days|Subject), sleepstudy,
               cov.prior = NULL, resid.prior = NULL,
               fixef.prior = "normal")
  expect_is(fit, "blmerMod")
  
  fit <- blmer(Reaction ~ Days + (1 + Days|Subject), sleepstudy,
               cov.prior = NULL, resid.prior = NULL,
               fixef.prior = "normal(cov = diag(0.5, 2))")
  expect_is(fit, "blmerMod")
  
  options(warn = oldWarnings)
})

Try the blme package in your browser

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

blme documentation built on Jan. 6, 2021, 1:08 a.m.