diff --git a/.Rbuildignore b/.Rbuildignore index f8132a6..2b2adec 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -10,3 +10,6 @@ ^docs$ ^pkgdown$ ^CRAN-SUBMISSION$ +^multilevelmod\.Rcheck$ +^multilevelmod.*\.tar\.gz$ +^multilevelmod.*\.tgz$ diff --git a/.gitignore b/.gitignore index 0a439f6..4be492e 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,6 @@ .Rhistory inst/doc docs +multilevelmod.Rcheck/ +multilevelmod*.tar.gz +multilevelmod*.tgz diff --git a/DESCRIPTION b/DESCRIPTION index 95b9c6d..d412de6 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: multilevelmod Title: Model Wrappers for Multi-Level Models -Version: 1.0.0.9000 +Version: 1.0.0.9001 Authors@R: c( person("Max", "Kuhn", , "max@posit.co", role = "aut", comment = c(ORCID = "0000-0003-2402-136X")), @@ -32,6 +32,7 @@ Suggests: gee, ggplot2, knitr, + lmerTest (>= 3.1.3), nlme, rmarkdown, spelling, diff --git a/R/lmerTest.R b/R/lmerTest.R new file mode 100644 index 0000000..62619d5 --- /dev/null +++ b/R/lmerTest.R @@ -0,0 +1,67 @@ +make_lmerTest_linear_reg <- function() { + + parsnip::set_model_engine("linear_reg", "regression", "lmerTest") + parsnip::set_dependency(model= "linear_reg", eng = "lmerTest", pkg = "lmerTest", mode = "regression") + parsnip::set_dependency(model ="linear_reg", eng = "lmerTest", pkg = "multilevelmod", mode = "regression") + + parsnip::set_encoding( + model = "linear_reg", + eng = "lmerTest", + mode = "regression", + options = list( + predictor_indicators = "none", + compute_intercept = FALSE, + remove_intercept = FALSE, + allow_sparse_x = FALSE + ) + ) + + parsnip::set_fit( + model = "linear_reg", + eng = "lmerTest", + mode = "regression", + value = list( + interface = "formula", + protect = c("formula", "data", "weights"), + func = c(pkg = "lmerTest", fun = "lmer"), + defaults = list() + ) + ) + + parsnip::set_pred( + model = "linear_reg", + eng = "lmerTest", + mode = "regression", + type = "numeric", + value = list( + pre = reformat_lme_pred_data, + post = NULL, + func = c(fun = "predict"), + args = list( + object = rlang::expr(object$fit), + newdata = rlang::expr(new_data), + allow.new.levels = TRUE, + re.form = NA, + na.action = rlang::expr(na.exclude), + type = "response" + ) + ) + ) + + parsnip::set_pred( + model = "linear_reg", + eng = "lmerTest", + mode = "regression", + type = "raw", + value = list( + pre = NULL, + post = NULL, + func = c(fun = "predict"), + args = list( + object = rlang::expr(object$fit), + newdata = rlang::expr(new_data) + ) + ) + ) + +} diff --git a/R/zzz.R b/R/zzz.R index 0330a3b..85fae1c 100644 --- a/R/zzz.R +++ b/R/zzz.R @@ -17,6 +17,7 @@ make_stan_poisson_reg() make_lme_linear_reg() make_gls_linear_reg() + make_lmerTest_linear_reg() } diff --git a/tests/testthat/test-lmerTest.R b/tests/testthat/test-lmerTest.R new file mode 100644 index 0000000..66e10a8 --- /dev/null +++ b/tests/testthat/test-lmerTest.R @@ -0,0 +1,46 @@ +test_that('lmerTest execution', { + skip_if_not_installed("lmerTest") + skip_on_cran() + + set.seed(2452) + lmer_mod <- + lmerTest::lmer(depr_score ~ week + imipramine + (1 | subject), + data = riesby_tr) + + lmer_spec <- + linear_reg() %>% + set_engine("lmerTest") + + set.seed(2452) + expect_error( + ps_mod <- + lmer_spec %>% + fit(depr_score ~ week + imipramine + (1|subject), data = riesby_tr), + regex = NA + ) + + expect_equal( + lme4::fixef(ps_mod$fit), + lme4::fixef(lmer_mod) + ) + expect_equal( + coef(ps_mod$fit), + coef(lmer_mod) + ) + + lmer_pred <- predict(lmer_mod, riesby_te, allow.new.levels = T) #level = 0, + + ps_pred <- predict(ps_mod, riesby_te) + + expect_equal(as.numeric(lmer_pred), ps_pred$.pred) + +}) + +test_that('mode specific package dependencies', { + expect_identical( + get_from_env(paste0("linear_reg", "_pkgs")) %>% + dplyr::filter(engine == "lmerTest", mode == "regression") %>% + dplyr::pull(pkg), + list(c("lmerTest", "multilevelmod")) + ) +})