He estado tratando de entender el algoritmo de Metropolis-Hastings para escribir un código para estimar los parámetros de un modelo (es decir, ). Según la bibliografía, el algoritmo Metropolis-Hastings tiene los siguientes pasos:
- Generar
donde
Cómo me gustaría hacer algunas preguntas:
- La bibliografía establece que si es una distribución simétrica, la relación q ( x | y ) / q ( y | x ) se convierte en 1 y el algoritmo se llama Metrópolis. ¿Es eso correcto? La única diferencia entre Metropolis y Metropolis-Hastings es que el primero usa una distribución simétrica. ¿Qué pasa con Metrópolis "Random Walk" (-Hastings)? ¿Cómo difiere de los otros dos?
- es la razón de probabilidad ¿Qué pasa si la distribución de la propuesta es una distribución de Poisson? Creo que entiendo racionalmente por qué esa relación no se convierte en 1 cuando se usa una distribución asimétrica, pero no estoy muy seguro de si la entiendo matemáticamente o cómo implementarla con código. ¿Podría alguien darme un código simple (C, python, R, pseudocódigo o lo que prefiera) ejemplo del algoritmo Metropolis-Hastings utilizando una distribución de propuesta no simétrica?
mcmc
metropolis-hastings
AstrOne
fuente
fuente
Respuestas:
Si eso es correcto. El algoritmo Metropolis es un caso especial del algoritmo MH.
En una caminata aleatoria, la distribución de la propuesta se vuelve a centrar después de cada paso en el último valor generado por la cadena. Generalmente, en una caminata aleatoria, la distribución de la propuesta es gaussiana, en cuyo caso esta caminata aleatoria satisface el requisito de simetría y el algoritmo es metrópoli. Supongo que podría realizar una caminata "pseudo" aleatoria con una distribución asimétrica que causaría que las propuestas se desvíen demasiado en la dirección opuesta al sesgo (una distribución sesgada a la izquierda favorecería las propuestas hacia la derecha). No estoy seguro de por qué haría esto, pero podría y sería un algoritmo de aceleración de metrópolis (es decir, requiere el término de relación adicional).
En un algoritmo de paseo no aleatorio, las distribuciones de la propuesta son fijas. En la variante de caminata aleatoria, el centro de la distribución de la propuesta cambia en cada iteración.
Entonces necesitas usar MH en lugar de solo metrópolis. Presumiblemente, esto sería probar una distribución discreta, de lo contrario no querría usar una función discreta para generar sus propuestas.
En cualquier caso, si la distribución de muestreo está truncada o si tiene conocimiento previo de su sesgo, es probable que desee utilizar una distribución de muestreo asimétrica y, por lo tanto, debe utilizar hastings de metrópolis.
Aquí está la metrópoli:
Intentemos usar esto para probar una distribución bimodal. Primero, veamos qué sucede si usamos una caminata aleatoria para nuestra propsal:
Ahora intentemos el muestreo usando una distribución de propuesta fija y veamos qué sucede:
Esto se ve bien al principio, pero si echamos un vistazo a la densidad posterior ...
veremos que está completamente atascado en un máximo local. Esto no es del todo sorprendente, ya que en realidad centramos nuestra distribución de propuestas allí. Lo mismo sucede si centramos esto en el otro modo:
Podemos intentar dejar nuestra propuesta entre los dos modos, pero necesitaremos establecer la varianza realmente alta para tener la oportunidad de explorar cualquiera de ellos.
Observe cómo la elección del centro de distribución de nuestra propuesta tiene un impacto significativo en la tasa de aceptación de nuestra muestra.
Todavía nos quedamos atrapados en el más cercano de los dos modos. Intentemos soltar esto directamente entre los dos modos.
Finalmente, nos estamos acercando a lo que estábamos buscando. Teóricamente, si dejamos que la muestra funcione lo suficiente, podemos obtener una muestra representativa de cualquiera de estas distribuciones de propuestas, pero la caminata aleatoria produjo una muestra utilizable muy rápidamente, y tuvimos que aprovechar nuestro conocimiento de cómo se suponía que la posterior buscar ajustar las distribuciones de muestreo fijas para producir un resultado utilizable (que, a decir verdad, todavía no tenemos
y_trace4
).Intentaré actualizar con un ejemplo de hostigamiento de metrópolis más adelante. Debería poder ver con bastante facilidad cómo modificar el código anterior para producir un algoritmo de aceleración de metrópolis (sugerencia: solo necesita agregar la relación suplementaria en el
logR
cálculo).fuente
R=exp(logR)
con esto:R=exp(logR)*(dnorm(y[t-1],y.prop,my_sigma)/dnorm(y.prop,y[t-1],my_sigma))
tanto para la caminata aleatoria como para la no aleatoria MH. ¿Es eso correcto?