tests/testthat/test-oneway-anova-bayes.R

# don't test data frames because the values vary across platforms, even with the
# same seed; for the same reason, don't change number of digits

# between-subjects ------------------------------

skip_if_not_installed("rstantools")

test_that(desc = "bayesian (between-subjects - anova)", code = {
  # with NA
  set.seed(123)
  df1 <- suppressWarnings(oneway_anova(
    type = "bayes",
    data = msleep,
    x = vore,
    y = brainwt
  ))

  expect_snapshot(dim(df1))
  expect_snapshot(df1[["expression"]][[1]])

  # without NA
  set.seed(123)
  df2 <- suppressWarnings(oneway_anova(
    type = "bayes",
    data = iris,
    x = Species,
    y = Sepal.Length
  ))

  expect_snapshot(dim(df2))
  expect_snapshot(df2[["expression"]][[1]])
})

# within-subjects ------------------------------

test_that(desc = "bayesian (within-subjects - anova)", code = {
  set.seed(123)
  df1 <- oneway_anova(
    type = "bayes",
    data = WRS2::WineTasting,
    x = Wine,
    y = Taste,
    paired = TRUE,
    bf.prior = 0.88
  )

  expect_snapshot(dim(df1))
  expect_snapshot(df1[["expression"]][[1]])

  # data with NA
  set.seed(123)
  df2 <- oneway_anova(
    type = "bayes",
    data = bugs_long,
    x = condition,
    y = desire,
    paired = TRUE
  )

  expect_snapshot(dim(df2))
  expect_snapshot(df2[["expression"]][[1]])

  # with subject.id ---------------------------------

  set.seed(123)
  expr1 <- oneway_anova(
    type = "bayes",
    data = data_with_subid,
    x = condition,
    y = score,
    subject.id = id,
    paired = TRUE
  )

  set.seed(123)
  expr2 <- oneway_anova(
    type = "bayes",
    data = arrange(data_with_subid, id),
    x = condition,
    y = score,
    paired = TRUE
  )

  expect_equal(expr2, expr1, ignore_attr = TRUE)
})

# test Bayesian ANOVA helper behavior --------

test_that(desc = "Bayesian ANOVA with if_all() filtering and row replication", code = {
  # Test between-subjects design
  # This ensures the if_all(matches("effect")) filtering behaves correctly
  # when effect/component columns are absent (they appear in the within-subjects case)
  set.seed(123)
  df_between <- suppressWarnings(oneway_anova(
    type = "bayes",
    data = iris,
    x = Species,
    y = Sepal.Length
  ))

  # Verify structure is correct after filtering and binding
  expect_true(all(
    c("estimate", "conf.low", "conf.high") %in% colnames(df_between)
  ))
  expect_snapshot(colnames(df_between))
  expect_snapshot(nrow(df_between))

  # Test within-subjects design
  # This tests both if_all filters and the row replication logic
  set.seed(123)
  df_within <- suppressWarnings(oneway_anova(
    type = "bayes",
    data = WRS2::WineTasting,
    x = Wine,
    y = Taste,
    paired = TRUE
  ))

  # Should have same columns and proper row count
  expect_true(all(
    c("estimate", "conf.low", "conf.high") %in% colnames(df_within)
  ))
  expect_snapshot(colnames(df_within))
  expect_snapshot(nrow(df_within))
})

# test tidy_model_parameters with Bayesian ANOVA --------

test_that(desc = "tidy_model_parameters handles Bayesian ANOVA correctly", code = {
  # Test between-subjects design (no component column)
  set.seed(123)
  model_between <- BayesFactor::anovaBF(Sepal.Length ~ Species, data = iris)

  # Call tidy_model_parameters directly
  result_between <- tidy_model_parameters(model_between)

  # Verify expected columns exist
  expect_true("estimate" %in% colnames(result_between))
  expect_true("conf.low" %in% colnames(result_between))
  expect_true("conf.high" %in% colnames(result_between))
  expect_true("method" %in% colnames(result_between))
  expect_identical(
    result_between$method[[1]],
    "Bayes factors for linear models"
  )

  # Verify that the row replication worked - should have same number of rows as original
  expect_gt(nrow(result_between), 0L)

  # Verify if_all behavior: when component column doesn't exist (between-subjects), keeps all rows
  expect_snapshot(dim(result_between))
})

Try the statsExpressions package in your browser

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

statsExpressions documentation built on Oct. 9, 2026, 5:06 p.m.