Comment modéliser efficacement la somme des variables aléatoires de Bernoulli?


38

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 iYXipiY=XiPr(Xi=1)=piPr(Xi=0)=1pi

Je suis intéressé par répondre rapidement à des requêtes telles que Pr(Y<=k) (où k est donné).

Actuellement, j'utilise des simulations aléatoires pour répondre à de telles questions. Je tire au hasard chaque Xi fonction de son pi , puis additionne toutes les valeurs de Xi pour obtenir Y . Je répète ce processus plusieurs milliers de fois et retourne la fraction de fois Pr(Yk) .

É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 Pr(Yk) ?

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 cet un ensemble de nplages mappées sur celui-ci. Par exemple, c=3*10^9et 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 nplages cartographiées données . Donc, pour vérifier si une plage de longueur donnée xsur le cercle est sous-couverte, je vérifie l'hypothèse selon laquelle les nplages sont mappées de manière aléatoire. La probabilité qu'une plage de longueur mappée q>xcouvre complètement la plage de longueur donnée xest (q-x)/c. Cette probabilité devient assez faible quand elle cest grande et / ou qpetite. Ce qui m'intéresse, c'est le nombre de gammes (sur n) qui couvrent x. C'est comment Yest 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 xlongueurs) et que je vais corriger cela.


Vos p_i sont-ils fixes tout au long de l'exercice de modélisation ou peuvent-ils changer d'un calcul à l'autre?
whuber

Les p_is sont fixes.
David B

À la lumière des réponses actuelles, pourriez-vous partager des estimations de (a) la somme des p et de (b) la somme de leurs carrés? Ces valeurs déterminent vos options.
whuber

@whuber: ceux-ci varient considérablement d'un cas à l'autre. Ce n'est pas un module ponctuel que je crée (malheureusement).
David B

@ David Mais ne pouvez-vous pas donner quelques indications, telles que des plages typiques? Par exemple, si la somme des p va de 1 à 100, ces informations sont utiles et suggèrent des solutions efficaces, mais si elles peuvent atteindre 10 000, cela pourrait exclure certaines approches.
whuber

Réponses:


24

Si cela ressemble souvent à un Poisson , avez-vous essayé de l'approcher par un Poisson avec le paramètre ?λ=pi

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λ=pipipje

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 iYpipi


1
+1 Pas une mauvaise idée. Il est probable qu'un petit mélange de Poissons ferait un bon travail, en fonction de la clarification de la question.
whuber

1
J'ai effectivement pensé à suggérer une distribution binomiale négative, qui se présente sous la forme d'un mélange Gamma-Poisson, mais dont la variance est supérieure à sa moyenne, alors que la variance de ce problème est inférieure à sa moyenne. Sur cette base, je ne suis pas sûr si un mélange de Poissons fonctionnera, car un tel mélange aura sûrement une variance supérieure à sa moyenne.?
onestop

@onestop Où a-t-il été dit que la variance est inférieure à la moyenne? J'ai raté cette déclaration.
whuber

Désolé whuber, c'était un peu cryptique mais ces commentaires ne permettent pas beaucoup de développement. mpiktas est la variance, qui est inférieure à la moyenne, p i . Seulement un peu moins si les p i sont en moyenne très petits, donc un Poisson standard pourrait être un assez bon env. Peut-être que je devrais développer ma réponse ci-dessus .. mais le fil de conversation devient confus. Bn=pi(1pi)pipi
onestop

Que voulez-vous dire par ? Comment puis-je obtenir les valeurs X i ? XiXi
David B

11

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+YP(X)P(Y)

P(Z=z)=k=P(X=k)P(Y=zk)

(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!


2
Avez-vous essayé avec des variables de 40 Ko? (Je me demande combien d'heures ou de jours de calcul cela prend ...)
whuber

5
(+1) J'ai trouvé un moyen de faire fonctionner cette idée. Deux techniques sont nécessaires: premièrement, utiliser FFT pour les convolutions; D' autre part, ne le font pas de manière séquentielle, mais diviser pour mieux régner: les faire à deux disjoints, puis faites les résultats par paires disjointes, etc. L'algorithme maintenant des échelles comme plutôt que O ( n 2 ) pour n probabilités. Par exemple, Mathematica peut calculer la distribution complète pour 40 000 probabilités en seulement 0,4 seconde. (1 000 000 sont calculés en 10,5 secondes.) Je fournirai du code dans un commentaire ultérieur. O(nlogn)O(n2)n
whuber

7
Voici le code Mathematica : 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 comme p = RandomReal[{0, 1}, 40000]; pp = multinomial[p];. Cela crée les probabilités pet calcule ensuite la distribution exacte pp. NB: lorsque la moyenne de pn'est pas extrême, la distribution est très proche de la normale: cela conduit pour le moment à un algorithme beaucoup plus rapide.
whuber

9

@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)piO(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)nn=216nn=212n=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 the pi don't change.


9

(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σ2pi(1pi)zzXkk=μ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 [969,9+69] = [0,27], which is just 28 values.

The distribution is computed recursively. Let fi 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 j1 and the i+1st1

fi+1(j)=fi(j)(1pi+1)+fi(j1)pi+1.

We only need to carry out this computation for integral j in the interval from max(0,μzμ) to μ+zμ.

When most of the pi are tiny (but the 1pi 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×1015. Terminating the distribution at z=6 SDs into the upper tail lost only 3.6×108 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 of pi 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 of n 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:

pb[p_, z_] := Module[
  {\[Mu] = Total[p]},
  Fold[#1 - #2 Differences[Prepend[#1, 0]] &, 
   Prepend[ConstantArray[0, Ceiling[\[Mu] + Sqrt[\[Mu]] z]], 1], p]
  ]

(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

pb[RandomReal[{0, 0.001}, 40000], 8]

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):

pb <- function(p, z) {
  mu <- sum(p)
  x <- c(1, rep(0, ceiling(mu + sqrt(mu) * z)))
  f <- function(v) {x <<- x - v * diff(c(0, x));}
  sapply(p, f); x  
}
y <- pb(runif(40000, 0, 0.001), 8)
plot(y)

Plot of PDF


8

With different pi your best bet I think is normal approximation. Let Bn=i=1npi(1pi). Then

Bn1/2(i=1nXii=1npi)N(0,1),
as n, provided that for each ε>0

Bn1i=1nE((Xipi)21{|Xipi|>εBn1/2})0,
as n, which for Bernoulli variables will hold if Bn. This is the so-called Lindeberg condition, which is sufficient and necessary for convergence to the standard normal.

Update: The approximation error can be calculated from the following inequality:

supx|Fn(x)Φ(x)|ALn,
where
Ln=Bn3/2i=1nE|Xipi|3
and Fn is the cdf of the scaled and centered sum of Xi.

As whuber pointed out, the convergence can be slow for badly behaved pi. For pi=11+i we have Bnlnn 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.


3
This is not true when the p_i approach zero as i increases. Otherwise, you have just proven that the Poisson distribution is Normal!
whuber

1
That is why it must be Bn. If pi approach zero at rate faster than 1/i, limBn<.
mpiktas

@mpiktas is right. The analogy to the Poisson distribution doesn't quite fit, here.

By the way, I didn't actually check that monstrous condition in the second paragraph.

@G. Jay Kerns I agree that the analogy to the Poisson is imperfect, but I think it gives good guidance. Imagine a sequence of p's, p_i = 10^{-j}, where j is the order of magnitude of i (equal to 1 for i <= 10, to 2 for i <= 100, etc.). When n = 10^k, 90% of the p's equal 10^{-k} and their sum looks Poisson with expectation 0.9. Another 9% equal 10^{1-k} and their sum looks Poisson (with the same expectation). Thus the distribution looks approximately like a sum of k Poisson variates. It's obviously nowhere near Normal. Whence the need for the "monstrous condition."
whuber

4

Well, based on your description and the discussion in the comments it is clear that Y has mean ipi and variance ipi(1pi). 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 the p'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 the p'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 your p'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.

set.seed(1)
M <- 5000
N <- 15000
p <- rbeta(N, shape1 = 1, shape2 = 10)
Y <- replicate(M, sum(rbinom(N, size = 1, prob = p)))

Now take a look at the results.

hist(Y)
mean(Y)
sum(p)
var(Y)
sum(p*(1 - p))

Have fun; I sure did.


Why do you say "the code isn't really appropriate if your ps are too small"? Seems to work ok to me, e.g. with shape1=1, shape2=999, giving a mean p of 0.001.
onestop

@onestop what I meant was the specific choice of (1,10) written above doesn't give values of p that are very small, to the point that the normal approximation looks pretty good. If a person wanted the Poisson to come out then they would need to try something else; it sounds like your choice of (1,999) does a good job, yes? I had also thought to make α<1, say, 0.25, but I haven't tried that.

2

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:

Xi|piBer(pi)

piBeta(α,β)

Using wikipedia we can get estimates of α^ and β^ (see parameter estimation section).

Now you can generate draws for the ith 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.

Prob[Yy]=#YyM

This analysis is valid only when pi are not fixed. This is not the case here. But I will leave it here, in case someone has a similar question.


1
To some purists this may not be Bayesian. This is actually empirical Bayesian, but it is a quick way to simulate your probabilities in R, without resorting to hyper prior mumbo jumbo.
suncoolsu

1
Why do you need priors when the p_i are given?
whuber

@whuber. Thanks, you are right. I missed the fixed part. I thought David is just using the value to be pi as (q-x)/c and is not fixed. I will edit my answer.
suncoolsu

@suncoolsu - note that a "beta-bernoulli" distribution is just another bernoulli distribution but replacing piαα+β. This is becase (1xi)B(α+xi,β+1xi)B(α,β)=αxiβ1xiα+β. So basically by mixing over pi you are applying the binomial approximation here p1=p2==pn.
probabilityislogic

2

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)=jn[(1pj)+pjeit] (i=1).

The algorithm is:

  1. Let zj(k)=1pj+pjcos(ωk)+ipjsin(ωk), for ω=2πn+1.
  2. Define xk=exp{jnlog(zj(k))}, define x0=1.
  3. Compute xk for k=1,,[n/2]. Use symmetry x¯k=xn+1k to get the rest.
  4. Apply FFT to the vector 1n+1<x0,x1,,xn>.
  5. Take the cumulative sum of result to get the CDF.

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.


3
I have access only to the abstract of that paper, but it sounds like it implements the method I used at stats.stackexchange.com/questions/41247/… and discusses how it performs compares to the other methods given in this thread. If you know more about what the paper has accomplished, we would be glad to read a summary.
whuber

1

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 between Y and a r.v. Z having Poisson distribution with the parameter ipi is small:

supA|P(YA)P(ZA)|min{1,1ipi}ipi2.
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(YA)1(1maxipi)2P(ZA).


1
+1 Thank you for the useful quantitative information about the approximation bounds. Welcome to our site!
whuber
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.