La depuración de programas MCMC es notoriamente difícil. La dificultad surge debido a varios problemas, algunos de los cuales son:
(a) Naturaleza cíclica del algoritmo
Dibujamos iterativamente parámetros condicionales a todos los demás parámetros. Por lo tanto, si una implementación no funciona correctamente, es difícil aislar el error ya que el problema puede estar en cualquier parte del muestreador iterativo.
(b) La respuesta correcta no se conoce necesariamente.
No tenemos forma de saber si hemos logrado la convergencia. Hasta cierto punto, esto puede mitigarse probando el código en datos simulados.
A la luz de los problemas anteriores, me preguntaba si existe una técnica estándar que pueda usarse para depurar programas MCMC.
Editar
Quería compartir el enfoque que uso para depurar mis propios programas. Yo, por supuesto, hago todas las cosas que PeterR mencionó. Además de eso, realizo las siguientes pruebas utilizando datos simulados:
Inicie todos los parámetros a partir de valores verdaderos y vea si la muestra diverge demasiado de los valores verdaderos.
Tengo banderas para cada parámetro en mi muestra iterativa que determina si estoy dibujando ese parámetro en la muestra iterativa. Por ejemplo, si un indicador 'gen_param1' se establece en verdadero, entonces dibujo 'param1' de su condicional completo en el muestreador iterativo. Si esto se establece en falso, entonces 'param1' se establece en su valor verdadero.
Una vez que termine de escribir la muestra, pruebo el programa usando la siguiente receta:
- Establezca el indicador de generación para un parámetro en verdadero y todo lo demás en falso y evalúe la convergencia con respecto al valor verdadero.
- Establezca el indicador de generación para otro parámetro junto con el primero y nuevamente evalúe la convergencia.
Los pasos anteriores me han sido increíblemente útiles.
Buenos consejos en la respuesta de PeterR; No tengo más consejos para la depuración real, pero encontré un procedimiento muy útil para probar si su código podría tener un error. Se describe en este documento:
http://pubs.amstat.org/doi/abs/10.1198/016214504000001132
Esencialmente, la idea es tener dos simulaciones: una es su MCMC para inferir (presumiblemente) los parámetros de su modelo. El segundo simulador simplemente muestrea parámetros del anterior. Generan datos a partir de los parámetros de ambos simuladores y calculan una estadística de prueba que compara las distribuciones conjuntas de parámetros y datos. Si el código MCMC muestrea correctamente los parámetros de la parte posterior, entonces el estadístico de prueba tendrá una distribución de N (0,1). El código para calcular la estadística de prueba está disponible.
fuente