p_direction | R Documentation |
Compute the Probability of Direction (pd, also known as the Maximum Probability of Effect - MPE). This can be interpreted as the probability that a parameter (described by its posterior distribution) is strictly positive or negative (whichever is the most probable). Although differently expressed, this index is fairly similar (i.e., is strongly correlated) to the frequentist p-value (see details).
p_direction(x, ...)
pd(x, ...)
## S3 method for class 'numeric'
p_direction(
x,
method = "direct",
null = 0,
as_p = FALSE,
remove_na = TRUE,
...
)
## S3 method for class 'data.frame'
p_direction(
x,
method = "direct",
null = 0,
as_p = FALSE,
remove_na = TRUE,
rvar_col = NULL,
...
)
## S3 method for class 'brmsfit'
p_direction(
x,
effects = "fixed",
component = "conditional",
parameters = NULL,
method = "direct",
null = 0,
as_p = FALSE,
remove_na = TRUE,
...
)
## S3 method for class 'get_predicted'
p_direction(
x,
method = "direct",
null = 0,
as_p = FALSE,
remove_na = TRUE,
use_iterations = FALSE,
verbose = TRUE,
...
)
x |
A vector representing a posterior distribution, a data frame of posterior draws (samples be parameter). Can also be a Bayesian model. |
... |
Currently not used. |
method |
Can be |
null |
The value considered as a "null" effect. Traditionally 0, but could also be 1 in the case of ratios of change (OR, IRR, ...). |
as_p |
If |
remove_na |
Should missing values be removed before computation? Note
that |
rvar_col |
A single character - the name of an |
effects |
Should results for fixed effects ( |
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):
|
parameters |
Regular expression pattern that describes the parameters
that should be returned. Meta-parameters (like |
use_iterations |
Logical, if |
verbose |
Toggle off warnings. |
Values between 0.5 and 1 or between 0 and 1 (see above) corresponding to the probability of direction (pd).
The Probability of Direction (pd) is an index of effect existence, representing the certainty with which an effect goes in a particular direction (i.e., is positive or negative / has a sign), typically ranging from 0.5 to 1 (but see next section for cases where it can range between 0 and 1). Beyond its simplicity of interpretation, understanding and computation, this index also presents other interesting properties:
Like other posterior-based indices, pd is solely based on the posterior distributions and does not require any additional information from the data or the model (e.g., such as priors, as in the case of Bayes factors).
It is robust to the scale of both the response variable and the predictors.
It is strongly correlated with the frequentist p-value, and can thus be used to draw parallels and give some reference to readers non-familiar with Bayesian statistics (Makowski et al., 2019).
In most cases, it seems that the pd has a direct correspondence with the
frequentist one-sided p-value through the formula (for two-sided p):
p = 2 * (1 - pd)
Thus, a two-sided p-value of respectively .1
, .05
, .01
and .001
would
correspond approximately to a pd of 95%
, 97.5%
, 99.5%
and 99.95%
.
See pd_to_p()
for details.
The largest value pd can take is 1 - the posterior is strictly directional. However, the smallest value pd can take depends on the parameter space represented by the posterior.
For a continuous parameter space, exact values of 0 (or any point null
value) are not possible, and so 100% of the posterior has some sign, some
positive, some negative. Therefore, the smallest the pd can be is 0.5 -
with an equal posterior mass of positive and negative values. Values close to
0.5 cannot be used to support the null hypothesis (that the parameter does
not have a direction) is a similar why to how large p-values cannot be used
to support the null hypothesis (see pd_to_p()
; Makowski et al., 2019).
For a discrete parameter space or a parameter space that is a mixture between discrete and continuous spaces, exact values of 0 (or any point null value) are possible! Therefore, the smallest the pd can be is 0 - with 100% of the posterior mass on 0. Thus values close to 0 can be used to support the null hypothesis (see van den Bergh et al., 2021).
Examples of posteriors representing discrete parameter space:
When a parameter can only take discrete values.
When a mixture prior/posterior is used (such as the spike-and-slab prior; see van den Bergh et al., 2021).
When conducting Bayesian model averaging (e.g., weighted_posteriors()
or
brms::posterior_average
).
The pd is defined as:
p_d = max({Pr(\hat{\theta} < \theta_{null}), Pr(\hat{\theta} > \theta_{null})})
The most simple and direct way to compute the pd is to compute the
proportion of positive (or larger than null
) posterior samples, the
proportion of negative (or smaller than null
) posterior samples, and take
the larger of the two. This "simple" method is the most straightforward, but
its precision is directly tied to the number of posterior draws.
The second approach relies on density estimation: It starts by
estimating the continuous-smooth density function (for which many methods are
available), and then computing the area under the curve
(AUC) of the density curve on either side of null
and taking the maximum
between them. Note the this approach assumes a continuous density function,
and so when the posterior represents a (partially) discrete parameter
space, only the direct method must be used (see above).
Possible values for the component
argument depend on the model class.
Following are valid options:
"all"
: returns all model components, applies to all models, but will only
have an effect for models with more than just the conditional model
component.
"conditional"
: only returns the conditional component, i.e. "fixed
effects" terms from the model. Will only have an effect for models with
more than just the conditional model component.
"smooth_terms"
: returns smooth terms, only applies to GAMs (or similar
models that may contain smooth terms).
"zero_inflated"
(or "zi"
): returns the zero-inflation component.
"location"
: returns location parameters such as conditional
,
zero_inflated
, or smooth_terms
(everything that are fixed or random
effects - depending on the effects
argument - but no auxiliary
parameters).
"distributional"
(or "auxiliary"
): components like sigma
,
dispersion
, beta
or precision
(and other auxiliary parameters) are
returned.
For models of class brmsfit
(package brms), even more options are
possible for the component
argument, which are not all documented in detail
here. See also ?insight::find_parameters
.
There is also a plot()
-method implemented in the see-package.
Makowski, D., Ben-Shachar, M. S., Chen, S. A., & Lüdecke, D. (2019). Indices of effect existence and significance in the Bayesian framework. Frontiers in psychology, 10, 2767. \Sexpr[results=rd]{tools:::Rd_expr_doi("10.3389/fpsyg.2019.02767")}
van den Bergh, D., Haaf, J. M., Ly, A., Rouder, J. N., & Wagenmakers, E. J. (2021). A cautionary note on estimating effect size. Advances in Methods and Practices in Psychological Science, 4(1). \Sexpr[results=rd]{tools:::Rd_expr_doi("10.1177/2515245921992035")}
pd_to_p()
to convert between Probability of Direction (pd) and p-value.
library(bayestestR)
# Simulate a posterior distribution of mean 1 and SD 1
# ----------------------------------------------------
posterior <- rnorm(1000, mean = 1, sd = 1)
p_direction(posterior)
p_direction(posterior, method = "kernel")
# Simulate a dataframe of posterior distributions
# -----------------------------------------------
df <- data.frame(replicate(4, rnorm(100)))
p_direction(df)
p_direction(df, method = "kernel")
# rstanarm models
# -----------------------------------------------
model <- rstanarm::stan_glm(mpg ~ wt + cyl,
data = mtcars,
chains = 2, refresh = 0
)
p_direction(model)
p_direction(model, method = "kernel")
# emmeans
# -----------------------------------------------
p_direction(emmeans::emtrends(model, ~1, "wt", data = mtcars))
# brms models
# -----------------------------------------------
model <- brms::brm(mpg ~ wt + cyl, data = mtcars)
p_direction(model)
p_direction(model, method = "kernel")
# BayesFactor objects
# -----------------------------------------------
bf <- BayesFactor::ttestBF(x = rnorm(100, 1, 1))
p_direction(bf)
p_direction(bf, method = "kernel")
# Using "rvar_col"
x <- data.frame(mu = c(0, 0.5, 1), sigma = c(1, 0.5, 0.25))
x$my_rvar <- posterior::rvar_rng(rnorm, 3, mean = x$mu, sd = x$sigma)
x
p_direction(x, rvar_col = "my_rvar")
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.