Il debug dei programmi MCMC è notoriamente difficile. La difficoltà sorge a causa di diversi problemi, alcuni dei quali sono:
(a) Natura ciclica dell'algoritmo
Disegniamo in modo iterativo parametri condizionali su tutti gli altri parametri. Pertanto, se un'implementazione non funziona correttamente, è difficile isolare il bug poiché il problema può trovarsi ovunque nel campionatore iterativo.
(b) La risposta corretta non è necessariamente conosciuta.
Non abbiamo modo di dire se abbiamo raggiunto la convergenza. In una certa misura ciò può essere mitigato testando il codice su dati simulati.
Alla luce dei problemi di cui sopra, mi chiedevo se esiste una tecnica standard che può essere utilizzata per il debug dei programmi MCMC.
modificare
Volevo condividere l'approccio che uso per eseguire il debug dei miei programmi. Ovviamente, faccio tutte le cose che PeterR ha menzionato. Oltre a questi, eseguo i seguenti test utilizzando dati simulati:
Avviare tutti i parametri dai valori reali e vedere se il campionatore differisce troppo dai valori reali.
Ho flag per ogni parametro nel mio campionatore iterativo che determina se sto disegnando quel parametro nel campionatore iterativo. Ad esempio, se un flag 'gen_param1' è impostato su true, allora traggo 'param1' dal suo condizionale completo nel campionatore iterativo. Se questo è impostato su false, allora 'param1' è impostato sul suo valore vero.
Una volta terminato di scrivere il campionatore, collaudo il programma usando la seguente ricetta:
- Impostare il flag di generazione per un parametro su true e tutto il resto su false e valutare la convergenza rispetto al valore vero.
- Impostare il flag di generazione per un altro parametro insieme al primo e valutare nuovamente la convergenza.
I passaggi precedenti sono stati incredibilmente utili per me.