Das Debuggen von MCMC-Programmen ist bekanntermaßen schwierig. Die Schwierigkeit ergibt sich aus mehreren Problemen, von denen einige sind:
(a) Zyklische Natur des Algorithmus
Wir zeichnen iterativ Parameter, die von allen anderen Parametern abhängig sind. Wenn eine Implementierung nicht ordnungsgemäß funktioniert, ist es daher schwierig, den Fehler zu isolieren, da das Problem an einer beliebigen Stelle im iterativen Sampler auftreten kann.
(b) Die richtige Antwort ist nicht unbedingt bekannt.
Wir können nicht sagen, ob wir Konvergenz erreicht haben. Bis zu einem gewissen Grad kann dies durch Testen des Codes an simulierten Daten gemildert werden.
Angesichts der oben genannten Probleme habe ich mich gefragt, ob es eine Standardtechnik gibt, mit der MCMC-Programme debuggt werden können.
Bearbeiten
Ich wollte den Ansatz teilen, mit dem ich meine eigenen Programme debugge. Ich mache natürlich all die Dinge, die PeterR erwähnt hat. Abgesehen davon führe ich die folgenden Tests mit simulierten Daten durch:
Starten Sie alle Parameter mit wahren Werten und prüfen Sie, ob der Sampler zu weit von den wahren Werten abweicht.
Ich habe Flags für jeden Parameter in meinem iterativen Sampler, die bestimmen, ob ich diesen Parameter im iterativen Sampler zeichne. Wenn zum Beispiel ein Flag 'gen_param1' auf true gesetzt ist, ziehe ich 'param1' aus seiner vollständigen Bedingung im iterativen Sampler. Wenn dies auf false gesetzt ist, wird 'param1' auf seinen wahren Wert gesetzt.
Sobald ich den Sampler fertig geschrieben habe, teste ich das Programm nach folgendem Rezept:
- Setzen Sie das Generierungsflag für einen Parameter auf true und alles andere auf false und bewerten Sie die Konvergenz in Bezug auf den wahren Wert.
- Setzen Sie das Generierungsflag für einen anderen Parameter in Verbindung mit dem ersten und bewerten Sie erneut die Konvergenz.
Die obigen Schritte waren für mich unglaublich hilfreich.
Gute Tipps in der Antwort von PeterR; Ich habe keine weiteren Tipps für das eigentliche Debuggen, aber ich habe ein sehr nützliches Verfahren zum Testen gefunden, ob Ihr Code einen Fehler haben könnte. Es wird in diesem Artikel beschrieben:
http://pubs.amstat.org/doi/abs/10.1198/016214504000001132
Im Wesentlichen besteht die Idee darin, zwei Simulationen durchzuführen: Eine ist Ihre MCMC, um (vermutlich) auf die Parameter Ihres Modells zu schließen. Der zweite Simulator tastet einfach Parameter aus dem vorherigen ab. Sie generieren Daten aus den Parametern beider Simulatoren und berechnen eine Teststatistik, in der die gemeinsamen Verteilungen von Parametern und Daten verglichen werden. Wenn der MCMC-Code Parameter vom posterioren korrekt abtastet, hat die Teststatistik eine Verteilung von N (0,1). Code zur Berechnung der Teststatistik ist verfügbar.
quelle