ベータ二項cdf、sf、ppfで使用する一般化された超幾何関数を実装する方法は?


7

私はscipy.stats._distn_infrastructure.rv_discreteそのPMFがベータ二項分布のサブクラスを書いています

P(X=k∣N,α,β)(Nk)B(k+α,N−k+β)B(α,β),

ここで、Bはベータ関数です。私のCDFとSF(生存関数、1-CDFに相当)の現在の実装は不正確です。私が採用した戦略は、ベータ成分に関して二項累積分布関数の期待値を計算します。

PBB(X≤k∣N,α,β)=Ep[PBinom(X≤k∣N,p)],
where p∼Beta(α,β)。私scipy.stats.beta.expectは、本来はベクトル化されていないメソッドを使用してこれを実現しています(floatまたは0d配列以外ではクラッシュします)。

PPFはさらに悪くなる-それは、ブルートフォース整数をループだk=0,…,Nよう

P(X≤k∣N,α,β)≤q.

ウィキペディアによると、ベータ二項分布の生存関数は

P(X>k∣N,α,β)=B(β+n−k−1,α+k+1)3F2(a,b;k)B(α,β)B(n−k,k+2)(n+1),

ここで、は一般化された超幾何関数です。これをPythonで計算する効率的な方法はありますか?また、どのように私は、この機能を反転させるために解決してしまう与えられた?3F2beta.expectkq=P(X≤k∣N,α,β)


これは、の値のことを知ることが役立つかもしれない(暗黙的に)ここに表示されていること、ある多項式における度(、)。一般的には単純化されません。a,b3F2(;;z)zn−k−1−1≤k≤n−1
— whuber

あなたの質問に対する解決策を見つけましたか?はいの場合、それを質問への回答として共有したいですか?
— Tim

回答:


2

これはあなたの質問に直接答えるものではありませんが、ベータ二項分布の累積分布関数をより効率的に推定することを考えている場合は、単純な実装よりも少し効率的な再帰アルゴリズムを使用できます。

ベータ二項分布の確率質量関数

f(x)=(nx)B(x+α,n−x+β)B(α,β)

あなたがいることを思い出した場合に書き換えることができる、および、そしてなので、B(x,y)=Γ(x)Γ(y)Γ(x+y)Γ(x)=(x−1)!(nk)=∏i=1kn+1−ii

f(x)=(∏i=1xn+1−ii)(α+x−1)!(β+n−x−1)!(α+β+n−1)!B(α,β)

これにより、からへの更新が簡単になりますxx+1

f(x+1)=(∏i=1xn+1−ii)n+1−x+1x+1(α+x−1)!(α+x)(β+n−x−1)!(β+n−x)−1(α+β+n−1)!(α+β+n)B(α,β)

これを使用して、累積分布関数を次のように計算できます。

F(x)=∑k=0xf(k)

コンピュータを多用する関数を計算するのではなく、単純な算術演算を使用します。

補足:大きな数値を扱う場合、数値の精度の問題が発生するため、より堅牢なコードでは対数を処理する必要がありますが、効率の向上が期待できます(私がいくつかのベンチマークを実行した場合、最大2〜3倍高速なコード)ナイーブ実装と比較してそれを実装するC ++コード)。


1
別のメモ。最初の項のベータ積分の比率は、別の単純な積 これは、簡略化しf(0)=B(a,n+b)B(a,b)=Γ(n+b)Γ(a+b)Γ(n+a+b)Γ(b)∏j=1nn+b−jn+a+b−j
— 確率
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.