私の理解では、「中央信頼領域」は、信頼区間の計算方法と何ら変わりはありません。必要なのは、cdf
関数 atalpha/2
と1-alpha/2
;の逆関数だけです。scipy
これで呼び出されますppf
( パーセンテージポイント関数 ); ガウス事後分布の場合は次のようになります。
>>> from scipy.stats import norm
>>> alpha = .05
>>> l, u = norm.ppf(alpha / 2), norm.ppf(1 - alpha / 2)
事後密度が[l, u]
カバーされていることを確認するには:(1-alpha)
>>> norm.cdf(u) - norm.cdf(l)
0.94999999999999996
a=1
同様に、 sayとを使用した Beta posterior の場合b=3
:
>>> from scipy.stats import beta
>>> l, u = beta.ppf(alpha / 2, a=1, b=3), beta.ppf(1 - alpha / 2, a=1, b=3)
そしてまた:
>>> beta.cdf(u, a=1, b=3) - beta.cdf(l, a=1, b=3)
0.94999999999999996
ここでは、scipy に含まれているパラメトリック分布を確認できます。ppf
そして、それらすべてに機能があると思います。
事後密度が最も高い領域に関しては、pdf
機能が必ずしも可逆的ではないため、より注意が必要です。一般に、そのような領域は接続されていない場合もあります。たとえば、ベータ版の場合(ここa = b = .5
で見られるように);
しかし、ガウス分布の場合、「最高事後密度領域」が「中央信頼領域」と一致することは容易にわかります。そして、それはすべての対称単峰分布の場合だと思います(つまり、pdf関数が分布のモードを中心に対称である場合)
一般的なケースで考えられる数値的アプローチは、 の数値積分をp*
使用した の値に対する二分探索です。積分が の単調関数であるという事実を利用する;pdf
p*
混合ガウスの例を次に示します。
[ 1 ]最初に必要なのは、分析用の pdf 関数です。簡単な混合ガウスの場合:
def mix_norm_pdf(x, loc, scale, weight):
from scipy.stats import norm
return np.dot(weight, norm.pdf(x, loc, scale))
たとえば、場所、スケール、および重量の値については、次のように
loc = np.array([-1, 3]) # mean values
scale = np.array([.5, .8]) # standard deviations
weight = np.array([.4, .6]) # mixture probabilities
手をつないで 2 つの素敵なガウス分布が得られます。

[2]p*
ここで、上記のpdf関数を統合するためのテスト値を指定p*
し、目的の値から二乗誤差を返すエラー関数が必要です1 - alpha
。
def errfn( p, alpha, *args):
from scipy import integrate
def fn( x ):
pdf = mix_norm_pdf(x, *args)
return pdf if pdf > p else 0
# ideally integration limits should not
# be hard coded but inferred
lb, ub = -3, 6
prob = integrate.quad(fn, lb, ub)[0]
return (prob + alpha - 1.0)**2
[ 3 ]ここで、 の特定の値に対してalpha
、誤差関数を最小化して を取得できp*
ます。
alpha = .05
from scipy.optimize import fmin
p = fmin(errfn, x0=0, args=(alpha, loc, scale, weight))[0]
その結果、p* = 0.0450
、および HPD は次のようになります。赤い領域1 - alpha
は分布を表し、水平の破線はp*
です。
