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 Feb. 5, 2026, 5:09 p.m.