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 p
valores posibles en 10 intervalos de longitud .1
y 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 == 7
y 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
histprior
ysample
son ú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:
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:
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 ?
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?