arviz.psens#
- arviz.psens(data, *, component='prior', component_var_names=None, component_coords=None, var_names=None, coords=None, filter_vars=None, delta=0.01, dask_kwargs=None)[source]#
Compute power-scaling sensitivity diagnostic.
Power-scales the prior or likelihood and calculates how much the posterior is affected.
- Parameters:
- data
obj
Any object that can be converted to an
arviz.InferenceData
object. Refer to documentation ofarviz.convert_to_dataset()
for details. For ndarray: shape = (chain, draw). For n-dimensional ndarray transform first to dataset withaz.convert_to_dataset
.- component{“prior”, “likelihood”}, default “prior”
When
component
is “likelihood”, the log likelihood values are retrieved from thelog_likelihood
group as pointwise log likelihood and added together. With “prior”, the log prior values are retrieved from thelog_prior
group.- component_var_names
str
, optional Name of the prior or log likelihood variables to use
- component_coords
dict
, optional Coordinates defining a subset over the component element for which to compute the prior sensitivity diagnostic.
- var_names
list
ofstr
, optional Names of posterior variables to include in the power scaling sensitivity diagnostic
- coords
dict
, optional Coordinates defining a subset over the posterior. Only these variables will be used when computing the prior sensitivity.
- filter_vars: {None, “like”, “regex”}, default None
If
None
(default), interpret var_names as the real variables names. If “like”, interpret var_names as substrings of the real variables names. If “regex”, interpret var_names as regular expressions on the real variables names.- delta
float
Value for finite difference derivative calculation.
- dask_kwargs
dict
, optional Dask related kwargs passed to
wrap_xarray_ufunc()
.
- data
- Returns:
xarray.Dataset
Returns dataset of power-scaling sensitivity diagnostic values. Higher sensitivity values indicate greater sensitivity. Prior sensitivity above 0.05 indicates informative prior. Likelihood sensitivity below 0.05 indicates weak or nonin-formative likelihood.
Notes
The diagnostic is computed by power-scaling the specified component (prior or likelihood) and determining the degree to which the posterior changes as described in [1]. It uses Pareto-smoothed importance sampling to avoid refitting the model.
References
[1]Kallioinen et al, Detecting and diagnosing prior and likelihood sensitivity with power-scaling, 2022, https://arxiv.org/abs/2107.14054
Examples
Compute the likelihood sensitivity for the non centered eight model:
In [1]: import arviz as az ...: data = az.load_arviz_data("non_centered_eight") ...: az.psens(data, component="likelihood") ...: Out[1]: <xarray.Dataset> Dimensions: (school: 8) Coordinates: * school (school) <U16 'Choate' 'Deerfield' ... "St. Paul's" 'Mt. Hermon' Data variables: mu float64 0.09673 theta_t (school) float64 0.03804 0.01805 0.01727 ... 0.04732 0.007672 tau float64 0.03095 theta (school) float64 0.07747 0.08618 0.03315 ... 0.08787 0.03992
To compute the prior sensitivity, we need to first compute the log prior at each posterior sample. In our case, we know mu has a normal prior \(N(0, 5)\), tau is a half cauchy prior with scale/beta parameter 5, and theta has a standard normal as prior. We add this information to the
log_prior
group before computing powerscaling check withpsens
In [2]: from xarray_einstats.stats import XrContinuousRV ...: from scipy.stats import norm, halfcauchy ...: post = data.posterior ...: log_prior = { ...: "mu": XrContinuousRV(norm, 0, 5).logpdf(post["mu"]), ...: "tau": XrContinuousRV(halfcauchy, scale=5).logpdf(post["tau"]), ...: "theta_t": XrContinuousRV(norm, 0, 1).logpdf(post["theta_t"]), ...: } ...: data.add_groups({"log_prior": log_prior}) ...: az.psens(data, component="prior") ...: Out[2]: <xarray.Dataset> Dimensions: (school: 8) Coordinates: * school (school) <U16 'Choate' 'Deerfield' ... "St. Paul's" 'Mt. Hermon' Data variables: mu float64 0.1106 theta_t (school) float64 0.1282 0.08115 0.06867 ... 0.07777 0.1025 0.08952 tau float64 0.06421 theta (school) float64 0.1684 0.07522 0.06509 ... 0.06178 0.1197 0.09038