Selección de modelo bayesiano en PyMC3

11

Estoy usando PyMC3 para ejecutar modelos bayesianos en mis datos.

Soy nuevo en el modelado bayesiano, pero según algunas publicaciones de blogs , Wikipedia y QA de este sitio, parece ser un enfoque válido utilizar el factor Bayes y el criterio BIC para poder elegir qué modelo representa mejor mis datos (el que genera mis datos).

Para calcular el factor Bayes, necesito la probabilidad relativa de los modelos que quiero comparar. Tal vez sea un poco confuso para mí, pero creo que hay dos formas de obtener la probabilidad (corríjame si me equivoco):

  • la forma algebraica cuando los modelos son simples: ver ejemplo de Wikipedia en la página del factor Bayes

  • la forma numérica: esto es lo que hace PyMC3 con los algoritmos MCMC

¿Cómo puedo acceder a la probabilidad y comparar mis modelos en PyMC3? Encontré un model.logpmétodo que, según el documento, es la "función de densidad de probabilidad de registro". ¿Puedo usar eso para obtener la probabilidad?

Pregunta adicional: cuando se comparan dos modelos, se calcula la relación entre ambas probabilidades. ¿Qué pasa si quieres comparar varios modelos?

¡Un ejemplo concreto de PyMC3 sería muy útil!

hadim
fuente

Respuestas:

15

Puede calcular la probabilidad de un modelo usando model.logp (). Como entrada, requiere un punto. Por ejemplo, el MEJOR modelo del directorio de ejemplos que puedo hacer:

np.exp(model.logp({'group1_mean': 0.1, 
                   'group2_mean': 0.2, 
                   'group1_std_interval': 1., 
                   'group2_std_interval': 1.2, 
                   'nu_minus_one_log': 1}))

Tenga en cuenta que este modelo está utilizando variables transformadas, por lo que tengo que proporcionarlas. Luego puede tomar el exp () de eso y usarlo dentro de un integrador numérico, por ejemplo, según lo provisto por scipy.integrate. El problema es que incluso con solo 5 parámetros, esto será muy lento.

Los factores de Bayes son generalmente muy difíciles de calcular porque tiene que integrarse en todo el espacio de parámetros. Hay algunas ideas para usar muestras de MCMC para eso. Vea esta publicación, y especialmente la sección de comentarios para obtener más información: https://radfordneal.wordpress.com/2008/08/17/the-harmonic-mean-of-the-likelihood-worst-monte-carlo-method-ever / El caso de BIC es lamentablemente similar.

Si realmente desea calcular el Factor Bayes, también puede consultar la prueba Savage Dickey Ratio (consulte, por ejemplo, http://drsmorey.org/bibtex/upload/Wagenmakers:etal:2010.pdf ), pero su aplicación es limitada.

Supongo que está tratando de hacer una comparación de modelos, que es un campo con muchas opiniones y soluciones (algunas difíciles de implementar, como los BF). Una medida que es muy fácil de calcular es el Criterio de información de desviación. Tiene sus inconvenientes, aunque algunos de ellos pueden remediarse (ver http://onlinelibrary.wiley.com/doi/10.1111/rssb.12062/abstract ). Desafortunadamente, todavía no hemos portado el código pymc3, pero sería bastante fácil (vea aquí la implementación de pymc2: https://github.com/pymc-devs/pymc/blob/895c24f62b9f5d786bce7ac4fe88edb4ad220364/pymc/MCMC.py# L410 ).

Kruschke favorece el enfoque de simplemente construir el modelo completo y dejar que le diga qué parámetros son importantes. También puede crear una selección de variables en el modelo mismo (consulte, por ejemplo, http://arxiv.org/pdf/math/0505633.pdf ).

Finalmente, para un tratamiento mucho más completo, vea esta reciente publicación de blog: http://jakevdp.github.io/blog/2015/08/07/frequentism-and-bayesianism-5-model-selection/

twiecki
fuente
1
Se abrió un problema para agregar DIC a pymc3: github.com/pymc-devs/pymc3/issues/797
twiecki