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.