Compute the Shortest Probability Interval (SPI) of posterior distributions. The SPI is a more computationally stable HDI. The implementation is based on the algorithm from the SPIn package.
Usage
spi(x, ...)
# S3 method for class 'numeric'
spi(x, ci = 0.95, verbose = TRUE, ...)
# S3 method for class 'data.frame'
spi(x, ci = 0.95, rvar_col = NULL, verbose = TRUE, ...)
# S3 method for class 'brmsfit'
spi(
x,
ci = 0.95,
effects = "fixed",
component = "conditional",
parameters = NULL,
verbose = TRUE,
...
)
# S3 method for class 'get_predicted'
spi(x, ci = 0.95, use_iterations = FALSE, verbose = TRUE, ...)
Arguments
- x
Vector representing a posterior distribution, or a data frame of such vectors. Can also be a Bayesian model. bayestestR supports a wide range of models (see, for example,
methods("hdi")
) and not all of those are documented in the 'Usage' section, because methods for other classes mostly resemble the arguments of the.numeric
or.data.frame
methods.- ...
Currently not used.
- ci
Value or vector of probability of the (credible) interval - CI (between 0 and 1) to be estimated. Default to
.95
(95%
).- verbose
Toggle off warnings.
- rvar_col
A single character - the name of an
rvar
column in the data frame to be processed. See example inp_direction()
.- effects
Should results for fixed effects (
"fixed"
, the default), random effects ("random"
) or both ("all"
) be returned? Only applies to mixed models. May be abbreviated.- 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):
component = "all"
returns all possible parameters.If
component = "location"
, location parameters such asconditional
,zero_inflated
,smooth_terms
, orinstruments
are returned (everything that are fixed or random effects - depending on theeffects
argument - but no auxiliary parameters).For
component = "distributional"
(or"auxiliary"
), components likesigma
,dispersion
,beta
orprecision
(and other auxiliary parameters) are returned.
- parameters
Regular expression pattern that describes the parameters that should be returned. Meta-parameters (like
lp__
orprior_
) are filtered by default, so only parameters that typically appear in thesummary()
are returned. Useparameters
to select specific parameters for the output.- use_iterations
Logical, if
TRUE
andx
is aget_predicted
object, (returned byinsight::get_predicted()
), the function is applied to the iterations instead of the predictions. This only applies to models that return iterations for predicted values (e.g.,brmsfit
models).
Value
A data frame with following columns:
Parameter
The model parameter(s), ifx
is a model-object. Ifx
is a vector, this column is missing.CI
The probability of the credible interval.CI_low
,CI_high
The lower and upper credible interval limits for the parameters.
Details
The SPI is an alternative method to the HDI (hdi()
) to quantify
uncertainty of (posterior) distributions. The SPI is said to be more stable
than the HDI, because, the "HDI can be noisy (that is, have a high Monte Carlo error)"
(Liu et al. 2015). Furthermore, the HDI is sensitive to additional assumptions,
in particular assumptions related to the different estimation methods, which
can make the HDI less accurate or reliable.
Note
The code to compute the SPI was adapted from the SPIn package, and slightly modified to be more robust for Stan models. Thus, credits go to Ying Liu for the original SPI algorithm and R implementation.
References
Liu, Y., Gelman, A., & Zheng, T. (2015). Simulation-efficient shortest probability intervals. Statistics and Computing, 25(4), 809–819. https://doi.org/10.1007/s11222-015-9563-8
Examples
library(bayestestR)
posterior <- rnorm(1000)
spi(posterior)
#> 95% SPI: [-1.96, 1.96]
spi(posterior, ci = c(0.80, 0.89, 0.95))
#> Shortest Probability Interval
#>
#> 80% SPI | 89% SPI | 95% SPI
#> ---------------------------------------------
#> [-1.17, 1.34] | [-1.50, 1.70] | [-1.96, 1.96]
df <- data.frame(replicate(4, rnorm(100)))
spi(df)
#> Shortest Probability Interval
#>
#> Parameter | 95% SPI
#> -------------------------
#> X1 | [-2.04, 1.89]
#> X2 | [-1.65, 1.96]
#> X3 | [-2.09, 1.74]
#> X4 | [-2.11, 1.97]
spi(df, ci = c(0.80, 0.89, 0.95))
#> Shortest Probability Interval
#>
#> Parameter | 80% SPI | 89% SPI | 95% SPI
#> ---------------------------------------------------------
#> X1 | [-1.05, 1.49] | [-1.41, 1.76] | [-2.04, 1.89]
#> X2 | [-0.90, 1.09] | [-1.33, 1.41] | [-1.65, 1.96]
#> X3 | [-1.38, 1.44] | [-1.84, 1.49] | [-2.09, 1.74]
#> X4 | [-1.27, 1.40] | [-1.61, 1.56] | [-2.11, 1.97]
# \donttest{
library(rstanarm)
model <- suppressWarnings(
stan_glm(mpg ~ wt + gear, data = mtcars, chains = 2, iter = 200, refresh = 0)
)
spi(model)
#> Shortest Probability Interval
#>
#> Parameter | 95% SPI
#> ----------------------------
#> (Intercept) | [29.08, 47.70]
#> wt | [-6.75, -4.12]
#> gear | [-1.74, 1.70]
# }