Cálculo de probabilidad cuando es muy grande, ¿entonces la probabilidad se vuelve muy pequeña?

8

Estoy tratando de calcular esta distribución posterior:

(θ|)=i=1npiyi(1pi)1yiallθ,pi|θi=1npiyi(1pi)1yi

El problema es que el numerador, que es el producto de un montón de probabilidades es demasiado pequeño. (Mi es grande, alrededor de 1500).Bernoulli(pi,yi)n

Por lo tanto, los valores posteriores para all se calculan como 0 (estoy haciendo cálculos en R).θ

Para aclarar, cada tiene su propia , juntas estas forman un vector de elementos para 's. Cada tiene su propio vector elemento de .yipipinn yθnpi

EDITAR: Agregar un ejemplo de reproducción (para el numerador)

p <- sample(seq(0,1,by=0.01), 1500, replace=T)
y <- sample(c(0,1), 1500, replace=T)
dbern(y, p) # 1500-element vector, each element is < 1
prod(dbern(y, p)) # produce 0
exp(sum(log(dbern(y, p)))) # produce 0 since the sum is very negative
Heisenberg
fuente
¿Intentaste calcular la suma de los registros?
Ansari
1
Hay una discusión relacionada aquí . Tiene una discusión adicional de algunos de los detalles de tales cálculos.
Glen_b: reinstala a Monica

Respuestas:

7

Este es un problema común con el cálculo de probabilidades para todo tipo de modelos; Los tipos de cosas que se hacen comúnmente son trabajar en registros y usar un factor de escala común que lleve los valores a un rango más razonable.

En este caso, sugeriría:

Paso 1: Elija un , bastante "típico" . Divida la fórmula para el numerador y el denominador del término general por el numerador para , para obtener algo que sea mucho menos probable que se desborde.θθ0θ=θ0

Paso 2: trabajar en la escala de registro, esto significa que el numerador es una exp de sumas de diferencias de registros, y el denominador es una suma de exp de sumas de diferencias de registros.

NB: Si alguno de sus p es 0 o 1, retírelos por separado y no tome registros de esos términos; ¡son fáciles de evaluar tal como están!

[En términos más generales, se puede ver que esta escala y trabajar en la escala de registro toma un conjunto de probabilidades de registro, y hace esto: . Una opción obvia para es hacer que el término más grande sea 0, lo que nos deja con: . Tenga en cuenta que cuando tiene un numerador y un denominador, puede usar la misma para ambos, que luego se cancelará. En lo anterior, eso corresponde a tomar con la mayor probabilidad de registro.]lilog(ieli)=c+log(ielic)clog(ieli)=maxi(li)+log(ielimaxi(li))cθ0

Los términos habituales en el numerador tenderán a ser de tamaño más moderado, por lo que en muchas situaciones el numerador y el denominador son relativamente razonables.

Si hay un rango de tamaños en el denominador, sume los más pequeños antes de agregar los más grandes.

Si solo unos pocos términos dominan en gran medida, debe centrar su atención en hacer el cálculo para aquellos relativamente precisos.

Glen_b -Reinstate a Monica
fuente
Pero para todos los theta, el numerador siempre va a 0. ¿Cómo divido el término general por el numerador? (Paso 1)
Heisenberg
1
El paso 1 es el álgebra, no el cálculo por computadora. Su propósito es darle algo en el Paso 2 para calcular que no se desborde. A menos que esté diciendo que siempre es algebraicamente cero ... en cuyo caso indudablemente está haciendo algo que no debería.
Glen_b -Reinstale a Monica el
Está bien, lo intentaré. El numerador no es exactamente 0, solo muy pequeño que R no puede calcular. ¡Gracias!
Heisenberg
3
Querido Dios, tienes razón! Muchísimas gracias. Todos siguen diciendo "use log.likelihood", pero solo usted realmente ve el problema.
Heisenberg
1

Intente capitalizar las propiedades de usar los logaritmos y la suma en lugar de tomar el producto de números decimales. Después de la suma simplemente use el anti-log para volver a ponerlo en su forma más natural. Creo que algo como esto debería hacer el truco

exp(in(yilog(pi)+(1yi)log(1pi)))gexp(inyilog(pi)+(1yi)log(1pi))

philchalmers
fuente
El numerador en su sugerencia todavía produce un 0 ya que la suma dentro de exp () sigue siendo muy negativa (<-1000). ¿Estoy haciendo algo mal? ¡Gracias por tu ayuda!
Heisenberg
Bueno, si cualquier valor en p es en realidad 0 o 1, entonces automáticamente el registro producirá -inf y también lo hará (1-p). De lo contrario, creo que los números se vuelven demasiado pequeños para volver a subir a la forma original.
philchalmers
2
Tenga en cuenta que puede sumar y restar cualquier constante de los términos dentro de la expresión anterior sin cambiar el resultado. ajuste igual al negativo del valor máximo de proporciona la mejor precisión numéricacexp()clog(p(θ|))
probabilityislogic