¿Cómo puedo modelar eficientemente la suma de variables aleatorias de Bernoulli?


38

Estoy modelando una variable aleatoria ( ) que es la suma de unas ~ 15-40k variables aleatorias de Bernoulli independientes ( ), cada una con una probabilidad de éxito diferente ( ). Formalmente, donde y \ Pr (X_i = 0) = 1-p_i .YXipiY=XiPr(Xi=1)=piPr(Xi=0)=1pi

Estoy interesado en responder rápidamente consultas como Pr(Y<=k) (donde se da k ).

Actualmente, uso simulaciones aleatorias para responder a esas consultas. Dibujo aleatoriamente cada Xi acuerdo con su pi , luego sumo todos los Xivalores de X_i para obtener Y . Repito este proceso unos miles de veces y devuelvo la fracción de veces Pr(Yk) .

Obviamente, esto no es totalmente exacto (aunque la precisión aumenta considerablemente a medida que aumenta el número de simulaciones). Además, parece que tengo suficientes datos sobre la distribución para evitar las simulaciones de uso. ¿Se te ocurre una forma razonable de obtener la probabilidad exacta Pr(Yk) ?

PD

Yo uso Perl y R.

EDITAR

Después de las respuestas, pensé que podrían ser necesarias algunas aclaraciones. En breve describiré la configuración de mi problema. Se da un genoma circular con circunferencia cy un conjunto de nrangos asignados a él. Por ejemplo, c=3*10^9y ranges={[100,200],[50,1000],[3*10^9-1,1000],...}. Tenga en cuenta que todos los rangos están cerrados (ambos extremos son inclusivos). También tenga en cuenta que solo tratamos con enteros (unidades enteras).

Estoy buscando regiones en el círculo que están cubiertas por los nrangos mapeados dados . Entonces, para probar si un rango de longitud dado xen el círculo está cubierto, pruebo la hipótesis de que los nrangos se asignan al azar. La probabilidad de que un rango de longitud mapeado q>xcubra completamente el rango de longitud dado xes (q-x)/c. Esta probabilidad se vuelve bastante pequeña cuando ces grande y / o qes pequeña. Lo que me interesa es la cantidad de rangos (fuera de n) que cubren x. Así es como Yse forma.

Pruebo mi hipótesis nula frente a una alternativa unilateral (subcobertura). También tenga en cuenta que estoy probando múltiples hipótesis (diferentes xlongitudes), y estoy seguro de corregir esto.


¿Su p_i está fijada durante el ejercicio de modelado o pueden cambiar de un cálculo a otro?
whuber

Los p_is son fijos.
David B

A la luz de las respuestas actuales, ¿podría compartir estimaciones de (a) la suma de las p y (b) la suma de sus cuadrados? Estos valores determinan sus opciones.
whuber

@whuber: estos varían mucho entre los casos. No es un módulo único que estoy creando (desafortunadamente).
David B

@David Pero, ¿no puedes dar alguna orientación, como los rangos típicos? Por ejemplo, si la suma de los p oscila entre 1 y 100, esa es información útil y sugiere algunas soluciones eficientes, pero si puede obtener hasta 10,000, eso podría excluir algunos enfoques.
whuber

Respuestas:


24

Si a menudo se parece a un Poisson , ¿ha intentado aproximarlo con un Poisson con el parámetro ?λ=pi

EDITAR : He encontrado un resultado teórico para justificar esto, así como un nombre para la distribución de : se llama distribución binomial de Poisson . La desigualdad de Le Cam te dice cuán estrechamente se aproxima su distribución por la distribución de un Poisson con parámetro . Te dice que la calidad de este aprox está gobernada por la suma de los cuadrados de los s, parafraseando a Steele (1994) . Entonces, si todos sus s son razonablemente pequeños, como ahora parece ser, debería ser una buena aproximación.λ = p i p i p iYλ=pipipi

EDIT 2 : ¿Qué tan pequeño es 'razonablemente pequeño'? Bueno, eso depende de lo bueno que necesites que sea la aproximación. El artículo de Wikipedia sobre el teorema de Le Cam da la forma precisa del resultado al que me referí anteriormente: la suma de las diferencias absolutas entre la función de masa de probabilidad (pmf) de y la pmf de la distribución de Poisson anterior no es más del doble de la suma de los cuadrados de los s. Otro resultado de Le Cam (1960) puede ser más fácil de usar: esta suma tampoco es más de 18 veces la más grande . Hay bastantes resultados más ... ver Serfling (1978) para una revisión.p i p iYpipi


1
+1 No es una mala idea. Es probable que una pequeña mezcla de Poissons haga un buen trabajo, dependiendo de cómo se aclare la pregunta.
whuber

1
Pensé en sugerir una distribución binomial negativa, que surge como una mezcla de Gamma-Poisson, pero que tiene una varianza mayor que su media, mientras que este problema tiene una varianza menor que su media. Basado en eso, no estoy seguro de si alguna mezcla de Poissons funcionará, ya que seguramente cualquier mezcla tendrá una varianza mayor que su media.
parada el

@onestop ¿Dónde se dijo que la varianza es menor que la media? Me perdí esa declaración.
whuber

Lo siento whuber, eso fue un poco críptico, pero estos comentarios no permiten tanta elaboración. de mpiktas es la varianza, que es inferior a la media, . Sin embargo, solo un poco menos si los son en promedio muy pequeños, por lo que el Poisson estándar podría ser lo suficientemente bueno aprox. Tal vez debería ampliar mi respuesta anterior ... pero luego el hilo de conversación se vuelve confuso. p i p iBn=pi(1pi)pipi
parada el

¿Qué quieres decir con ? ¿Cómo obtengo valores ? X iXiXi
David B

11

Encontré su pregunta mientras buscaba una solución a este mismo problema. No estaba terriblemente satisfecho con las respuestas aquí, pero creo que hay una solución bastante simple que le brinda la distribución exacta y es bastante manejable.

La distribución de la suma de dos variables aleatorias discretas es la convolución de sus densidades. Entonces, si tiene donde conoce y , puede calcular:P ( X ) P ( Y )Z=X+YP(X)P(Y)

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

(Por supuesto, para las variables aleatorias de Bernoulli no es necesario ir muy a infinito).

Puede usar esto para encontrar la distribución exacta de la suma de sus vehículos recreativos. Primero sume dos de los RV juntos haciendo girar sus PDF (por ejemplo, [0.3, 0.7] * [0.6, 0.4] = [0.18, 0.54, 0.28]). Luego convolucione esa nueva distribución con su próximo PDF de Bernoulli (por ejemplo, [0.18, 0.54, 0.28] * [0.5, 0.5] = [0.09, 0.36, 0.41, 0.14]). Siga repitiendo esto hasta que se hayan agregado todos los RV. Y listo, el vector resultante es el PDF exacto de la suma de todas sus variables.

Verifiqué con simulación que esto produce los resultados correctos. No se basa en suposiciones asintóticas y no requiere que los probadores de Bernoulli sean pequeños.

También puede haber alguna forma de hacer esto de manera más eficiente que la convolución repetida, pero no lo he pensado profundamente. ¡Espero que esto sea útil para alguien!


2
¿Has probado esto con 40K variables? (Me pregunto cuántas horas o días de cálculo lleva ...)
whuber

55
(+1) Encontré una manera de hacer que esta idea funcione. Requiere dos técnicas: primero, usar FFT para las convoluciones; segundo, no los hagas secuencialmente, sino divide y vencerás: hazlos en pares disjuntos, luego haz los resultados en pares disjuntos, etc. El algoritmo ahora se escala como lugar de para probabilidades Por ejemplo, Mathematica puede calcular la distribución completa para 40,000 probabilidades en solo 0.4 segundos. (1,000,000 se calculan en 10.5 segundos). Proporcionaré el código en un comentario de seguimiento. O ( n 2 ) nO(nlogn)O(n2)n
whuber

77
Aquí está el código de 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 &]]] para aplicarlo, haga algo como p = RandomReal[{0, 1}, 40000]; pp = multinomial[p];. Esto crea las probabilidades py luego calcula la distribución exacta pp. NB Cuando la media de pno es extrema, la distribución es muy cercana a la normal: eso lleva a un algoritmo mucho más rápido todavía.
whuber

9

@onestop proporciona buenas referencias. El artículo de Wikipedia sobre la distribución binomial de Poisson ofrece una fórmula recursiva para calcular la distribución de probabilidad exacta; requiere esfuerzo. Desafortunadamente, es una suma alterna, por lo que será numéricamente inestable: es imposible hacer este cálculo con aritmética de coma flotante. Afortunadamente, cuando es pequeño, solo necesita calcular un pequeño número de probabilidades, por lo que el esfuerzo es realmente proporcional a . La precisión necesaria para llevar a cabo el cálculo con la aritmética racional ( es decir, exactamente, para que la inestabilidad numérica no sea un problema) crece lo suficientemente lentamente como para que el tiempo general aún sea aproximadamentep i O ( n log ( i p i ) ) O ( n 2 )O(n2)piO(nlog(ipi))O(n2). Eso es factible.

Como prueba, creé una matriz de probabilidades para varios valores de hasta , que es el tamaño de este problema. Para valores pequeños de (hasta ), el tiempo para el cálculo exacto de las probabilidades fue en segundos y se ajustó en forma cuadrática, por lo que aventuré un cálculo para a tres SD por encima del media (probabilidades para 0, 1, ..., 22 éxitos). Tomó 80 minutos (con Mathematica 8), en línea con el tiempo previsto. (¡Las probabilidades resultantes son fracciones cuyos numeradores y denominadores tienen aproximadamente 75,000 dígitos cada uno!) Esto muestra que se puede hacer el cálculo.n n = 2 16 n n = 2 12 n = 2 16pi=1/(i+1)nn=216nn=212n=216

Una alternativa es ejecutar una simulación larga (debería hacer un millón de pruebas). Solo tiene que hacerse una vez, porque no cambia.pi


9

(Debido a que este enfoque es independiente de las otras soluciones publicadas, incluida una que he publicado, la estoy ofreciendo como respuesta por separado).

Puede calcular la distribución exacta en segundos (o menos) siempre que la suma de los p sea pequeña.

Ya hemos visto sugerencias de que la distribución podría ser aproximadamente gaussiana (en algunos escenarios) o Poisson (en otros escenarios). De cualquier manera, sabemos que su media es la suma de y su varianza es la suma de . Por lo tanto, la distribución se concentrará dentro de unas pocas desviaciones estándar de su media, digamos SD con entre 4 y 6 o más o menos. Por lo tanto, solo necesitamos calcular la probabilidad de que la suma igual (un número entero) para través de . Cuando la mayoría de losp i σ 2 p i ( 1 - p i ) z z X k k = μ - z σ k = μ + z σ p i σ 2 μ k [ μ - z μpiσ2pi(1pi)zzXkk=μzσk=μ+zσpison pequeños, es aproximadamente igual (pero ligeramente menor que) , por lo que para ser conservadores podemos hacer el cálculo de en el intervalo . Por ejemplo, cuando la suma de es igual a y elige para cubrir bien las colas, necesitaríamos el cálculo para cubrir en = , que son solo 28 valores.σ2μkpi9z=6k[9-6[μzμ,μ+zμ]pi9z=6k[0,27][969,9+69][0,27]

La distribución se calcula de forma recursiva . Sea la distribución de la suma de la primera de estas variables de Bernoulli. Para cualquier desde hasta , la suma de las primeras variables puede ser igual a de dos maneras mutuamente excluyentes: la suma de las primeras variables es igual a y el es o bien la suma de las primeras variables es igual a y el es . Por lo tanto i j 0 i + 1 i + 1 j i j i + 1 st 0 i j - 1 i + 1 st 1fiij0i+1i+1jiji+1st0ij1i+1st1

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

Solo necesitamos realizar este cálculo para la integral en el intervalo de amax ( 0 , μ - z j μ+zmax(0,μzμ) μ+zμ.

Cuando la mayoría de los son pequeños (pero el aún se distinguen de con una precisión razonable), este enfoque no está plagado de la gran acumulación de errores de redondeo de coma flotante utilizados en la solución que publiqué anteriormente. Por lo tanto, no se requiere computación de precisión extendida. Por ejemplo, un cálculo de doble precisión para una matriz de probabilidades ( , que requiere cálculos para las probabilidades de sumas entre y 1 - p i 1 2 16 p i = 1 / ( i + 1 ) μ = 10.6676 0 31 3 × 10 - 15 z = 6 3.6 × 10 - 8pi1pi1216pi=1/(i+1)μ=10.6676031) tardó 0.1 segundos con Mathematica 8 y 1-2 segundos con Excel 2002 (ambos obtuvieron las mismas respuestas). Repetirlo con precisión cuádruple (en Mathematica) tomó aproximadamente 2 segundos pero no cambió ninguna respuesta en más de . Terminar la distribución en SD en la cola superior perdió solo de la probabilidad total.3×1015z=63.6×108

Otro cálculo para una matriz de 40,000 valores aleatorios de doble precisión entre 0 y 0.001 ( ) tomó 0.08 segundos con Mathematica.μ=19.9093

Este algoritmo es paralelo. Simplemente divida el conjunto de en subconjuntos disjuntos de aproximadamente el mismo tamaño, uno por procesador. Calcule la distribución para cada subconjunto, luego involucre los resultados (usando FFT si lo desea, aunque esta aceleración probablemente sea innecesaria) para obtener la respuesta completa. Esto hace que sea práctico usarlo incluso cuando hace grande, cuando necesita mirar hacia adentro de las colas ( grande), y / o es grande. μ z npiμzn

El tiempo para una matriz de variables con procesadores se escala como . La velocidad de Mathematica es del orden de un millón por segundo. Por ejemplo, con procesador, variantes, una probabilidad total de y salir a desviaciones estándar en la cola superior, millones: calcula un par de segundos de tiempo de cálculo. Si compila esto, podría acelerar el rendimiento dos órdenes de magnitud.m O ( n ( μ + z nmm=1n=20000μ=100z=6n(μ+zO(n(μ+zμ)/m)m=1n=20000μ=100z=6n(μ+zμ)/m=3.2

Por cierto, en estos casos de prueba, los gráficos de la distribución mostraron claramente cierta asimetría positiva: no son normales.

Para el registro, aquí hay una solución de 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]
  ]

( Nota : la codificación de colores aplicada por este sitio no tiene sentido para el código de Mathematica. En particular, lo gris no son comentarios: ¡es donde se hace todo el trabajo!)

Un ejemplo de su uso es

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

Editar

Una Rsolución es diez veces más lenta que Mathematica en este caso de prueba, tal vez no la he codificado de manera óptima, pero aún se ejecuta rápidamente (aproximadamente un segundo):

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)

Parcela de PDF


8

Con diferente tu mejor apuesta creo que es la aproximación normal. Deje . LuegoB n = n i = 1 p i ( 1 - p i )piBn=i=1npi(1pi)

nvarepsilon>0

Bn1/2(i=1nXii=1npi)N(0,1),
como , siempre que para cadanε>0

nBn

Bn1i=1nE((Xipi)21{|Xipi|>εBn1/2})0,
como , que para las variables de Bernoulli se mantendrá si . Esta es la llamada condición de Lindeberg, que es suficiente y necesaria para la convergencia a la normalidad estándar.nBn

Actualización: El error de aproximación se puede calcular a partir de la siguiente desigualdad:

L n = B - 3 / 2 n n Σ i = 1 E | X i - p i | 3 FnXi

supx|Fn(x)Φ(x)|ALn,
donde y es el cdf de la suma escalada y centrada de .
Ln=Bn3/2i=1nE|Xipi|3
FnXi

Como señaló Whuber, la convergencia puede ser lenta para mal comportamiento . Para tenemos y . Luego, tomando , obtenemos que la desviación máxima del cdf normal estándar es un enorme 0.3.p i = 1pipi=11+iBnlnnLn(lnn)1/2n=216


3
Esto no es cierto cuando p_i se acerca a cero a medida que aumenta i. De lo contrario, ¡acaba de demostrar que la distribución de Poisson es Normal!
whuber

1
Por eso debe ser . Si aproxima a cero a una velocidad mayor que , . Bnpi1/ilimBn<
mpiktas

@mpiktas tiene razón. La analogía con la distribución de Poisson no encaja, aquí.

Por cierto, en realidad no verifiqué esa monstruosa condición en el segundo párrafo.

@SOL. Jay Kerns Estoy de acuerdo en que la analogía con el Poisson es imperfecta, pero creo que da una buena orientación. Imagine una secuencia de p, p_i = 10 ^ {- j}, donde j es el orden de magnitud de i (igual a 1 para i <= 10, a 2 para i <= 100, etc.). Cuando n = 10 ^ k, el 90% de las p es igual a 10 ^ {- k} y su suma se ve a Poisson con la expectativa 0.9. Otro 9% equivale a 10 ^ {1-k} y su suma parece Poisson (con la misma expectativa). Por lo tanto, la distribución se ve aproximadamente como una suma de k Variaciones de Poisson. Obviamente no está cerca de Normal. De ahí la necesidad de la "condición monstruosa".
whuber

4

Bueno, según su descripción y la discusión en los comentarios, está claro que tiene una media y una varianza . La forma de la distribución de dependerá en última instancia del comportamiento de . Para adecuadamente "agradable" (en el sentido de que no muchos de ellos están realmente cerca de cero), la distribución de será aproximadamente normal (centrada a la derecha en ). Pero a medida que comienza a dirigirse hacia cero, la distribución se desplazará hacia la izquierda y cuando se apiñe contra lai p i i p i ( 1 - p i ) Y p i p i Y p i i p i yYipiipi(1pi)YpipiYpiipiy-eje comenzará a verse mucho menos normal y mucho más Poisson, como han mencionado @whuber y @onestop.

Por su comentario "la distribución se ve Poisson" sospecho que este último caso es lo que está sucediendo, pero realmente no puedo estar seguro sin algún tipo de visualización o resumen de estadísticas sobre los 's. Sin embargo, tenga en cuenta, como lo hizo @whuber, que con un comportamiento suficientemente patológico de las 's, puede tener todo tipo de cosas espeluznantes, como límites que son distribuciones de mezclas. Dudo que ese sea el caso aquí, pero de nuevo, realmente depende de lo que estén haciendo sus .p pppp

En cuanto a la pregunta original de "cómo modelar eficientemente", iba a sugerir un modelo jerárquico para usted, pero no es realmente apropiado si las son constantes fijas. En resumen, eche un vistazo a un histograma de las y haga una primera suposición basada en lo que ve. Recomendaría la respuesta por @mpiktas (y por extensión @csgillespie) si sus no están demasiado llenas a la izquierda, y recomendaría la respuesta por @onestop si están llenas a la izquierda.p pppp

Por cierto, aquí está el código R que utilicé mientras jugaba con este problema: el código no es realmente apropiado si sus son demasiado pequeños, pero debería ser fácil conectar diferentes modelos para (incluyendo spooky- los locos) para ver lo que ocurre con la distribución final de .p YppY

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

Ahora eche un vistazo a los resultados.

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

Que te diviertas; Ciertamento lo hice.


¿Por qué dice "el código no es realmente apropiado si sus son demasiado pequeños"? Parece funcionar bien para mí, por ejemplo, con shape1 = 1, shape2 = 999, dando una media de 0.001. ppp
parada el

@onestop lo que quise decir fue que la elección específica de (1,10) escrita arriba no da valores de que sean muy pequeños, hasta el punto de que la aproximación normal se ve bastante bien. Si una persona quisiera que saliera el Poisson, tendría que intentar otra cosa; parece que su elección de (1,999) hace un buen trabajo, ¿sí? También había pensado hacer , digamos, 0.25, pero no lo he intentado. α < 1pα<1

2

Creo que otras respuestas son geniales, pero no vi ninguna forma bayesiana de estimar su probabilidad. La respuesta no tiene una forma explícita, pero la probabilidad se puede simular usando R.

Aquí está el intento:

Xi|piBer(pi)

piBeta(α,β)

El uso de Wikipedia podemos obtener estimaciones de α y β (véase la sección de estimación de parámetros).α^β^

Ahora se puede generar llama para el paso, generar p i de B e t un ( α , β ) y luego generar X i de B e r ( p i ) . Después de haber hecho esto N veces, puede obtener Y = X i . Este es un ciclo único para la generación de Y, haga este número M (grande) de veces y el histograma para MithpiBeta(α^,β^)XiBer(pi)NY=XiMM Ys será la estimación de la densidad de Y.

Prob[Yy]=#YyM

Este análisis es válido solo cuando no es fijo. piEste no es el caso aquí. Pero lo dejaré aquí, en caso de que alguien tenga una pregunta similar.


1
Para algunos puristas esto puede no ser bayesiano. Esto es en realidad empírico bayesiano, pero es una forma rápida de simular sus probabilidades en R, sin recurrir a un hipermudente anterior.
suncoolsu

1
¿Por qué necesitas priors cuando se dan los p_i?
whuber

@whuber. Gracias tienes razon. Perdí la parte fija. Pensé que David solo está usando el valor para ser como (qx) / c y no es fijo. Editaré mi respuesta. pi
suncoolsu

@suncoolsu - tenga en cuenta que una distribución "beta-bernoulli" es solo otra distribución de bernoulli pero reemplaza . Esto es porque ( 1piαα+β . Básicamente, al mezclar sobrepiestás aplicando la aproximación binomial aquíp1=p2==pn. (1xi)B(α+xi,β+1xi)B(α,β)=αxiβ1xiα+βpip1=p2==pn
probabilidadislogica

2

Como se ha mencionado en otras respuestas, la distribución de probabilidad que describe es la distribución binomial de Poisson. Un método eficiente para calcular el CDF se da en Hong, Yili. Al calcular la función de distribución para la distribución binomial de Poisson .

El enfoque consiste en calcular eficientemente la DFT (transformada discreta de Fourier) de la función característica.

ϕ(t)=jn[(1pj)+pjeit]i=1

El algoritmo es:

  1. zj(k)=1pj+pjcos(ωk)+ipjsin(ωk)ω=2πn+1
  2. xk=exp{jnlog(zj(k))}x0=1
  3. xkk=1,,[n/2]x¯k=xn+1k
  4. 1n+1<x0,x1,,xn>
  5. Tome la suma acumulativa del resultado para obtener el CDF.

El algoritmo está disponible en el paquete poibin R.

Este enfoque ofrece resultados mucho mejores que las formulaciones recursivas, ya que tienden a carecer de estabilidad numérica.


3
Solo tengo acceso al resumen de ese documento, pero parece que implementa el método que utilicé en stats.stackexchange.com/questions/41247/… y analiza cómo funciona en comparación con los otros métodos dados en este hilo. Si sabe más sobre lo que ha logrado el periódico, nos complacería leer un resumen.
whuber

1

YZipi

supA|P(YA)P(ZA)|min{1,1ipi}ipi2.

|Ef(Y)Ef(Z)|fA

P(YA)1(1maxipi)2P(ZA).


1
+1 Gracias por la útil información cuantitativa sobre los límites de aproximación. ¡Bienvenido a nuestro sitio!
whuber
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.