tests/testthat/test-autoplot.R

#' @srrstats {G5.0}
#' @srrstats {G5.1}
#' @srrstats {G5.2}
#' @srrstats {G5.2a}
#' @srrstats {G5.2b}
#'
test_that("autoplot works with simple inputs and ziformula and dispformula", {
  object_zi <- cglmm(
    vit_d ~ X + amp_acro(time, group = "X", period = 12),
    data = vitamind,
    ziformula = ~ 0 + amp_acro(time, group = "X", period = 12)
  )

  object_disp <- cglmm(
    vit_d ~ X + amp_acro(time, group = "X", period = 12),
    data = vitamind,
    dispformula = ~ 0 + amp_acro(time, group = "X", period = 12),
  )

  vdiffr::expect_doppelganger(
    "plot with dispformula",
    autoplot(object_disp)
  )
  vdiffr::expect_doppelganger(
    "plot with ziformula",
    autoplot(object_zi)
  )
})

test_that("autoplot works with non-grouped model", {
  object <- cglmm(
    vit_d ~ amp_acro(time, period = 12),
    data = vitamind[vitamind$X == 1, ]
  )

  # testing autoplot with a simple model
  vdiffr::expect_doppelganger(
    "non-grouped plot with data",
    autoplot(object, superimpose.data = TRUE)
  )
  vdiffr::expect_doppelganger(
    "non-grouped plot with predict ribbon",
    autoplot(object, predict.ribbon = TRUE)
  )
})

test_that("autoplot works model including ziformula", {
  # TODO: come up with some better examples with data that are actually zero-inflated!
  object <- cglmm(
    vit_d ~ amp_acro(time, group = "X", period = 12),
    data = vitamind,
    ziformula = ~X
  )

  # testing autoplot with a simple model
  vdiffr::expect_doppelganger(
    "simple-ziformula-model",
    autoplot(object, superimpose.data = TRUE, predict.ribbon = FALSE)
  )
})

test_that("autoplot works model including dispformula", {
  # TODO: come up with some better examples with data that are actually overdispersed!
  object <- cglmm(
    vit_d ~ amp_acro(time, group = "X", period = 12),
    data = vitamind,
    dispformula = ~X
  )

  # testing autoplot with a simple model
  vdiffr::expect_doppelganger(
    "simple-dispformula-model",
    autoplot(object, superimpose.data = TRUE, predict.ribbon = FALSE)
  )
})


test_that("autoplot works model that has other covariates", {
  withr::local_seed(50)
  test_data <- vitamind[vitamind$X == 1, ]

  test_data$new_cat_var <- sample(
    c("a", "b", "c"),
    size = nrow(test_data),
    replace = TRUE
  )

  test_data$new_num_var <- rnorm(n = nrow(test_data))

  object <- cglmm(
    vit_d ~ amp_acro(time, period = 12) + new_cat_var + new_num_var,
    data = test_data
  )

  vdiffr::expect_doppelganger(
    "model-with-covariates",
    autoplot(
      object,
      cov_list = list(
        new_cat_var = "a",
        new_num_var = 1
      ),
      superimpose.data = TRUE
    )
  )

  vdiffr::expect_doppelganger(
    "model-with-covariates_not_specified",
    autoplot(object)
  )
  expect_message(autoplot(object, quietly = FALSE),
    regex = paste0(
      "'cov_list' was not specified, but there are",
      " covariates in the original model; the first element of each",
      " covariate column from the original dataframe will be used",
      " as reference levels:
cov_list = list(new_cat_var = 'c', new_num_var = -0.540933398827827)"
    ),
    fixed = TRUE
  )

  vdiffr::expect_doppelganger(
    "model-with-covariates_some_specified",
    autoplot(object,
      cov_list = list(new_cat_var = "c")
    )
  )

  expect_message(autoplot(object, cov_list = list(new_cat_var = "c"), quietly = FALSE))

  # test for when time is a covariate
  object_with_time_covariate <- cglmm(
    vit_d ~ time + amp_acro(time, period = 12) + new_cat_var + new_num_var,
    data = test_data
  )
  vdiffr::expect_doppelganger(
    "plot_with_time_as_covariate",
    autoplot(object_with_time_covariate)
  )

  object_with_time_covariate_2 <- cglmm(
    vit_d ~ time + X + amp_acro(time, period = 12),
    data = vitamind
  )
  vdiffr::expect_doppelganger(
    "plot_with_time_as_covariate_2",
    autoplot(object_with_time_covariate_2)
  )
})

test_that("autoplot works with simple inputs", {
  object <- cglmm(
    vit_d ~ amp_acro(time, group = "X", period = 12),
    data = vitamind
  )

  # testing autoplot with a simple model
  vdiffr::expect_doppelganger(
    "plot with superimposed data",
    autoplot(object, superimpose.data = TRUE)
  )
  vdiffr::expect_doppelganger(
    "plot with predict ribbon enabled",
    autoplot(object, predict.ribbon = TRUE)
  )
})


test_that("autoplot produces error messages", {
  withr::local_seed(50)
  # Testing error messages
  # test 'x_str' argument
  object <- cglmm(
    vit_d ~ 1 + amp_acro(time, group = "X", period = 12),
    data = vitamind
  )

  expect_error(
    autoplot(object, x_str = 10),
    regex = paste(
      "'x_str' must be string corresponding to a group",
      "name in cglmm object"
    ),
    fixed = TRUE
  )

  # test plots with different groups on different components
  test_vitamind <- vitamind
  test_vitamind$Z <- rbinom(length(test_vitamind$X), 3, prob = 0.5)
  object <- cglmm(
    vit_d ~ X + amp_acro(
      time,
      n_components = 3,
      group = c("Z", NA, "X"),
      period = c(12, 10, 8)
    ),
    data = test_vitamind
  )

  vdiffr::expect_doppelganger(
    "check plots with multiple groups",
    autoplot(object, x_str = c("X", "Z"), pred.length.out = 200)
  )

  vdiffr::expect_doppelganger(
    "check a simple plot command",
    autoplot(object)
  )

  # test 'type' argument
  object <- cglmm(
    vit_d ~ 1 + amp_acro(time, group = "X", period = 12),
    data = vitamind
  )

  expect_error(
    autoplot(object, type = 20),
    regex = paste(
      "'type' must be a string. See type in ?predict",
      "for more information about valid inputs"
    ),
    fixed = TRUE
  )

  # test 'xlims' argument
  object <- cglmm(
    vit_d ~ 1 + amp_acro(time, group = "X", period = 12),
    data = vitamind
  )

  expect_error(
    autoplot(object, xlims = c(2, 1)),
    regex = paste(
      "'xlims' must be a vector with the first element",
      "being the lower x coordinate, and the second being",
      "the upper x coordinate"
    ),
    fixed = TRUE
  )

  # test 'pred.length.out' argument
  object <- cglmm(
    vit_d ~ 1 + amp_acro(time, group = "X", period = 12),
    data = vitamind
  )

  expect_error(
    autoplot(object, pred.length.out = 100.5),
    regex = "'pred.length.out' must be an integer greater than 0", fixed = TRUE
  )

  # test 'superimpose.data' argument
  object <- cglmm(
    vit_d ~ 1 + amp_acro(time, group = "X", period = 12),
    data = vitamind
  )

  expect_error(
    autoplot(object, superimpose.data = 10),
    regex = paste(
      "'superimpose.data' must be a logical argument,",
      "either TRUE or FALSE"
    ),
    fixed = TRUE
  )

  # test 'data_opacity' argument
  object <- cglmm(
    vit_d ~ 1 + amp_acro(time, group = "X", period = 12),
    data = vitamind
  )

  expect_error(
    autoplot(object, data_opacity = 1.5),
    regex = "data_opacity' must be a number between 0 and 1 inclusive",
    fixed = TRUE
  )

  # test 'predict.ribbon' argument
  object <- cglmm(
    vit_d ~ 1 + amp_acro(time, group = "X", period = 12),
    data = vitamind
  )

  expect_error(
    autoplot(object, predict.ribbon = 10),
    regex = "'predict.ribbon' must be a logical argument, either TRUE or FALSE",
    fixed = TRUE
  )

  # check that plots are generated correctly
  vdiffr::expect_doppelganger(
    "check predict.ribbon arg",
    autoplot(object, predict.ribbon = TRUE)
  )

  vdiffr::expect_doppelganger("check x_str arg", autoplot(object, x_str = NULL))

  vdiffr::expect_doppelganger(
    "check superimpose.data arg",
    autoplot(object, x_str = "X", superimpose.data = TRUE)
  )

  vdiffr::expect_doppelganger(
    "chceck that multiple args work",
    autoplot(object, x_str = NULL, predict.ribbon = TRUE, superimpose.data = TRUE)
  )
})

test_that("autoplot works mixed models", {
  withr::local_seed(50)

  # test mixed model plots
  f_sample_id <- function(id_num,
                          n = 30,
                          mesor,
                          amp,
                          acro,
                          family = "gaussian",
                          sd = 0.2,
                          period,
                          n_components,
                          beta.group = TRUE) {
    data <- simulate_cosinor(
      n = n,
      mesor = mesor,
      amp = amp,
      acro = acro,
      family = family,
      sd = sd,
      period = period,
      n_components = n_components
    )
    data$subject <- id_num
    data
  }

  # generate a dataset with a random effect variable comprising 30 subjects
  dat_mixed <- do.call(
    "rbind",
    lapply(1:5, function(x) {
      f_sample_id(
        id_num = x,
        mesor = rnorm(1, mean = 0, sd = 1),
        amp = rnorm(1, mean = 3, sd = 0.5),
        acro = rnorm(1, mean = 1.5, sd = 0.2),
        period = 24,
        n_components = 1
      )
    })
  )
  dat_mixed$subject <- as.factor(dat_mixed$subject)

  mixed_mod <- cglmm(
    Y ~ amp_acro(times,
      n_components = 1,
      period = 24
    ) + (1 + amp_acro1 | subject),
    data = dat_mixed
  )

  # test that the plots return expected figures for different configurations
  vdiffr::expect_doppelganger("check simple plot", autoplot(mixed_mod))
  vdiffr::expect_doppelganger(
    "test superimpose",
    autoplot(mixed_mod,
      x_str = NULL,
      superimpose.data = TRUE
    )
  )
  expect_error(autoplot(mixed_mod, ranef_plot = "group"))
  vdiffr::expect_doppelganger(
    "test ranef_plot arg",
    autoplot(mixed_mod,
      ranef_plot = "subject",
      superimpose.data = TRUE
    )
  )

  # testing a more complicated mixed model with multiple groups
  f_sample_id_2 <- function(id_num,
                            n = 30,
                            mesor,
                            amp,
                            acro,
                            family = "gaussian",
                            sd,
                            beta.sd,
                            period,
                            n_components,
                            beta.mesor,
                            beta.amp,
                            beta.acro,
                            beta.group = TRUE) {
    data <- simulate_cosinor(
      n = n,
      mesor = mesor,
      amp = amp,
      acro = acro,
      family = family,
      sd = sd,
      beta.sd = beta.sd,
      period = period,
      n_components = n_components,
      beta.mesor = beta.mesor,
      beta.amp = beta.amp,
      beta.acro = beta.acro,
      beta.group = beta.group
    )
    if (id_num %% 2 == 0) {
      # data$group = 1
      rows_to_keep <- seq_len(nrow(data) %/% 2)
      data <- data[-rows_to_keep, ]
    } else {
      # data$group =0
      rows_to_delete <- seq_len(nrow(data) %/% 2)
      data <- data[rows_to_delete, ]
    }
    data$subject <- id_num
    data
  }

  dat_mixed_2 <- do.call(
    "rbind",
    lapply(1:15, function(x) {
      f_sample_id_2(
        id_num = x,
        mesor = rnorm(1, mean = 0, sd = 1),
        amp = rnorm(1, mean = 3, sd = 0.5),
        acro = rnorm(1, mean = 1.5, sd = 0.2),
        beta.mesor = rnorm(1, mean = 10, sd = 1),
        beta.amp = rnorm(1, mean = 5, sd = 0.5),
        beta.acro = rnorm(1, mean = 1.5, sd = 0.2),
        period = 24,
        n_components = 1,
        sd = 0.2,
        beta.sd = 0.2
      )
    })
  )

  dat_mixed_2$subject <- as.factor(dat_mixed_2$subject)

  mixed_mod_2 <- cglmm(
    Y ~ group + amp_acro(times, n_components = 1, period = 24, group = "group") +
      (1 + amp_acro1 | subject),
    data = dat_mixed_2
  )

  # test that the plots return expected figures for different configurations
  vdiffr::expect_doppelganger(
    "test_complex_mixed_mod",
    autoplot(mixed_mod_2, superimpose.data = TRUE, ranef_plot = "subject")
  )

  vdiffr::expect_doppelganger(
    "test group arg",
    autoplot(
      mixed_mod_2,
      x_str = "group",
      superimpose.data = TRUE,
      ranef_plot = "subject"
    )
  )
  vdiffr::expect_doppelganger(
    "test superimpose arg",
    autoplot(mixed_mod_2, x_str = "group", superimpose.data = TRUE)
  )
})

Try the GLMMcosinor package in your browser

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

GLMMcosinor documentation built on Nov. 1, 2024, 1:07 a.m.