Je suis en train de modéliser une variable aléatoire ( ) qui est la somme d'environ 15 à 40 000 variables aléatoires indépendantes de Bernoulli ( ), chacune avec une probabilité de réussite différente ( ). Formellement, où et \ Pr (X_i = 0) = 1-p_i .X i p i Y = ∑ X i Pr ( X i = 1 ) = p i Pr ( X i = 0 ) = 1 - p i
Je suis intéressé par répondre rapidement à des requêtes telles que (où est donné).
Actuellement, j'utilise des simulations aléatoires pour répondre à de telles questions. Je tire au hasard chaque fonction de son , puis additionne toutes les valeurs de pour obtenir . Je répète ce processus plusieurs milliers de fois et retourne la fraction de fois .
Évidemment, cela n’est pas totalement exact (bien que la précision augmente considérablement avec le nombre de simulations). De plus, il semble que j’ai assez de données sur la distribution pour éviter les simulations d’utilisation. Pouvez-vous penser à un moyen raisonnable d’obtenir la probabilité exacte ?
ps
J'utilise Perl & R.
MODIFIER
Suite aux réponses, j'ai pensé que des clarifications pourraient être nécessaires. Je vais bientôt décrire le cadre de mon problème. On donne un génome circulaire avec une circonférence c
et un ensemble de n
plages mappées sur celui-ci. Par exemple, c=3*10^9
et ranges={[100,200],[50,1000],[3*10^9-1,1000],...}
. Notez que toutes les plages sont fermées (les deux extrémités sont inclusives). Notez également que nous ne traitons que des entiers (unités entières).
Je cherche des régions du cercle qui sont sous-couvertes par les n
plages cartographiées données . Donc, pour vérifier si une plage de longueur donnée x
sur le cercle est sous-couverte, je vérifie l'hypothèse selon laquelle les n
plages sont mappées de manière aléatoire. La probabilité qu'une plage de longueur mappée q>x
couvre complètement la plage de longueur donnée x
est (q-x)/c
. Cette probabilité devient assez faible quand elle c
est grande et / ou q
petite. Ce qui m'intéresse, c'est le nombre de gammes (sur n
) qui couvrent x
. C'est comment Y
est formé.
Je teste mon hypothèse nulle par rapport à une alternative unilatérale (sous-dénombrement). Notez également que je teste plusieurs hypothèses (différentes x
longueurs) et que je vais corriger cela.
p_i
s sont fixes.Réponses:
Si cela ressemble souvent à un Poisson , avez-vous essayé de l'approcher par un Poisson avec le paramètre ?λ = ∑ pje
EDIT : J'ai trouvé un résultat théorique pour justifier cela, ainsi qu'un nom pour la distribution de : cela s'appelle la distribution binomiale de Poisson . L'inégalité de Le Cam vous dit à quel point sa distribution est approximée par la distribution d'un Poisson avec le paramètre . Il vous dit que la qualité de cette approximation est régie par la somme des carrés des s, pour paraphraser Steele (1994) . Donc, si tous vos sont raisonnablement petits, comme il semble maintenant qu'ils le soient, cela devrait être une assez bonne approximation.Y λ=∑pi pi pi
EDIT 2 : Quelle est la taille d'une "raisonnablement petite"? Eh bien, cela dépend de la qualité de l'approximation! L' article de Wikipedia sur le théorème de Le Cam donne la forme précise du résultat mentionné ci-dessus: la somme des différences absolues entre la fonction de masse de probabilité (pmf) de et la pmf de la distribution de Poisson ci-dessus n'est pas plus de deux fois la somme des carrés des s. Un autre résultat de Le Cam (1960) peut être plus facile à utiliser: cette somme ne représente pas plus de 18 fois le plus grand . Il y a encore un peu plus de ces résultats ... voir Serfling (1978) pour une revue.p i p iY pi pi
la source
Je suis tombé sur votre question en cherchant une solution à ce problème. Je n’étais pas terriblement satisfait des réponses fournies ici, mais je pense qu’il existe une solution assez simple qui vous donne la distribution exacte et qui est assez maniable.
La distribution de la somme de deux variables aléatoires discrètes est la convolution de leurs densités. Donc si vous avez où vous connaissez P ( X ) et P ( Y ), vous pouvez alors calculer:Z=X+Y P(X) P(Y)
(Bien sûr, pour les variables aléatoires de Bernoulli, vous n'avez pas besoin d'aller tout à fait à l'infini.)
Vous pouvez vous en servir pour trouver la distribution exacte de la somme de vos véhicules de plaisance. Faites d'abord la somme de deux des RV en convertissant leurs PDF (par exemple, [0,3, 0,7] * [0,6, 0,4] = [0,18, 0,54, 0,28]). Puis convoluez cette nouvelle distribution avec votre prochain fichier PDF de Bernoulli (par exemple, [0.18, 0.54, 0.28] * [0.5, 0.5] = [0.09, 0.36, 0.41, 0.14]). Continuez à répéter jusqu'à ce que tous les véhicules récréatifs ont été ajoutés. Et voila, le vecteur résultant est le PDF exact de la somme de toutes vos variables.
J'ai vérifié par simulation que cela produisait les bons résultats. Il ne repose sur aucune hypothèse asymptotique et n'exige pas que les problèmes de Bernoulli soient petits.
Il existe peut-être également un moyen de le faire plus efficacement qu'une convolution répétée, mais je n'y ai pas vraiment réfléchi. J'espère que cela est utile à quelqu'un!
la source
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 &]]]
Pour l'appliquer, faites quelque chose commep = RandomReal[{0, 1}, 40000]; pp = multinomial[p];
. Cela crée les probabilitésp
et calcule ensuite la distribution exactepp
. NB: lorsque la moyenne dep
n'est pas extrême, la distribution est très proche de la normale: cela conduit pour le moment à un algorithme beaucoup plus rapide.@onestop fournit de bonnes références. L'article de Wikipedia sur la distribution binomiale de Poisson donne une formule récursive pour calculer la distribution de probabilité exacte; il nécessite effort. Malheureusement, il s’agit d’une somme alternée, elle sera donc numériquement instable: il est impossible de faire ce calcul avec l’arithmétique en virgule flottante. Heureusement, lorsque le p i sont de petite taille, il vous suffit de calculer un petit nombre de probabilités, de sorte que l'effort est vraiment proportionnel à O ( n log ( Σ i p i ) ) . La précision nécessaire pour effectuer le calcul avec une arithmétique rationnelle (O(n2) pi O(nlog(∑ipi)) c’est-à-dire exactement, pour que l’instabilité numérique ne pose pas de problème) croît suffisamment lentement pour que le timing global puisse toujours être d’environ . C'est faisable.O(n2)
En guise de test, j'ai créé un tableau de probabilités pour diverses valeurs de n à n = 2 16 , ce qui correspond à la taille de ce problème. Pour les petites valeurs de n (jusqu'à n = 2 12 ), le calcul exact des probabilités était effectué en secondes et mis à l'échelle quadratique; j'ai donc tenté un calcul pour n = 2 16pi=1/(i+1) n n=216 n n=212 n=216 out to three SDs above the mean (probabilities for 0, 1, ..., 22 successes). It took 80 minutes (with Mathematica 8), in line with the predicted time. (The resulting probabilities are fractions whose numerators and denominators have about 75,000 digits apiece!) This shows the calculation can be done.
An alternative is to run a long simulation (a million trials ought to do). It only has to be done once, because thepi don't change.
la source
(Because this is approach is independent of the other solutions posted, including one that I have posted, I'm offering it as a separate response).
You can compute the exact distribution in seconds (or less) provided the sum of the p's is small.
Nous avons déjà vu des suggestions selon lesquelles la distribution pourrait être approximativement gaussienne (dans certains scénarios) ou de Poisson (dans d'autres scénarios). Quoi qu'il en soit, nous savons que sa moyenne est la somme des p i et que sa variance σ 2 est la somme de p i ( 1 - p i ) . Par conséquent, la distribution sera concentrée à quelques écarts-types de sa moyenne, par exemple z SD avec z compris entre 4 et 6 ou environ. Il suffit donc de calculer la probabilité que la somme X soit égale à (un entier) k pour k = μμ pi σ2 pi(1−pi) z z X k k=μ−zσ through k=μ+zσ . When most of the pi are small, σ2 is approximately equal to (but slightly less than) μ , so to be conservative we can do the computation for k in the interval [μ−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 1
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):la source
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.
la source
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.
la source
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.
la source
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.
la source
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).
la source