Análisis bayesiano con histograma previo. ¿Por qué dibujar simulaciones desde la parte posterior?

8

Esta es una pregunta para principiantes sobre un ejercicio en "Computación bayesiana con R" de Jim Albert. Tenga en cuenta que si bien esto podría ser tarea, en mi caso no lo es, ya que estoy aprendiendo métodos bayesianos en R porque creo que podría usarlo en mis futuros análisis.

De todos modos, si bien esta es una pregunta específica, probablemente implique una comprensión básica de los métodos bayesianos.

Entonces, en el ejercicio 2.2, Jim Albert nos pide que analicemos el experimento de un lanzamiento de centavo. Mira aquí. Debemos usar un histograma antes, es decir, dividir el espacio de pvalores posibles en 10 intervalos de longitud .1y asignarles una probabilidad previa.

Como sé que la verdadera probabilidad será .5, y creo que es muy poco probable que el universo haya cambiado las leyes de probabilidad o que el centavo sea robusto, mis antecedentes son:

prior <- c(1,5,20,100,5000,5000,100,20,5,1)
prior <- prior/sum(prior)

a lo largo de los puntos medios del intervalo

midpt <- seq(0.05, 0.95, by=0.1)

Hasta aquí todo bien. Luego, giramos el centavo 20 veces y registramos el número de éxitos (cara) y fracasos (cola). Fácilmente hecho:

y <- rbinom(n=20,p=.5,size=1)
s <- sum(y==1)
f <- sum(y==0)

En mi gasto, s == 7y f == 13. Luego viene la parte que no entiendo:

Simule a partir de la distribución posterior al (1) calcular la densidad posterior de p en una cuadrícula de valores en (0,1) y (2) tomando una muestra simulada con reemplazo de la cuadrícula. (La función histpriory sampleson útiles en este cálculo). ¿Cómo han cambiado las probabilidades de intervalo en función de sus datos?

Así es como se hace:

p <- seq(0,1, length=500)
post <- histprior(p,midpt,prior) * dbeta(p,s+1,f+1)
post <- post/sum(post)

ps <- sample(p, replace=TRUE, prob = post)

¿ Pero por qué hacemos eso ?

Podemos obtener fácilmente la densidad posterior multiplicando la anterior con la probabilidad apropiada, como se hace en la línea dos del bloque anterior. Esta es una gráfica de la distribución posterior: Parcela de distribución posterior

A medida que se ordena la distribución posterior, podemos obtener resultados para los intervalos introducidos en el histograma antes resumiendo los elementos de la densidad posterior:

post.vector <- vector()
post.vector[1] <- sum(post[p < 0.1])
post.vector[2] <- sum(post[p > 0.1 & p <= 0.2])
post.vector[3] <- sum(post[p > 0.2 & p <= 0.3])
post.vector[4] <- sum(post[p > 0.3 & p <= 0.4])
post.vector[5] <- sum(post[p > 0.4 & p <= 0.5])
post.vector[6] <- sum(post[p > 0.5 & p <= 0.6])
post.vector[7] <- sum(post[p > 0.6 & p <= 0.7])
post.vector[8] <- sum(post[p > 0.7 & p <= 0.8])
post.vector[9] <- sum(post[p > 0.8 & p <= 0.9])
post.vector[10] <- sum(post[p > 0.9 & p <= 1])

(Los expertos en R podrían encontrar una mejor manera de crear ese vector. ¿Supongo que podría tener algo que ver sweep?)

round(cbind(midpt,prior,post.vector),3)

      midpt prior post.vector
 [1,]  0.05 0.000       0.000
 [2,]  0.15 0.000       0.000
 [3,]  0.25 0.002       0.003
 [4,]  0.35 0.010       0.022
 [5,]  0.45 0.488       0.737
 [6,]  0.55 0.488       0.238
 [7,]  0.65 0.010       0.001
 [8,]  0.75 0.002       0.000
 [9,]  0.85 0.000       0.000
[10,]  0.95 0.000       0.000

Además, tenemos 500 sorteos de la distribución posterior que no nos dicen nada diferente. Aquí hay una gráfica de la densidad de los dibujos simulados:

ingrese la descripción de la imagen aquí

Ahora usamos los datos simulados para obtener probabilidades para nuestros intervalos contando qué proporción de simulaciones están dentro del intervalo:

sim.vector <- vector()
sim.vector[1] <- length(ps[ps < 0.1])/length(ps)
sim.vector[2] <- length(ps[ps > 0.1 & ps <= 0.2])/length(ps)
sim.vector[3] <- length(ps[ps > 0.2 & ps <= 0.3])/length(ps)
sim.vector[4] <- length(ps[ps > 0.3 & ps <= 0.4])/length(ps)
sim.vector[5] <- length(ps[ps > 0.4 & ps <= 0.5])/length(ps)
sim.vector[6] <- length(ps[ps > 0.5 & ps <= 0.6])/length(ps)
sim.vector[7] <- length(ps[ps > 0.6 & ps <= 0.7])/length(ps)
sim.vector[8] <- length(ps[ps > 0.7 & ps <= 0.8])/length(ps)
sim.vector[9] <- length(ps[ps > 0.8 & ps <= 0.9])/length(ps)
sim.vector[10] <- length(ps[ps > 0.9 & ps <= 1])/length(ps)

(Nuevamente: ¿hay una manera más eficiente de hacer esto?)

Resumir resultados:

round(cbind(midpt,prior,post.vector,sim.vector),3)

      midpt prior post.vector sim.vector
 [1,]  0.05 0.000       0.000      0.000
 [2,]  0.15 0.000       0.000      0.000
 [3,]  0.25 0.002       0.003      0.000
 [4,]  0.35 0.010       0.022      0.026
 [5,]  0.45 0.488       0.737      0.738
 [6,]  0.55 0.488       0.238      0.236
 [7,]  0.65 0.010       0.001      0.000
 [8,]  0.75 0.002       0.000      0.000
 [9,]  0.85 0.000       0.000      0.000
[10,]  0.95 0.000       0.000      0.000

No sorprende que la simulación no produzca otros resultados que el posterior, en el que se basó. Entonces, ¿por qué dibujamos esas simulaciones en primer lugar ?

mzuba
fuente
No estoy totalmente seguro, ya que también soy un novato de Bayes. Pero supongo que las simulaciones de densidades posteriores se introducen temprano en los textos bayesianos para que las técnicas más avanzadas como MCMC sean más intuitivas. Sin embargo, solo una suposición.
Sycorax dice Reinstate Monica
Especialista bayesiano aquí. La suposición de DJE es 100% correcta.
Cian
Bien. Entonces, si asumo, más adelante se utilizarán simulaciones en lugar de las distribuciones posteriores. Pero las simulaciones solo se pueden dibujar si se conoce la distribución posterior, como se ve en ps <- sample(p, replace=TRUE, prob = post)! ¿Estoy en lo cierto al suponer que esto cambiará para técnicas de simulación más avanzadas?
mzuba

Respuestas:

1

Para responder a su pregunta: ¿Cómo hacer lo siguiente con más elegancia?

post.vector <- vector()
post.vector[1] <- sum(post[p < 0.1])
post.vector[2] <- sum(post[p > 0.1 & p <= 0.2])
post.vector[3] <- sum(post[p > 0.2 & p <= 0.3])
post.vector[4] <- sum(post[p > 0.3 & p <= 0.4])
post.vector[5] <- sum(post[p > 0.4 & p <= 0.5])
post.vector[6] <- sum(post[p > 0.5 & p <= 0.6])
post.vector[7] <- sum(post[p > 0.6 & p <= 0.7])
post.vector[8] <- sum(post[p > 0.7 & p <= 0.8])
post.vector[9] <- sum(post[p > 0.8 & p <= 0.9])
post.vector[10] <- sum(post[p > 0.9 & p <= 1])

La forma más fácil de hacerlo usando la base R es:

group <- cut(p, breaks=seq(0,1,0.1), include.lowest = T)
post.vector.alt <- aggregate(post, FUN=sum, by=list(group))

Tenga en cuenta que los descansos van de 0 a 1. Esto produce:

     Group.1            x
1    [0,0.1] 3.030528e-13
2  (0.1,0.2] 1.251849e-08
3  (0.2,0.3] 6.385088e-06
4  (0.3,0.4] 6.732672e-04
5  (0.4,0.5] 2.376448e-01
6  (0.5,0.6] 7.372805e-01
7  (0.6,0.7] 2.158296e-02
8  (0.7,0.8] 2.691182e-03
9  (0.8,0.9] 1.205200e-04
10   (0.9,1] 3.345072e-07

Y tenemos:

> all.equal (post.vector.alt$x, post.vector)
[1] TRUE
asac
fuente
0

Tengo entendido que, dado que la densidad posterior obtenida del producto de densidad y probabilidad anteriores es solo una APROXIMACIÓN de la densidad posterior, por lo tanto, no podemos hacer ninguna inferencia EXACTA directamente.

En consecuencia, necesitamos tomar una muestra aleatoria de ella y realizar inferencias de la muestra, al igual que el método de simulación para la familia posterior de beta.

user197065
fuente
La densidad posterior obtenida del producto de la anterior y la probabilidad ES la densidad posterior, no una aproximación a la misma, excepto en la medida en que las funciones anteriores y de probabilidad son en sí mismas aproximaciones, un problema que la simulación posterior no solucionará.
jbowman el