View source: R/bayesfactor_restricted.R
| bayesfactor_restricted | R Documentation |
This method computes Bayes factors for comparing a model with an order restrictions on its parameters
with the fully unrestricted model. Note that this method should only be used for confirmatory analyses.
The bf_* function is an alias of the main function.
For more info, see the Bayes factors vignette.
bayesfactor_restricted(posterior, ...)
bf_restricted(posterior, ...)
## S3 method for class 'stanreg'
bayesfactor_restricted(
posterior,
hypothesis,
prior = NULL,
verbose = TRUE,
effects = "fixed",
component = "conditional",
...
)
## S3 method for class 'brmsfit'
bayesfactor_restricted(
posterior,
hypothesis,
prior = NULL,
verbose = TRUE,
effects = "fixed",
component = "conditional",
...
)
## S3 method for class 'blavaan'
bayesfactor_restricted(
posterior,
hypothesis,
prior = NULL,
verbose = TRUE,
...
)
## S3 method for class 'emmGrid'
bayesfactor_restricted(
posterior,
hypothesis,
prior = NULL,
verbose = TRUE,
...
)
## S3 method for class 'matrix'
bayesfactor_restricted(
posterior,
hypothesis,
prior = NULL,
verbose = TRUE,
...
)
## S3 method for class 'data.frame'
bayesfactor_restricted(
posterior,
hypothesis,
prior = NULL,
rvar_col = NULL,
...
)
posterior |
A |
... |
Currently not used. |
hypothesis |
A character vector specifying the restrictions as logical conditions (see examples below). |
prior |
An object representing a prior distribution (see Details). |
verbose |
Toggle off warnings. |
effects |
Should variables for fixed effects ( For models of from packages brms or rstanarm there are additional options:
|
component |
Which type of parameters to return, such as parameters for the conditional model, the zero-inflated part of the model, the dispersion term, etc. See details in section Model Components. May be abbreviated. Note that the conditional component also refers to the count or mean component - names may differ, depending on the modeling package. There are three convenient shortcuts (not applicable to all model classes):
|
rvar_col |
A single character - the name of an |
This method is used to compute Bayes factors for order-restricted
models vs un-restricted models by setting an order restriction on the prior
and posterior distributions (Morey & Wagenmakers, 2013).
(Though it is possible to use bayesfactor_restricted() to test interval restrictions,
it is more suitable for testing order restrictions; see examples).
The resulting output is supported by the following methods:
as.matrix(): Extract a full matrix of (log-)Bayes factors between all
models (using the transitivity of Bayes factors).
as.logical(): Extract boolean vectors indicating which (prior/posterior)
samples are included in the hypothesized restriction.
as.numeric(): Extract the (possibly log-)Bayes factor values.
See examples and bayesfactor_methods.
A data frame containing the (log) Bayes factor representing evidence
against the un-restricted model (Use as.numeric() to extract the
non-log Bayes factors; see examples). (A bool_results attribute contains
the results for each sample, indicating if they are included or not in the
hypothesized restriction.)
It is important to provide the correct prior for meaningful results,
to match the posterior-type input:
A numeric vector - prior should also be a numeric vector, representing the prior-distribution
A data frame - prior should also be a data frame, representing the prior-estimates, in matching column order.
If rvar_col is specified, prior should be the name of an rvar column that represents the prior-estimates.
Supported Bayesian model (stanreg, brmsfit, etc.)
prior should be a model an equivalent model with MCMC samples from the priors only. See unupdate().
If prior is set to NULL, unupdate() is called internally (not supported for brmsfit_multiple model).
Output from a {marginaleffects} function - prior should also be an equivalent output from a {marginaleffects} function based on a prior-model
(See unupdate()).
Output from an {emmeans} function
prior should also be an equivalent output from an {emmeans} function based on a prior-model (See unupdate()).
prior can also be the original (posterior) model, in which case the function
will try to "unupdate" the estimates (not supported if the estimates have undergone
any transformations – "log", "response", etc. – or any regriding).
For multiple inputs (models or hypotheses), the function will return multiple
Bayes factors between each model and the same reference model (the
denominator or un-restricted model). However, we can take advantage of the
transitivity of Bayes factors - where if we have two Bayes factors for Model
A and model B against the same reference model C, we can obtain a Bayes
factor for comparing model A to model B by dividing them:
BF_{AB} = \frac{BF_{AC}}{BF_{BC}} = \frac{\frac{ML_{A}}{ML_{C}}}{\frac{ML_{B}}{ML_{C}}} = \frac{ML_{A}}{ML_{B}}
(Where ML is the marginal likelihood.)
A full matrix comparing all models can be obtained with as.matrix().
A Bayes factor greater than 1 can be interpreted as evidence against the
null, at which one convention is that a Bayes factor greater than 3 can be
considered as "substantial" evidence against the null (and vice versa, a
Bayes factor smaller than 1/3 indicates substantial evidence in favor of the
null-model). See also effectsize::interpret_bf().
Morey, R. D., & Wagenmakers, E. J. (2014). Simple relation between Bayesian order-restricted and point-null hypothesis tests. Statistics & Probability Letters, 92, 121-124.
Morey, R. D., & Rouder, J. N. (2011). Bayes factor approaches for testing interval null hypotheses. Psychological methods, 16(4), 406.
Morey, R. D. (Jan, 2015). Multiple Comparisons with BayesFactor, Part 2 – order restrictions. Retrieved from https://richarddmorey.org/category/order-restrictions/.
Other Bayes factors:
bayesfactor_inclusion(),
bayesfactor_models(),
bayesfactor_parameters()
set.seed(444)
library(bayestestR)
prior <- data.frame(
A = rnorm(500),
B = rnorm(500),
C = rnorm(500)
)
posterior <- data.frame(
A = rnorm(500, .4, 0.7),
B = rnorm(500, -.2, 0.4),
C = rnorm(500, 0, 0.5)
)
hyps <- c(
"A > B & B > C",
"A > B & A > C",
"C > A"
)
(b <- bayesfactor_restricted(posterior, hypothesis = hyps, prior = prior))
# See the matrix of BFs
as.matrix(b)
bool <- as.logical(b, which = "posterior")
head(bool)
see::plots(
plot(estimate_density(posterior)),
# distribution **conditional** on the restrictions
plot(estimate_density(posterior[bool[, hyps[1]], ])) + ggplot2::ggtitle(hyps[1]),
plot(estimate_density(posterior[bool[, hyps[2]], ])) + ggplot2::ggtitle(hyps[2]),
plot(estimate_density(posterior[bool[, hyps[3]], ])) + ggplot2::ggtitle(hyps[3]),
guides = "collect"
)
# rstanarm models
# ---------------
data("mtcars")
fit_stan <- rstanarm::stan_glm(mpg ~ wt + cyl + am,
data = mtcars, refresh = 0
)
hyps <- c(
"am > 0 & cyl < 0",
"cyl < 0",
"wt - cyl > 0"
)
bayesfactor_restricted(fit_stan, hypothesis = hyps)
# emmGrid objects
# ---------------
# replicating http://bayesfactor.blogspot.com/2015/01/multiple-comparisons-with-bayesfactor-2.html
data("disgust")
contrasts(disgust$condition) <- contr.equalprior_pairs # see vignette
fit_model <- rstanarm::stan_glm(score ~ condition, data = disgust, family = gaussian())
em_condition <- emmeans::emmeans(fit_model, ~condition, data = disgust)
hyps <- c("lemon < control & control < sulfur")
bayesfactor_restricted(em_condition, prior = fit_model, hypothesis = hyps)
# > # Bayes Factor (Order-Restriction)
# >
# > Hypothesis P(Prior) P(Posterior) BF
# > lemon < control & control < sulfur 0.17 0.75 4.49
# > ---
# > Bayes factors for the restricted model vs. the un-restricted model.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.