Làm thế nào để thực hiện chức năng siêu bội tổng quát để sử dụng trong beta-binomial cdf, sf, ppf?


7

Tôi đang viết một lớp con scipy.stats._distn_infrastructure.rv_discretecho phân phối nhị thức beta có PMF là

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

Trong đó B là hàm Beta. Việc triển khai CDF và SF hiện tại của tôi (chức năng sinh tồn, tương đương với 1 - CDF) là không chính xác; chiến lược tôi sử dụng sẽ tính toán giá trị kỳ vọng của cdf nhị thức đối với thành phần beta:

PBB(XkN,α,β)=Ep[PBinom(XkN,p)],
trong đó pBeta(α,β) . Tôi đạt được điều này bằng cách sử dụng scipy.stats.beta.expectphương thức không được vector hóa hoàn toàn (nó sẽ sụp đổ trên bất cứ thứ gì ngoài mảng float hoặc 0d).

PPF thậm chí còn tệ hơn - đó là một vòng lặp mạnh mẽ trên các số nguyên k=0,,N sao cho

P(XkN,α,β)q.

Theo Wikipedia, chức năng sinh tồn cho phân phối nhị thức beta là

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

trong đó là hàm siêu bội tổng quát. Có cách nào hiệu quả để tính toán điều này trong Python, vì vậy tôi có thể xóa tham chiếu đến không? Ngoài ra, làm cách nào để đảo ngược hàm này để giải quyết cho cho ?3F2beta.expectkq=P(XkN,α,β)


Có thể giúp biết rằng đối với các giá trị của mà (ngầm) xuất hiện ở đây, là một đa thức trong (độ , ). Nó không đơn giản hóa nói chung. a,b3F2(;;z)znk11kn1
whuber

Bạn đã tìm thấy bất kỳ giải pháp cho câu hỏi của bạn? Nếu có, có lẽ bạn muốn chia sẻ nó như một câu trả lời cho câu hỏi của bạn?
Tim

Câu trả lời:


2

Điều này không trả lời trực tiếp câu hỏi của bạn, nhưng nếu bạn đang nghĩ đến việc ước tính hàm phân phối tích lũy của beta-binomial hiệu quả hơn, thì bạn có thể sử dụng thuật toán đệ quy hiệu quả hơn một chút so với triển khai ngây thơ.

Lưu ý rằng hàm khối lượng xác suất của phân phối nhị thức beta

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

có thể được viết lại nếu bạn nhớ rằng vàvà , để nó trở thànhB(x,y)=Γ(x)Γ(y)Γ(x+y)Γ(x)=(x1)!(nk)=i=1kn+1ii

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

điều này giúp việc cập nhật từ lên dễ dàngxx+1

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

và sử dụng điều này, bạn có thể tính toán hàm phân phối tích lũy như

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

chỉ sử dụng các phép toán số học đơn giản thay vì tính toán các hàm chuyên sâu cho máy tính.

Sidenote: khi xử lý số lớn, bạn sẽ gặp các vấn đề về độ chính xác số, do đó, mã mạnh hơn sẽ cần làm việc với logarit, nhưng ngay cả khi bạn có thể mong đợi cải thiện hiệu quả (mã nhanh hơn gấp 2 đến 3 lần khi tôi chạy vài điểm chuẩn Mã C ++ thực hiện nó so với triển khai ngây thơ).


1
Một lưu ý khác. Tỷ lệ tích phân beta cho thuật ngữ đầu tiên là một sản phẩm đơn giản khác điều này đơn giản hóa thànhf(0)=B(a,n+b)B(a,b)=Γ(n+b)Γ(a+b)Γ(n+a+b)Γ(b)j=1nn+bjn+a+bj
xác suất
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.