Skip to content

Conversation

@mattansb
Copy link
Member

@mattansb mattansb commented Sep 2, 2025

  • New methods docs now in ?bayesfactor_methods
  • Better function docs / sections
  • Update BF vignette
    • Cleanup the vignette to focus on the ideas.
    • Include order restrictions vs null
  • Add support for stanfit (rstan) and CmdStanMCMC (cmdstanr)

Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary of Changes

Hello @mattansb, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request focuses on enhancing the usability and clarity of the Bayes factor functionalities within the bayestestR package. It introduces a centralized documentation hub for Bayes factor methods and refactors the underlying S3 method dispatch to improve code organization and maintainability. The changes aim to provide a more consistent and informative experience for users working with Bayes factor objects.

Highlights

  • New Unified Bayes Factor Methods Documentation: A new dedicated documentation page, ?bayesfactor_methods, has been added to centralize information regarding various methods for Bayes factor objects, including interpretation, transitivity, and prior/posterior considerations.
  • Consolidation of S3 Methods: S3 methods for Bayes factor objects (e.g., as.numeric, as.matrix, as.logical, as.vector) have been consolidated under a new internal bayestestRBF class, streamlining method dispatch and reducing redundancy across individual Bayes factor functions.
  • Improved Function Documentation: Existing Bayes factor functions (bayesfactor_inclusion, bayesfactor_models, bayesfactor_parameters, bayesfactor_restricted, si) have received updated and cleaned-up documentation, with references to the new unified methods page and clearer explanations.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point in your pull request via creating an issue comment (i.e. comment on the pull request page) using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in issue comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@mattansb mattansb marked this pull request as draft September 2, 2025 19:28
Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces a significant and beneficial refactoring by centralizing Bayes factor methods and their documentation into a new R/bayesfactor-methods.R file. This greatly improves code maintainability and consistency across the package by using a new bayestestRBF parent class. The documentation has also been cleaned up nicely. I've found a couple of minor issues to address: a small regression in functionality in the new print method and a typo in a warning message.

@codecov
Copy link

codecov bot commented Sep 28, 2025

Codecov Report

❌ Patch coverage is 61.41732% with 49 lines in your changes missing coverage. Please review.
✅ Project coverage is 55.58%. Comparing base (6a8cb98) to head (585bff3).
⚠️ Report is 59 commits behind head on main.

Files with missing lines Patch % Lines
R/diagnostic_posterior.R 0.00% 16 Missing ⚠️
R/bayesfactor-methods.R 82.19% 13 Missing ⚠️
R/utils_bayesfactor.R 0.00% 11 Missing ⚠️
R/bayesfactor_models.R 75.00% 3 Missing ⚠️
R/print.equivalence_test.R 0.00% 2 Missing ⚠️
R/effective_sample.R 0.00% 1 Missing ⚠️
R/mcse.R 0.00% 1 Missing ⚠️
R/utils_check_collinearity.R 50.00% 1 Missing ⚠️
R/utils_clean_stan_parameters.R 50.00% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main     #738      +/-   ##
==========================================
+ Coverage   54.33%   55.58%   +1.25%     
==========================================
  Files          64       67       +3     
  Lines        6000     6196     +196     
==========================================
+ Hits         3260     3444     +184     
- Misses       2740     2752      +12     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@strengejacke
Copy link
Member

gogogo!

res <- .bayesfactor_models_stan_REG(mods, denominator, verbose)
bf_method <- "marginal likelihoods (bridgesampling)"
unsupported_models <- FALSE
unsupported_models <- if (inherits(mods[[1]], c("stanfit", "CmdStanFit"))) TRUE else FALSE
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[air] reported by reviewdog 🐶

Suggested change
unsupported_models <- if (inherits(mods[[1]], c("stanfit", "CmdStanFit"))) TRUE else FALSE
unsupported_models <- if (inherits(mods[[1]], c("stanfit", "CmdStanFit"))) {
TRUE
} else {
FALSE
}

unsupported_models <- if (inherits(mods[[1]], c("stanfit", "CmdStanFit"))) TRUE else FALSE
}

.bf_models_output(res,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[air] reported by reviewdog 🐶

Suggested change
.bf_models_output(res,
.bf_models_output(
res,

insight::format_error("Models were not computed from the same data.")
}
} else if (verbose) {
insight::format_alert("Unable to validate that all models were fit with the same data.")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[air] reported by reviewdog 🐶

Suggested change
insight::format_alert("Unable to validate that all models were fit with the same data.")
insight::format_alert(
"Unable to validate that all models were fit with the same data."
)

attr(res, "unsupported_models") <- unsupported_models
attr(res, "model_names") <- model_names
class(res) <- c("bayesfactor_models", "see_bayesfactor_models", class(res))
class(res) <- c("bayestestRBF", "bayesfactor_models", "see_bayesfactor_models", class(res))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[air] reported by reviewdog 🐶

Suggested change
class(res) <- c("bayestestRBF", "bayesfactor_models", "see_bayesfactor_models", class(res))
class(res) <- c(
"bayestestRBF",
"bayesfactor_models",
"see_bayesfactor_models",
class(res)
)

Comment on lines +320 to +322
diagnostic_posterior.CmdStanFit <- function(posterior,
diagnostic = "all",
...) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[air] reported by reviewdog 🐶

Suggested change
diagnostic_posterior.CmdStanFit <- function(posterior,
diagnostic = "all",
...) {
diagnostic_posterior.CmdStanFit <- function(posterior, diagnostic = "all", ...) {


draws <- posterior$draws(format = "draws_df")

out <- posterior::summarize_draws(draws,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[air] reported by reviewdog 🐶

Suggested change
out <- posterior::summarize_draws(draws,
out <- posterior::summarize_draws(
draws,

Comment on lines +204 to +206
.clean_priors_and_posteriors.stanfit <- function(posterior, prior,
verbose = TRUE,
...) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[air] reported by reviewdog 🐶

Suggested change
.clean_priors_and_posteriors.stanfit <- function(posterior, prior,
verbose = TRUE,
...) {
.clean_priors_and_posteriors.stanfit <- function(posterior, prior, verbose = TRUE, ...) {

Comment on lines 2 to 4
.check_multicollinearity <- function(model,
method = "equivalence_test",
threshold = 0.7, ...) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[air] reported by reviewdog 🐶

Suggested change
.check_multicollinearity <- function(model,
method = "equivalence_test",
threshold = 0.7, ...) {
.check_multicollinearity <- function(
model,
method = "equivalence_test",
threshold = 0.7,
...
) {

expect_equal(update(BFM2, subset = c(1, 2))$log_BF, c(1, 57.3, 54.52), tolerance = 0.1)

# update reference
expect_equal(update(BFM2, reference = 1)$log_BF,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[air] reported by reviewdog 🐶

Suggested change
expect_equal(update(BFM2, reference = 1)$log_BF,
expect_equal(
update(BFM2, reference = 1)$log_BF,

Comment on lines 231 to 232
expect_equal(bfinc_matched$p_posterior, c(1, 0.875, 0.125, 0.009, 0.002), tolerance = 0.1)
expect_equal(bfinc_matched$log_BF, c(NaN, 58.904, -3.045, -3.573, -1.493), tolerance = 0.1)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[air] reported by reviewdog 🐶

Suggested change
expect_equal(bfinc_matched$p_posterior, c(1, 0.875, 0.125, 0.009, 0.002), tolerance = 0.1)
expect_equal(bfinc_matched$log_BF, c(NaN, 58.904, -3.045, -3.573, -1.493), tolerance = 0.1)
expect_equal(
bfinc_matched$p_posterior,
c(1, 0.875, 0.125, 0.009, 0.002),
tolerance = 0.1
)
expect_equal(
bfinc_matched$log_BF,
c(NaN, 58.904, -3.045, -3.573, -1.493),
tolerance = 0.1
)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[air] reported by reviewdog 🐶

bayesfactor_parameters <- function(posterior,
prior = NULL,
direction = "two-sided",
null = 0,
...,
verbose = TRUE) {

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[air] reported by reviewdog 🐶

bayesfactor_parameters.blavaan <- function(posterior,
prior = NULL,
direction = "two-sided",
null = 0,
...,
verbose = TRUE) {

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[air] reported by reviewdog 🐶

bayesfactor_restricted.blavaan <- function(posterior, hypothesis, prior = NULL,
verbose = TRUE, ...) {
samps <- .clean_priors_and_posteriors(posterior, prior,
verbose = verbose
)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[air] reported by reviewdog 🐶

bayestestR/R/si.R

Lines 117 to 122 in e6b1407

si.stanreg <- function(posterior, prior = NULL,
BF = 1, verbose = TRUE,
effects = "fixed",
component = "location",
parameters = NULL,
...) {

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[air] reported by reviewdog 🐶

bayestestR/R/si.R

Lines 125 to 127 in e6b1407

samps <- .clean_priors_and_posteriors(posterior, prior,
effects = effects, component = component,
parameters = parameters, verbose = verbose

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[air] reported by reviewdog 🐶

bayestestR/R/spi.R

Lines 191 to 197 in e6b1407

spi.stanreg <- function(x,
ci = 0.95,
effects = "fixed",
component = "location",
parameters = NULL,
verbose = TRUE,
...) {

mattansb and others added 2 commits October 17, 2025 13:35
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
)

# caption and footer
caption <- switch(attr(orig_x, "bf_fun"),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[air] reported by reviewdog 🐶

Suggested change
caption <- switch(attr(orig_x, "bf_fun"),
caption <- switch(
attr(orig_x, "bf_fun"),

#' @export
as.numeric.bayestestRBF <- function(x, log = FALSE, ...) {
out <- x[["log_BF"]]
if (!log) out <- exp(out)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[air] reported by reviewdog 🐶

Suggested change
if (!log) out <- exp(out)
if (!log) {
out <- exp(out)
}

@mattansb
Copy link
Member Author

I think it'll be better to run AIR after merging this with main to avoid any issues.

@strengejacke
Copy link
Member

Yes, I think you can ignore the formatting warnings for now.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants