我想知道是否有人知道可靠且快速的分析 HDI 计算,最好是用于 beta 函数。
HDI的定义在这个称为“最高后密度区域”的问题中。
我正在寻找具有以下 I/O 的函数:
输入
credMass
- 可信区间质量(例如,0.95
95% 可信区间)a
- 形状参数(例如,HEADS 硬币投掷次数)b
- 形状参数(例如,TAILS 掷硬币的次数)
输出
ci_min
- 质量的最小界限(到 之间0.
的值ci_max
)ci_max
- 质量的最大界限(到 之间ci_min
的值1.
)
解决这个问题的一种方法是加速我在同一个问题中找到的这个脚本(从 R 改编为 Python),并取自 John K. Kruschke 的《做贝叶斯数据分析》一书)。我用过这个解决方案,相当可靠,但是多次调用有点太慢了。加速 100 倍甚至 10 倍将非常有帮助!
from scipy.optimize import fmin
from scipy.stats import *
def HDIofICDF(dist_name, credMass=0.95, **args):
# freeze distribution with given arguments
distri = dist_name(**args)
# initial guess for HDIlowTailPr
incredMass = 1.0 - credMass
def intervalWidth(lowTailPr):
return distri.ppf(credMass + lowTailPr) - distri.ppf(lowTailPr)
# find lowTailPr that minimizes intervalWidth
HDIlowTailPr = fmin(intervalWidth, incredMass, ftol=1e-8, disp=False)[0]
# return interval as array([low, high])
return distri.ppf([HDIlowTailPr, credMass + HDIlowTailPr])
用法
print HDIofICDF(beta, credMass=0.95, a=5, b=4)
警告!一些解决方案将此 HDI 与等尾区间解决方案(上述问题称为“中央可信区域”)混淆,后者更容易计算,但不回答相同的问题。(例如,参见 Kruschke 的Why HDI and not equal-tailed interval?)
此外,这个问题不涉及我在 PyMC3 中看到的 MCMC 方法(pymc3.stats.hpd(a)
其中a
是随机变量样本),而是涉及分析解决方案。
谢谢!