Source code for gensbi.diagnostics.utils
"""Shared statistical utilities for diagnostic functions."""
import numpy as np
import scipy.stats
[docs]
def probit(x):
"""
Inverse CDF of the standard normal distribution.
Parameters
----------
x : array_like
Input values in (0, 1).
Returns
-------
y : array_like
The probit values.
"""
return scipy.stats.norm.ppf(x)
[docs]
def z_from_alpha(alpha):
"""
Convert significance level alpha to z-score.
Parameters
----------
alpha : array_like
Significance levels.
Returns
-------
z : array_like
Corresponding z-scores.
"""
return probit(1 - alpha / 2)
[docs]
def alpha_from_z(z):
"""
Convert z-score to significance level alpha.
Parameters
----------
z : array_like
Z-scores.
Returns
-------
alpha : array_like
Corresponding significance levels.
"""
return 2 - scipy.stats.norm.cdf(z) * 2
[docs]
def jefferys_interval(k, n, z=1):
"""
Compute Jeffrey's interval for a binomial proportion.
Uses the Beta distribution with Jeffrey's prior (Beta(0.5, 0.5)).
Parameters
----------
k : array_like
Number of successes.
n : int or array_like
Total number of trials.
z : float, optional
Z-score controlling the interval width (default is 1, i.e. ~68% CI).
Returns
-------
lower : np.ndarray
Lower bounds of the interval.
upper : np.ndarray
Upper bounds of the interval.
"""
alpha = alpha_from_z(z=z)
lower = scipy.stats.beta.ppf(alpha / 2, k + 0.5, n - k + 0.5)
upper = scipy.stats.beta.ppf(1 - alpha / 2, k + 0.5, n - k + 0.5)
lower = np.where(k > 0, lower, 0.0)
upper = np.where(k < n, upper, 1.0)
return lower, upper