Saya memodelkan variabel acak ( ) yang merupakan jumlah dari beberapa ~ 15-40k variabel acak Bernoulli independen ( ), masing-masing dengan probabilitas keberhasilan yang berbeda ( ). Secara formal, mana dan \ Pr (X_i = 0) = 1-p_i .
Saya tertarik untuk dengan cepat menjawab pertanyaan seperti (di mana diberikan).
Saat ini, saya menggunakan simulasi acak untuk menjawab pertanyaan seperti itu. Saya secara acak menggambar setiap sesuai dengan p_i -nya , lalu menjumlahkan semua nilai untuk mendapatkan . Saya ulangi proses ini beberapa ribu kali dan mengembalikan fraksi kali .
Jelas, ini tidak sepenuhnya akurat (walaupun keakuratannya meningkat dengan meningkatnya jumlah simulasi). Juga, sepertinya saya punya cukup data tentang distribusi untuk menghindari penggunaan simulasi. Bisakah Anda memikirkan cara yang masuk akal untuk mendapatkan probabilitas yang tepat ?
ps
Saya menggunakan Perl & R.
EDIT
Mengikuti tanggapan saya pikir beberapa klarifikasi mungkin diperlukan. Saya akan segera menjelaskan pengaturan masalah saya. Diberikan adalah genom melingkar dengan keliling c
dan seperangkat n
rentang yang dipetakan untuk itu. Sebagai contoh, c=3*10^9
dan ranges={[100,200],[50,1000],[3*10^9-1,1000],...}
. Perhatikan bahwa semua rentang ditutup (kedua ujungnya termasuk). Perhatikan juga bahwa kami hanya berurusan dengan bilangan bulat (seluruh unit).
Saya mencari daerah di lingkaran yang tertutup oleh n
rentang yang dipetakan. Jadi untuk menguji apakah rentang panjang tertentu x
pada lingkaran tertutup, saya menguji hipotesis bahwa n
rentang tersebut dipetakan secara acak. Probabilitas rentang panjang yang dipetakan q>x
akan sepenuhnya mencakup rentang panjang yang x
diberikan (q-x)/c
. Probabilitas ini menjadi sangat kecil ketika c
besar dan / atau q
kecil. Yang saya minati adalah jumlah rentang (dari n
) yang mencakup x
. Beginilah cara Y
terbentuk.
Saya menguji hipotesis nol saya vs. alternatif satu sisi (undercoverage). Perhatikan juga saya sedang menguji beberapa hipotesis ( x
panjang yang berbeda ), dan pastikan untuk memperbaiki ini.
p_i
s adalah tetap.Jawaban:
Jika sering menyerupai Poisson , pernahkah Anda mencoba memperkirakannya dengan Poisson dengan parameter ?λ=∑pi
EDIT : Saya telah menemukan hasil teoritis untuk membenarkan ini, serta nama untuk distribusi : itu disebut distribusi binomial Poisson . Ketidaksetaraan Le Cam memberitahu Anda seberapa dekat distribusinya didekati dengan distribusi Poisson dengan parameter λ = Σ p i . Ini memberitahu Anda kualitas kira-kira ini diatur oleh jumlah kuadrat dari p i , untuk parafrase Steele (1994) . Jadi jika semua Anda p i s cukup kecil, seperti yang sekarang muncul mereka, itu harus baik pendekatan yang cukup.Y λ=∑pi pi pi
EDIT 2 : Seberapa kecil 'cukup kecil'? Yah, itu tergantung seberapa baik Anda membutuhkan perkiraan untuk menjadi! The artikel Wikipedia pada teorema Le Cam memberikan bentuk yang tepat dari hasil yang saya sebut di atas: jumlah dari perbedaan absolut antara fungsi massa probabilitas (PMF) dari dan PMF di atas Poisson distribusi tidak lebih dari dua kali jumlah tersebut dari kotak p i s. Hasil lain dari Le Cam (1960) mungkin lebih mudah untuk digunakan: jumlah ini juga tidak lebih dari 18 kali terbesar p i . Ada beberapa hasil seperti itu ... lihat Serfling (1978) untuk satu ulasan.Y pi pi
sumber
Saya menemukan pertanyaan Anda saat mencari solusi untuk masalah ini. Saya tidak puas dengan jawaban di sini, tetapi saya pikir ada solusi yang cukup sederhana yang memberi Anda distribusi yang tepat, dan sangat mudah ditelusuri.
Distribusi jumlah dua variabel acak diskrit adalah konvolusi kepadatannya. Jadi jika Anda memiliki mana Anda tahu P ( X ) dan P ( Y ) maka Anda dapat menghitung:Z=X+Y P(X) P(Y)
(Tentu saja untuk variabel acak Bernoulli Anda tidak perlu pergi cukup hingga tak terbatas.)
Anda dapat menggunakan ini untuk menemukan distribusi tepat jumlah RV Anda. Pertama jumlah dua RV bersama-sama dengan menggabungkan PDF mereka (misalnya [0,3, 0,7] * [0,6, 0,4] = [0,18, 0,54, 0,28]). Kemudian gabungkan distribusi baru itu dengan Bernoulli PDF Anda berikutnya (mis. [0,18, 0,54, 0,28] * [0,5, 0,5] = [0,09, 0,36, 0,41, 0,14]). Terus ulangi ini sampai semua RV telah ditambahkan. Dan voila, vektor yang dihasilkan adalah PDF yang tepat dari jumlah semua variabel Anda.
Saya telah memverifikasi dengan simulasi bahwa ini menghasilkan hasil yang benar. Itu tidak bergantung pada asumsi asimptotik, dan tidak memiliki persyaratan bahwa prob Bernoulli kecil.
Mungkin juga ada beberapa cara untuk melakukan ini lebih efisien daripada lilitan yang berulang, tetapi saya belum memikirkannya secara mendalam. Saya harap ini membantu seseorang!
sumber
multinomial[p_] := Module[{lc, condense}, lc = Function[{s}, ListConvolve[s[[1]], s[[2]], {1, -1}, 0]]; condense = Function[{s}, Map[lc, Partition[s, 2, 2, {1, 1}, {{1}}]]]; Flatten[NestWhile[condense, Transpose[{1 - p, p}], Length[#] > 1 &]]]
Untuk menerapkannya, lakukan sesuatu sepertip = RandomReal[{0, 1}, 40000]; pp = multinomial[p];
. Ini menciptakan probabilitasp
dan kemudian menghitung distribusi yang tepatpp
. NB Ketika reratap
tidak ekstrim, distribusinya sangat dekat dengan normal: yang mengarah pada algoritma yang jauh lebih cepat.@onestop memberikan referensi yang bagus. Artikel Wikipedia tentang distribusi binomial Poisson memberikan rumus rekursif untuk menghitung distribusi probabilitas yang tepat; membutuhkan upaya . Sayangnya, ini adalah jumlah yang bolak-balik, sehingga secara numerik tidak stabil: sia-sia untuk melakukan perhitungan ini dengan aritmatika floating point. Untungnya, ketika p i kecil, Anda hanya perlu menghitung sejumlah kecil probabilitas, sehingga upaya ini benar-benar sebanding dengan O ( n log ( μ i p i ) ) . Ketelitian yang diperlukan untuk melakukan perhitungan dengan aritmatika rasional (O(n2) pi O(nlog(∑ipi)) yaitu, tepat,sehingga ketidakstabilan angka tidak menjadi masalah) tumbuh cukup lambat sehingga waktu keseluruhan mungkin masih sekitar . Itu layak.O(n2)
Sebagai tes, saya membuat array probabilitas untuk berbagai nilai n hingga n = 2 16 , yang merupakan ukuran dari masalah ini. Untuk nilai-nilai kecil n (hingga n = 2 12 ) waktu untuk perhitungan probabilitas yang tepat adalah dalam detik dan diskalakan secara kuadrat, jadi saya memberanikan perhitungan untuk n = 2 16pi=1/(i+1) n n=216 n n=212 n=216 hingga tiga SD di atas rata-rata (probabilitas untuk 0, 1, ..., 22 keberhasilan). Butuh 80 menit (dengan Mathematica 8), sesuai dengan perkiraan waktu. (Probabilitas yang dihasilkan adalah pecahan yang pembilang dan penyebutnya masing-masing memiliki sekitar 75.000 digit!) Ini menunjukkan perhitungan dapat dilakukan.
Alternatifnya adalah menjalankan simulasi panjang (sejuta percobaan harus dilakukan). Itu hanya harus dilakukan sekali, karena tidak berubah.pi
sumber
(Karena pendekatan ini tidak tergantung pada solusi lain yang dipasang, termasuk yang telah saya posting, saya menawarkannya sebagai tanggapan terpisah).
Anda dapat menghitung distribusi tepat dalam hitungan detik (atau kurang) asalkan jumlah pnya kecil.
Kami telah melihat saran bahwa distribusi mungkin kira-kira Gaussian (dalam beberapa skenario) atau Poisson (dalam skenario lain). Either way, kita tahu rerata adalah jumlah dari p i dan variansnya σ 2 adalah jumlah dari p i ( 1 - p i ) . Oleh karena itu distribusi akan terkonsentrasi dalam beberapa standar deviasi dari rata-rata, katakanlah z SD dengan z antara 4 dan 6 atau sekitar itu. Karena itu kita hanya perlu menghitung probabilitas bahwa jumlah X sama dengan (bilangan bulat) k untuk k = μμ pi σ2 pi(1−pi) z z X k hingga k = μ + z σ . Ketika sebagian besar p i kecil, σ 2 kira-kira sama dengan (tetapi sedikit kurang dari) μ , jadi untuk menjadi konservatif kita dapat melakukan perhitungan untuk k dalam interval [ μ - z √k=μ−zσ k=μ+zσ pi σ2 μ k [μ−zμ−−√,μ+zμ−−√] . For example, when the sum of the pi equals 9 and choosing z=6 in order to cover the tails well, we would need the computation to cover k in [9−69–√,9+69–√] = [0,27] , which is just 28 values.
The distribution is computed recursively. Letfi be the distribution of the sum of the first i of these Bernoulli variables. For any j from 0 through i+1 , the sum of the first i+1 variables can equal j in two mutually exclusive ways: the sum of the first i variables equals j and the i+1st is 0 or else the sum of the first i variables equals j−1 and the i+1st is 1 . Therefore
We only need to carry out this computation for integralj in the interval from max(0,μ−zμ−−√) to μ+zμ−−√.
When most of thepi are tiny (but the 1−pi are still distinguishable from 1 with reasonable precision), this approach is not plagued with the huge accumulation of floating point roundoff errors used in the solution I previously posted. Therefore, extended-precision computation is not required. For example, a double-precision calculation for an array of 216 probabilities pi=1/(i+1) (μ=10.6676 , requiring calculations for probabilities of sums between 0 and 31 ) took 0.1 seconds with Mathematica 8 and 1-2 seconds with Excel 2002 (both obtained the same answers). Repeating it with quadruple precision (in Mathematica) took about 2 seconds but did not change any answer by more than 3×10−15 . Terminating the distribution at z=6 SDs into the upper tail lost only 3.6×10−8 of the total probability.
Another calculation for an array of 40,000 double precision random values between 0 and 0.001 (μ=19.9093 ) took 0.08 seconds with Mathematica.
This algorithm is parallelizable. Just break the set ofpi into disjoint subsets of approximately equal size, one per processor. Compute the distribution for each subset, then convolve the results (using FFT if you like, although this speedup is probably unnecessary) to obtain the full answer. This makes it practical to use even when μ gets large, when you need to look far out into the tails (z large), and/or n is large.
The timing for an array ofn variables with m processors scales as O(n(μ+zμ−−√)/m) . Mathematica's speed is on the order of a million per second. For example, with m=1 processor, n=20000 variates, a total probability of μ=100 , and going out to z=6 standard deviations into the upper tail, n(μ+zμ−−√)/m=3.2 million: figure a couple seconds of computing time. If you compile this you might speed up the performance two orders of magnitude.
Incidentally, in these test cases, graphs of the distribution clearly showed some positive skewness: they aren't normal.
For the record, here is a Mathematica solution:
(NB The color coding applied by this site is meaningless for Mathematica code. In particular, the gray stuff is not comments: it's where all the work is done!)
An example of its use is
Edit
An
R
solution is ten times slower than Mathematica in this test case--perhaps I have not coded it optimally--but it still executes quickly (about one second):sumber
With differentpi your best bet I think is normal approximation. Let Bn=∑ni=1pi(1−pi) . Then
Update: The approximation error can be calculated from the following inequality:
As whuber pointed out, the convergence can be slow for badly behavedpi . For pi=11+i we have Bn≈lnn and Ln≈(lnn)−1/2 . Then taking n=216 we get that the maximum deviation from the standard normal cdf is a whopping 0.3.
sumber
Well, based on your description and the discussion in the comments it is clear thatY has mean ∑ipi and variance ∑ipi(1−pi) . The shape of Y 's distribution will ultimately depend on the behavior of pi . For suitably "nice" pi (in the sense that not too many of them are really close to zero), the distribution of Y will be approximately normal (centered right at ∑pi ). But as ∑ipi starts heading toward zero the distribution will be shifted to the left and when it crowds up against the y -axis it will start looking a lot less normal and a lot more Poisson, as @whuber and @onestop have mentioned.
From your comment "the distribution looks Poisson" I suspect that this latter case is what's happening, but can't really be sure without some sort of visual display or summary statistics about thep 's. Note however, as @whuber did, that with sufficiently pathological behavior of the p 's you can have all sorts of spooky things happen, like limits that are mixture distributions. I doubt that is the case here, but again, it really depends on what your p 's are doing.
As to the original question of "how to efficiently model", I was going to suggest a hierarchical model for you but it isn't really appropriate if thep 's are fixed constants. In short, take a look at a histogram of the p 's and make a first guess based on what you see. I would recommend the answer by @mpiktas (and by extension @csgillespie) if your p 's aren't too crowded to the left, and I would recommend the answer by @onestop if they are crowded left-ly.
By the way, here is the R code I used while playing around with this problem: the code isn't really appropriate if yourp 's are too small, but it should be easy to plug in different models for p (including spooky-crazy ones) to see what happens to the ultimate distribution of Y .
Now take a look at the results.
Have fun; I sure did.
sumber
I think other answers are great, but I didn't see any Bayesian ways of estimating your probability. The answer doesn't have an explicit form, but the probability can be simulated using R.
Here is the attempt:
Using wikipedia we can get estimates ofα^ and β^ (see parameter estimation section).
Now you can generate draws for theith step, generate pi from Beta(α^,β^) and then generate Xi from Ber(pi) . After you have done this N times you can get Y=∑Xi . This is a single cycle for generation of Y, do this M (large) number of times and the histogram for M Ys will be the estimate of density of Y.
This analysis is valid only whenpi are not fixed. This is not the case here. But I will leave it here, in case someone has a similar question.
sumber
As has been mentioned in other answers, the probability distribution you describe is the Poisson Binomial distribution. An efficient method for computing the CDF is given in Hong, Yili. On computing the distribution function for the Poisson binomial distribution.
The approach is to efficiently compute the DFT (discrete Fourier transform) of the characteristic function.
The characteristic function of the Poisson binomial distribution is give byϕ(t)=∏nj[(1−pj)+pjeit] (i=−1−−−√ ).
The algorithm is:
The algorithm is available in the poibin R package.
This approach gives much better results than the recursive formulations as they tend to lack numerical stability.
sumber
I would suggest applying Poisson approximation. It is well known (see A. D. Barbour, L. Holst and S. Janson: Poisson Approximation) that the total variation distance betweenY and a r.v. Z having Poisson distribution with the parameter ∑ipi is small:
supA|P(Y∈A)−P(Z∈A)|≤min{1,1∑ipi}∑ip2i.
There are also bounds in terms of information divergence (the Kullback-Leibler distance, you may see P. Harremoёs: Convergence to the Poisson Distribution in Information Divergence. Preprint no. 2, Feb. 2003, Mathematical Department, University of Copenhagen. http://www.harremoes.dk/Peter/poisprep.pdf and other publications of P.Harremoёs), chi-squared distance (see Borisov and Vorozheikin https://link.springer.com/article/10.1007%2Fs11202-008-0002-3) and some other distances.
For the accuracy of approximation|Ef(Y)−Ef(Z)| for unbounded functions f you may see Borisov and Ruzankin https://projecteuclid.org/euclid.aop/1039548369 .
Besides, that paper contains a simple bound for probabilities: for all A , we have
P(Y∈A)≤1(1−maxipi)2P(Z∈A).
sumber