library(testthat) library(BioMixModel) # --------------------------------------------------------- # formulas must be a list # --------------------------------------------------------- test_that("multivariate model validates formulas as a list", { skip_if_not_installed("brms") dat <- data.frame( y1 = rnorm(10), y2 = rnorm(10), x = rnorm(10) ) expect_error( fit_multivariate( formulas = y1 ~ x, data = dat ), "'formulas' must be a list" ) }) # --------------------------------------------------------- # at least two formulas required # --------------------------------------------------------- test_that("multivariate model requires at least two formulas", { skip_if_not_installed("brms") dat <- data.frame( y1 = rnorm(10), y2 = rnorm(10), x = rnorm(10) ) expect_error( fit_multivariate( formulas = list(y1 ~ x), data = dat ), "At least two model formulas are required" ) }) # --------------------------------------------------------- # all elements must be formulas # --------------------------------------------------------- test_that("multivariate model validates individual formulas", { skip_if_not_installed("brms") dat <- data.frame( y1 = rnorm(10), y2 = rnorm(10), x = rnorm(10) ) expect_error( fit_multivariate( formulas = list( y1 ~ x, "y2 ~ x" ), data = dat ), "All elements of 'formulas' must be model formulas" ) }) # --------------------------------------------------------- # data must be a data frame # --------------------------------------------------------- test_that("multivariate model validates data", { skip_if_not_installed("brms") expect_error( fit_multivariate( formulas = list( y1 ~ x, y2 ~ x ), data = list( y1 = rnorm(10), y2 = rnorm(10), x = rnorm(10) ) ), "data must be a data frame" ) }) test_that("multivariate mixed model fits successfully", { skip_if_not_installed("brms") skip_on_cran() set.seed(123) dat <- data.frame( id = factor(rep(1:5, each = 4)), x = rep(1:4, 5) ) dat$y1 <- 5 + 2 * dat$x + rnorm(20) + rnorm(5)[dat$id] dat$y2 <- 10 - dat$x + rnorm(20) + rnorm(5)[dat$id] m <- suppressWarnings( fit_multivariate( formulas = list( y1 ~ x + (1 | id), y2 ~ x + (1 | id) ), data = dat, chains = 1, iter = 100, warmup = 50, refresh = 0 ) ) expect_s3_class(m, "biomix_multivariate") expect_s3_class(m, "biomix") expect_true(is.list(m)) expect_true(inherits(m$fit, "brmsfit")) expect_equal( m$model_type, "Multivariate mixed model" ) expect_equal( length(m$formulas), 2 ) expect_identical( m$data, dat ) }) test_that("multivariate model stores supplied components", { skip_if_not_installed("brms") skip_on_cran() set.seed(456) dat <- data.frame( y1 = rnorm(20), y2 = rnorm(20), x = rnorm(20) ) formulas <- list( y1 ~ x, y2 ~ x ) m <- suppressWarnings( fit_multivariate( formulas = formulas, data = dat, chains = 1, iter = 100, warmup = 50, refresh = 0 ) ) expect_equal(m$formulas, formulas) expect_identical(m$data, dat) expect_equal( m$model_type, "Multivariate mixed model" ) }) test_that("multivariate model rejects empty formula list", { skip_if_not_installed("brms") dat <- data.frame( y1 = rnorm(10), y2 = rnorm(10), x = rnorm(10) ) expect_error( fit_multivariate( formulas = list(), data = dat ), "At least two model formulas are required" ) })