A depuração de programas MCMC é notoriamente difícil. A dificuldade surge devido a vários problemas, alguns dos quais são:
a) Natureza cíclica do algoritmo
Iterativamente, desenhamos parâmetros condicionais para todos os outros parâmetros. Portanto, se uma implementação não estiver funcionando corretamente, é difícil isolar o bug, pois o problema pode estar em qualquer lugar no amostrador iterativo.
(b) A resposta correta não é necessariamente conhecida.
Não temos como saber se alcançamos convergência. Até certo ponto, isso pode ser atenuado testando o código em dados simulados.
À luz dos problemas acima, fiquei pensando se existe uma técnica padrão que possa ser usada para depurar programas do MCMC.
Editar
Eu queria compartilhar a abordagem usada para depurar meus próprios programas. Obviamente, faço todas as coisas que PeterR mencionou. Além desses, eu realizo os seguintes testes usando dados simulados:
Inicie todos os parâmetros a partir de valores reais e veja se o amostrador diverge muito dos valores reais.
Eu tenho sinalizadores para cada parâmetro no meu amostrador iterativo que determina se estou desenhando esse parâmetro no amostrador iterativo. Por exemplo, se um sinalizador 'gen_param1' estiver definido como true, eu desenho 'param1' de sua condição total no amostrador iterativo. Se estiver definido como false, 'param1' será definido como seu valor verdadeiro.
Depois de terminar de escrever o amostrador, testei o programa usando a seguinte receita:
- Defina o sinalizador de geração para um parâmetro como true e todo o resto como false e avalie a convergência em relação ao valor true.
- Defina o sinalizador de geração para outro parâmetro em conjunto com o primeiro e avalie novamente a convergência.
Os passos acima foram incrivelmente úteis para mim.
Boas dicas na resposta de PeterR; Não tenho mais dicas para a depuração real, mas encontrei um procedimento muito útil para testar se o seu código poderia ter um bug. É descrito neste artigo:
http://pubs.amstat.org/doi/abs/10.1198/016214504000001132
Essencialmente, a idéia é ter duas simulações: uma sendo o seu MCMC para inferir (presumivelmente) os parâmetros do seu modelo. O segundo simulador simplesmente faz uma amostra de parâmetros do anterior. Eles geram dados a partir dos parâmetros de ambos os simuladores e calculam uma estatística de teste comparando as distribuições conjuntas de parâmetros e dados. Se o código MCMC fizer uma amostragem correta dos parâmetros da parte posterior, a estatística do teste terá uma distribuição de N (0,1). O código para calcular a estatística de teste está disponível.
fonte