Come posso modellare in modo efficiente la somma delle variabili casuali di Bernoulli?


38

YXipiY=XiPr(Xi=1)=piPr(Xi=0)=1pi

Sono interessato a rispondere rapidamente a domande come (dove viene fornito ).Pr(Y<=k)k

Attualmente utilizzo simulazioni casuali per rispondere a tali domande. Traccio casualmente ogni X_i inXi base alla sua pi , quindi somma tutti i valori Xi per ottenere Y . Ripeto questo processo alcune migliaia di volte e restituisco la frazione di volte Pr(Yk) .

Ovviamente, questo non è del tutto accurato (sebbene l'accuratezza aumenti notevolmente all'aumentare del numero di simulazioni). Inoltre, sembra che io abbia abbastanza dati sulla distribuzione per evitare le simulazioni d'uso. Riesci a pensare a un modo ragionevole per ottenere la probabilità esatta Pr(Yk) ?

ps

Io uso Perl & R.

MODIFICARE

A seguito delle risposte ho pensato che potrebbero essere necessari alcuni chiarimenti. Descriverò brevemente l'impostazione del mio problema. Dato è un genoma circolare con circonferenza ce un insieme di nintervalli mappati ad esso. Ad esempio, c=3*10^9e ranges={[100,200],[50,1000],[3*10^9-1,1000],...}. Nota: tutti gli intervalli sono chiusi (entrambe le estremità sono incluse). Si noti inoltre che trattiamo solo numeri interi (unità intere).

Sto cercando regioni sul cerchio che sono coperte da determinati nintervalli mappati. Quindi, per verificare se un dato intervallo di lunghezza xsul cerchio è sotto copertura, collaudo l'ipotesi che gli nintervalli siano mappati casualmente. La probabilità di un intervallo mappato di lunghezza q>xsi riempie completamente la gamma determinata di lunghezza xè (q-x)/c. Questa probabilità diventa piuttosto piccola quando cè grande e / o qè piccola. Quello che mi interessa è il numero di intervalli (fuori n) che coprono x. Ecco come Ysi forma.

Metto alla prova la mia ipotesi nulla contro un'alternativa unilaterale (copertura insufficiente). Nota anche che sto testando ipotesi multiple ( xlunghezze diverse ), e sicuramente correggerò per questo.


Il tuo p_i è stato risolto durante l'esercizio di modellazione o può passare da un calcolo all'altro?
whuber

Gli p_is sono fissi.
David B,

Alla luce delle risposte attuali, potresti condividere le stime di (a) la somma delle p e (b) la somma dei loro quadrati? Questi valori determinano le tue opzioni.
whuber

@whuber: questi variano notevolmente tra i casi. Non sto creando un modulo una tantum (purtroppo).
David B,

@ David Ma non puoi dare qualche consiglio, come ad esempio i range tipici? Ad esempio, se la somma della p varia tra 1 e 100, questa è un'informazione utile e suggerisce alcune soluzioni efficienti, ma se può arrivare a 10.000 potrebbe escludere alcuni approcci.
whuber

Risposte:


24

Se assomiglia spesso a un Poisson , hai provato ad approssimarlo con un Poisson con il parametro λ=pi ?

EDIT : ho trovato un risultato teorico per giustificare questo, oltre a un nome per la distribuzione di : si chiama distribuzione binomiale di Poisson . La disuguaglianza di Le Cam ti dice quanto la sua distribuzione sia approssimata dalla distribuzione di un Poisson con il parametro λ = p i . Vi dice la qualità di questo circa è disciplinato dalla somma dei quadrati della p i s, parafrasando Steele (1994) . Quindi se tutto il tuo p iYλ=pipipi s sono abbastanza piccole, come ora sembra che siano, dovrebbe essere una buona approssimazione.

EDIT 2 : Quanto è piccolo 'ragionevolmente piccolo'? Bene, dipende da quanto è necessario l'approssimazione! L' articolo di Wikipedia sul teorema di Le Cam fornisce la forma precisa del risultato a cui ho fatto riferimento sopra: la somma delle differenze assolute tra la funzione di massa di probabilità (pmf) di e il pmf della distribuzione di Poisson sopra non è più del doppio della somma delle piazze del p i s. Un altro risultato di Le Cam (1960) potrebbe essere più facile da usare: questa somma non è nemmeno più di 18 volte la più grande p i . Ci sono alcuni altri risultati simili ... vedi Serfling (1978) per una recensione.Ypipi


1
+1 Non è una cattiva idea. È probabile che una piccola miscela di Poissons farebbe un buon lavoro, a seconda di come viene chiarita la domanda.
whuber

1
Ho pensato di suggerire una distribuzione binomiale negativa, che si presenta come una miscela Gamma-Poisson, ma che ha una varianza più grande della sua media, mentre questo problema ha una varianza più piccola della sua media. Sulla base di ciò, non sono sicuro che qualsiasi miscela di Poisson funzionerà, poiché sicuramente tale miscela avrà una varianza maggiore della sua media ??
onestop il

@onestop Dove è stato detto che la varianza è inferiore alla media? Ho perso questa affermazione.
whuber

Mi dispiace whuber, era un po 'enigmatico, ma questi commenti non consentono molta elaborazione. mpiktas è la varianza, che è inferiore alla media, p i . Solo un po 'meno se il p i s' sono in media molto piccola, così standard di Poisson potrebbe essere una buona abbastanza circa. Forse dovrei espandere la mia risposta sopra .. ma poi il filo della conversazione diventa confuso. Bn=pi(1pi)pipi
Onestop,

Cosa intendi con ? Come ottengo i valori X i ? XiXi
David B,

11

Ho trovato la tua domanda mentre cercavo una soluzione a questo problema. Non ero terribilmente soddisfatto delle risposte qui, ma penso che ci sia una soluzione abbastanza semplice che ti dia la distribuzione esatta ed è piuttosto trattabile.

La distribuzione della somma di due variabili casuali discrete è la convoluzione delle loro densità. Quindi se hai dove conosci P ( X ) e P ( Y ) , puoi calcolare:Z=X+YP(X)P(Y)

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

(Naturalmente per le variabili casuali di Bernoulli non è necessario andare abbastanza all'infinito.)

Puoi usarlo per trovare l'esatta distribuzione della somma dei tuoi camper. Prima somma due dei camper insieme contorcendo i loro PDF (ad esempio [0,3, 0,7] * [0,6, 0,4] = [0,18, 0,54, 0,28]). Quindi coinvolgi quella nuova distribuzione con il tuo prossimo Bernoulli PDF (ad es. [0.18, 0.54, 0.28] * [0.5, 0.5] = [0.09, 0.36, 0.41, 0.14]). Continua a ripetere questo fino a quando non sono stati aggiunti tutti i camper. E voilà, il vettore risultante è il PDF esatto della somma di tutte le variabili.

Ho verificato con la simulazione che questo produce i risultati corretti. Non si basa su ipotesi asintotiche e non richiede che i probi di Bernoulli siano piccoli.

Potrebbe anche esserci un modo per farlo in modo più efficiente della ripetuta convoluzione, ma non ci ho pensato molto a fondo. Spero che questo sia utile a qualcuno!


2
Hai provato questo con variabili 40K ?? (Mi chiedo quante ore o giorni di calcolo ci vogliono ...)
whuber

5
(+1) Ho trovato un modo per far funzionare questa idea. Richiede due tecniche: in primo luogo, utilizzare FFT per le convoluzioni; secondo, non eseguirli in modo sequenziale, ma dividerli e conquistarli: eseguili in coppie disgiunte, quindi esegui i risultati in coppie disgiunte, ecc. L'algoritmo ora scala come anziché O ( n 2 ) per n probabilità. Ad esempio, Mathematica può calcolare l' intera distribuzione per 40.000 probabilità in soli 0,4 secondi. (1.000.000 sono calcolati in 10,5 secondi.) Fornirò il codice in un commento di follow-up. O(nlogn)O(n2)n
whuber

7
Ecco il codice 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 &]]] per applicarlo, fai qualcosa di simile p = RandomReal[{0, 1}, 40000]; pp = multinomial[p];. Questo crea le probabilità pe quindi calcola l'esatta distribuzione pp. NB Quando la media di pnon è estrema, la distribuzione è molto vicina alla normale: questo porta a un algoritmo molto più veloce ancora.
whuber

9

@onestop fornisce buoni riferimenti. L'articolo di Wikipedia sulla distribuzione binomiale di Poisson fornisce una formula ricorsiva per calcolare l'esatta distribuzione di probabilità; richiede uno sforzo . Sfortunatamente, è una somma alternata, quindi sarà numericamente instabile: non ha speranza di fare questo calcolo con l'aritmetica in virgola mobile. Fortunatamente, quando i p i sono piccoli, devi solo calcolare un piccolo numero di probabilità, quindi lo sforzo è davvero proporzionale a O ( n log ( i p i ) )O(n2)piO(nlog(ipi)) . La precisione necessaria per eseguire il calcolo con aritmetica razionale (cioè, esattamente, in modo che l'instabilità numerica non sia un problema) cresce abbastanza lentamente che il tempo complessivo può essere ancora approssimativamente . È fattibile.O(n2)

Come test, ho creato un array di probabilità per vari valori da n fino a n = 2 16 , che è la dimensione di questo problema. Per piccoli valori di n (fino a n = 2 12 ) il tempo per il calcolo esatto delle probabilità era in secondi e ridimensionato in modo quadratico, quindi ho azzardato un calcolo per n = 2 16pi=1/(i+1)nn=216nn=212n=216fino a tre SD sopra la media (probabilità per 0, 1, ..., 22 successi). Ci sono voluti 80 minuti (con Mathematica 8), in linea con il tempo previsto. (Le probabilità risultanti sono frazioni i cui numeratori e denominatori hanno circa 75.000 cifre ciascuno!) Questo dimostra che il calcolo può essere fatto.

Un'alternativa è eseguire una lunga simulazione (un milione di prove dovrebbero fare). Si deve solo essere fatto una volta, perché il non cambiano.pi


9

(Poiché questo approccio è indipendente dalle altre soluzioni pubblicate, inclusa una che ho pubblicato, lo offro come risposta separata).

Puoi calcolare l'esatta distribuzione in secondi (o meno) purché la somma delle p sia piccola.

Abbiamo già visto dei suggerimenti secondo cui la distribuzione potrebbe essere approssimativamente gaussiana (in alcuni scenari) o Poisson (in altri scenari). Ad ogni modo, sappiamo che la sua media è la somma di p i e la sua varianza σ 2 è la somma di p i ( 1 - p i ) . Pertanto, la distribuzione sarà concentrata all'interno di alcune deviazioni standard della sua media, ad esempio z SD con z tra 4 e 6 o giù di lì. Pertanto, dobbiamo solo calcolare la probabilità che la somma X sia uguale (un numero intero) k per k = μμpiσ2pi(1pi)zzXk a k = μ + z σ . Quando la maggior parte di p i è piccola, σ 2 è approssimativamente uguale a (ma leggermente inferiore a) μ , quindi per essere conservativi possiamo fare il calcolo per k nell'intervallo [ μ - z k=μzσk=μ+zσpiσ2μk. Ad esempio, quando la somma delpiè uguale a9e scegliendoz=6per coprire bene le code, sarebbe necessario il calcolo di coperturakin[9-6[μzμ,μ+zμ]pi9z=6k=[0,27], che è solo 28 valori.[969,9+69][0,27]

La distribuzione viene calcolata in modo ricorsivo . Permettetemi di essere la distribuzione della somma della prima I di queste variabili di Bernoulli. Per qualsiasi j compreso tra 0 e i + 1 , la somma delle prime variabili i + 1 può eguagliare j in due modi reciprocamente esclusivi: la somma delle prime i variabili è uguale a j e i + 1 st è 0 oppure la somma di la prima variabile i è uguale a j - 1 e lafiij0i+1i+1jiji+1st0ij1 è 1 . Perciòi+1st1

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

Dobbiamo solo eseguire questo calcolo per integrale nell'intervallo da max ( 0 , μ - z j aμ+zmax(0,μzμ) μ+zμ.

Quando la maggior parte della sono minuscole (ma il 1 - p io sono ancora distinguibili dal 1 con ragionevole precisione), questo approccio non è afflitto con l'enorme accumulo di virgola mobile arrotondamento errori utilizzati nella soluzione ho già postato. Pertanto, non è richiesto il calcolo con precisione estesa. Ad esempio, un calcolo a doppia precisione per un array di 2 16 probabilità p i = 1 / ( i + 1 ) ( μ = 10.6676 , che richiede calcoli per probabilità di somme comprese tra 0pi1pi1216pi=1/(i+1)μ=10.66760e ) ha impiegato 0,1 secondi con Mathematica 8 e 1-2 secondi con Excel 2002 (entrambi hanno ottenuto le stesse risposte). Ripetendo con precisione quadrupla (in Mathematica) sono voluti circa 2 secondi, ma non ha cambiato alcuna risposta da più di 3 × 10 - 15 . Terminare la distribuzione a z = 6 SD nella coda superiore ha perso solo 3,6 × 10 - 8 della probabilità totale.313×1015z=63.6×108

Un altro calcolo per un array di 40.000 valori casuali a doppia precisione tra 0 e 0,001 ( ) ha richiesto 0,08 secondi con Mathematica.μ=19.9093

Questo algoritmo è parallelizzabile. Basta rompere l'insieme di in sottoinsiemi disgiunti di approssimativamente uguale dimensione, uno per processore. Calcola la distribuzione per ciascun sottoinsieme, quindi contorta i risultati (usando FFT se vuoi, anche se questa velocità probabilmente non è necessaria) per ottenere la risposta completa. Questo rende pratico l'uso anche quando μ diventa grande, quando è necessario guardare lontano nelle code ( z grande) e / o n è grande.piμzn

I tempi per una matrice di variabili con processori m vengono ridimensionati come O ( n ( μ + z nm. La velocità di Mathematica è dell'ordine di un milione al secondo. Ad esempio, conm=1processore,n=20000variate, una probabilità totale diμ=100e andando az=6deviazioni standard nella coda superiore,n(μ+zO(n(μ+zμ)/m)m=1n=20000μ=100z=6milioni: calcola un paio di secondi di tempo di calcolo. Se lo compili, potresti accelerare le prestazioni di due ordini di grandezza.n(μ+zμ)/m=3.2

Per inciso, in questi casi di test, i grafici della distribuzione mostravano chiaramente un'asimmetria positiva: non sono normali.

Per la cronaca, ecco una soluzione Mathematica:

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 La codifica a colori applicata da questo sito non ha senso per il codice Mathematica. In particolare, la roba grigia non è commenti: è dove tutto il lavoro è fatto!)

Un esempio del suo utilizzo è

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

modificare

Una Rsoluzione è dieci volte più lenta di Mathematica in questo caso di test - forse non l'ho codificata in modo ottimale - ma viene comunque eseguita rapidamente (circa un secondo):

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

Con diverse la soluzione migliore credo sia approssimazione normale. Sia B n = n i = 1 p i ( 1 - p i ) . PoipiBn=i=1npi(1pi)

comen, a condizione che per ogniε>0

Bn1/2(i=1nXii=1npi)N(0,1),
nε>0

comen, che per le variabili di Bernoulli si tenere premuto seBn

Bn1i=1nE((Xipi)21{|Xipi|>εBn1/2})0,
nBn. Questa è la cosiddetta condizione di Lindeberg, che è sufficiente e necessaria per la convergenza allo standard normale.

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.