Wie implementiere ich eine verallgemeinerte hypergeometrische Funktion zur Verwendung in Beta-Binomial-PDF, SF, PFF?


7

Ich schreibe eine Unterklasse scipy.stats._distn_infrastructure.rv_discretefür die Beta-Binomialverteilung, deren PMF ist

P(X=kN,α,β)(Nk)B(k+α,Nk+β)B(α,β),

Dabei ist B die Beta-Funktion. Meine derzeitige Implementierung von CDF und SF (Überlebensfunktion, entspricht 1 - CDF) ist ungenau; Die Strategie, die ich angewendet habe, berechnet den erwarteten Wert des Binomial-PDF in Bezug auf die Beta-Komponente:

PBB(XkN,α,β)=Ep[PBinom(XkN,p)],
wobei . Ich erreiche dies mit der Methode, die nicht von Natur aus vektorisiert ist (sie stürzt auf etwas anderem als einem Float- oder 0d-Array ab).pBeta(α,β)scipy.stats.beta.expect

Die PPF ist noch schlimmer - es ist eine Brute-Force-Schleife über die ganzen Zahlen so dassk=0,,N

P(XkN,α,β)q.

Laut Wikipedia ist die Überlebensfunktion für die Beta-Binomialverteilung

P(X>kN,α,β)=B(β+nk1,α+k+1)3F2(a,b;k)B(α,β)B(nk,k+2)(n+1),

Dabei ist die verallgemeinerte hypergeometrische Funktion. Gibt es eine effiziente Möglichkeit, dies in Python zu berechnen, damit ich den Verweis auf entfernen kann ? Wie würde ich diese Funktion auch invertieren, um nach zu lösen, wenn ?3F2beta.expectkq=P(XkN,α,β)


Es könnte hilfreich sein zu wissen, dass für die Werte von , die hier (implizit) erscheinen, ein Polynom in (vom Grad , ). Es vereinfacht sich im Allgemeinen nicht. a,b3F2(;;z)znk11kn1
whuber

Haben Sie eine Lösung für Ihre Frage gefunden? Wenn ja, möchten Sie es vielleicht als Antwort auf Ihre Frage teilen?
Tim

Antworten:


2

Dies beantwortet Ihre Frage nicht direkt, aber wenn Sie daran denken, die kumulative Verteilungsfunktion von Beta-Binomial effizienter abzuschätzen, können Sie einen rekursiven Algorithmus verwenden, der etwas effizienter ist als die naive Implementierung.

Beachten Sie die Wahrscheinlichkeitsmassenfunktion der Beta-Binomialverteilung

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

kann neu geschrieben werden, wenn Sie sich daran erinnern, dass undund dass , so dass es wirdB(x,y)=Γ(x)Γ(y)Γ(x+y)Γ(x)=(x1)!(nk)=i=1kn+1ii

f(x)=(i=1xn+1ii)(α+x1)!(β+nx1)!(α+β+n1)!B(α,β)

Dies erleichtert das Aktualisieren von aufxx+1

f(x+1)=(i=1xn+1ii)n+1x+1x+1(α+x1)!(α+x)(β+nx1)!(β+nx)1(α+β+n1)!(α+β+n)B(α,β)

und damit können Sie die kumulative Verteilungsfunktion als berechnen

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

Verwenden Sie nur einfache arithmetische Operationen, anstatt computerintensivere Funktionen zu berechnen.

Nebenbemerkung: Wenn Sie mit großen Zahlen arbeiten, treten Probleme mit der numerischen Genauigkeit auf, sodass robusterer Code mit Logarithmen arbeiten muss, obwohl Sie eine Verbesserung der Effizienz erwarten können (bis zu zwei- bis dreimal schnellerer Code, wenn ich nur wenige Benchmarks ausgeführt habe) C ++ - Code, der es implementiert, im Vergleich zur naiven Implementierung).


1
Noch ein Hinweis. Das Verhältnis der Beta-Integrale für den ersten Term ist ein weiteres einfaches Produkt Dies vereinfacht sich zuf(0)=B(a,n+b)B(a,b)=Γ(n+b)Γ(a+b)Γ(n+a+b)Γ(b)j=1nn+bjn+a+bj
Wahrscheinlichkeitslogik
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.