Seleção de modelo bayesiano em PyMC3

11

Estou usando o PyMC3 para executar modelos bayesianos nos meus dados.

Eu sou novo na modelagem bayesiana, mas de acordo com algumas postagens em blogs , Wikipedia e QA deste site, parece ser uma abordagem válida usar o fator Bayes e o critério BIC para poder escolher qual modelo melhor representa meus dados (aquele que gera meus dados).

Para calcular o fator Bayes, preciso da probabilidade relativa dos modelos que quero comparar. Talvez seja um pouco confuso para mim, mas acho que há duas maneiras de obter a probabilidade (corrija-me se estiver errado):

  • a maneira algébrica em que o modelo é simples: veja o exemplo da Wikipedia Página de fator Bayes

  • da maneira numérica: é isso que o PyMC3 com os algoritmos MCMC

Como posso acessar a probabilidade e comparar meus modelos no PyMC3? Encontrei um model.logpmétodo que, de acordo com o documento, é a "função de densidade de probabilidade de log". Posso usar isso para obter a probabilidade?

Pergunta de bônus: quando dois modelos são comparados, a razão entre ambas as probabilidades é calculada. O que acontecerá se você quiser comparar vários modelos?

Um exemplo concreto de PyMC3 seria muito útil!

hadim
fonte

Respostas:

15

Você pode calcular a probabilidade de um modelo usando model.logp (). Como entrada, requer um ponto. Por exemplo, o modelo BEST do diretório de exemplos que posso fazer:

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}))

Note que este modelo está usando variáveis ​​transformadas, então eu tenho que fornecê-las. Você pode pegar o exp () e usá-lo dentro de um integrador numérico, por exemplo, conforme fornecido pelo scipy.integrate. O problema é que, mesmo com apenas 5 parâmetros, isso será muito lento.

Geralmente, os fatores de Bayes são muito difíceis de calcular, porque você precisa integrar o espaço de parâmetros completo. Existem algumas idéias para usar amostras do MCMC para isso. Veja este post, e especialmente a seção de comentários, para obter mais informações: https://radfordneal.wordpress.com/2008/08/17/the-harmonic-mean-of-the-likelihood-worst-monte-carlo-method-ever / O caso da BIC é infelizmente parecido.

Se você realmente deseja calcular o fator Bayes, também pode examinar o teste Savage Dickey Ratio (veja, por exemplo, http://drsmorey.org/bibtex/upload/Wagenmakers:etal:2010.pdf ), mas sua aplicação é limitada.

Suponho que você esteja tentando fazer uma comparação de modelos, que é um campo com muitas opiniões e soluções (algumas difíceis de implementar, como BFs). Uma medida que é muito fácil calcular é o Critério de Informação de Desvio. Tem suas desvantagens, embora algumas delas possam ser remediadas (consulte http://onlinelibrary.wiley.com/doi/10.1111/rssb.12062/abstract ). Infelizmente ainda não portamos o código pymc3, mas seria muito fácil (veja aqui a implementação do pymc2: https://github.com/pymc-devs/pymc/blob/895c24f62b9f5d786bce7ac4fe88edb4ad220364/pymc/MCMC.py# L410 ).

Kruschke favorece a abordagem para criar apenas o modelo completo e permitir que você indique quais parâmetros são importantes. Você também pode criar a seleção de variáveis ​​no próprio modelo (veja, por exemplo, http://arxiv.org/pdf/math/0505633.pdf ).

Por fim, para um tratamento muito mais completo, consulte esta recente postagem no blog: http://jakevdp.github.io/blog/2015/08/07/frequentism-and-bayesianism-5-model-selection/

twiecki
fonte
1
Abriu um problema para adicionar DIC ao pymc3: github.com/pymc-devs/pymc3/issues/797
twiecki