bayestestR (version 0.5.3)

weighted_posteriors: Generate posterior distributions weighted across models

Description

Extract posterior samples of parameters, weighted across models. Weighting is done by comparing posterior model probabilities, via bayesfactor_models.

Usage

weighted_posteriors(..., prior_odds = NULL, missing = 0, verbose = TRUE)

# S3 method for stanreg weighted_posteriors( ..., prior_odds = NULL, missing = 0, verbose = TRUE, effects = c("fixed", "random", "all"), component = c("conditional", "zi", "zero_inflated", "all"), parameters = NULL )

# S3 method for brmsfit weighted_posteriors( ..., prior_odds = NULL, missing = 0, verbose = TRUE, effects = c("fixed", "random", "all"), component = c("conditional", "zi", "zero_inflated", "all"), parameters = NULL )

# S3 method for BFBayesFactor weighted_posteriors(..., prior_odds = NULL, missing = 0, verbose = TRUE)

Arguments

...

Fitted models (see details), all fit on the same data, or a single BFBayesFactor object (see 'Details').

prior_odds

Optional vector of prior odds for the models compared to the first model (or the denominator, for BFBayesFactor objects).

missing

An optional numeric value to use if a model does not contain a parameter that appears in other models. Defaults to 0.

verbose

Toggle off warnings.

effects

Should results for fixed effects, random effects or both be returned? Only applies to mixed models. May be abbreviated.

component

Should results for all parameters, parameters for the conditional model or the zero-inflated part of the model be returned? May be abbreviated. Only applies to brms-models.

parameters

Regular expression pattern that describes the parameters that should be returned. Meta-parameters (like lp__ or prior_) are filtered by default, so only parameters that typically appear in the summary() are returned. Use parameters to select specific parameters for the output.

Value

A data frame with posterior distributions (weighted across models) .

Details

Note that across models some parameters might play different roles. For example, the parameter A plays a different role in the model Y ~ A + B (where it is a main effect) than it does in the model Y ~ A + B + A:B (where it is a simple effect). In many cases centering of predictors (mean subtracting for continuous variables, and effects coding via contr.sum or orthonormal coding via contr.bayes for factors) can reduce this issue. In any case you should be mindful of this issue.

See bayesfactor_models details for more info on passed models.

Note that for BayesFactor models, posterior samples cannot be generated from intercept only models.

This function is similar in function to brms::posterior_average.

References

  • Clyde, M., Desimone, H., & Parmigiani, G. (1996). Prediction via orthogonalized model mixing. Journal of the American Statistical Association, 91(435), 1197-1208.

  • Hinne, M., Gronau, Q. F., van den Bergh, D., and Wagenmakers, E. (2019, March 25). A conceptual introduction to Bayesian Model Averaging. 10.31234/osf.io/wgb64

  • Rouder, J. N., Haaf, J. M., & Vandekerckhove, J. (2018). Bayesian inference for psychology, part IV: Parameter estimation and Bayes factors. Psychonomic bulletin & review, 25(1), 102-113.

  • van den Bergh, D., Haaf, J. M., Ly, A., Rouder, J. N., & Wagenmakers, E. J. (2019). A cautionary note on estimating effect size.

See Also

bayesfactor_inclusion for Bayesian model averaging.

Examples

Run this code
# NOT RUN {
if (require("rstanarm") && require("see")) {
  stan_m0 <- stan_glm(extra ~ 1, data = sleep,
                      family = gaussian(),
                      refresh=0,
                      diagnostic_file = file.path(tempdir(), "df0.csv"))

  stan_m1 <- stan_glm(extra ~ group, data = sleep,
                      family = gaussian(),
                      refresh=0,
                      diagnostic_file = file.path(tempdir(), "df1.csv"))


  res <- weighted_posteriors(stan_m0, stan_m1)

  plot(eti(res))
}

# With BayesFactor and brms
if (require("BayesFactor") && require("brms")) {
  BFmods <- anovaBF(extra ~ group + ID, sleep, whichRandom = "ID")

  res <- weighted_posteriors(BFmods)[1:3]
  plot(eti(res))

  # Compare to brms::posterior_average
  fit1 <- brm(rating ~ treat + period + carry,
              data = inhaler,
              save_all_pars = TRUE)
  fit2 <- brm(rating ~ period + carry,
              data = inhaler,
              save_all_pars = TRUE)

  res_BT <- weighted_posteriors(fit1, fit2)
  res_brms <- brms::posterior_average(fit1, fit2,
                                      weights = "marglik", missing = 0)[, 1:4]

  plot(eti(res_BT))
  plot(eti(res_brms))
}
# }

Run the code above in your browser using DataCamp Workspace