MCMC ausführen: Verwenden Sie jags / stan oder implementieren Sie es selbst


13

Ich bin neu in der Bayesian Statistics-Forschung. Ich habe von Forschern gehört, dass Bayesianische Forscher MCMC besser selbst implementieren als Tools wie JAGS / Stan. Darf ich fragen, was der Vorteil der Implementierung des MCMC-Algorithmus für sich selbst ist (in "nicht ganz schnellen" Sprachen wie R), außer zu Lernzwecken?


Da Sie dann Ihre eigene Angebotsverteilung selbst auswählen können, sollten Sie diese so auswählen, dass die daraus resultierende Markov-Kette so schnell wie möglich zum posterior konvergiert.

Vielen Dank! Ist das der einzige Grund?
user112758

4
Wenn Sie ein angewandter Forscher sind, der mehr über Bayes erfahren möchte, indem Sie es für Anwendungen verwenden, würde ich empfehlen, mit JAGS oder Stan zu beginnen und dann Ihr eigenes MCMC zu schreiben, wenn Sie dies "brauchen". Denken Sie daran, dass JAGS und Stan leicht unterschiedliche Stärken und Einschränkungen haben.
Conjugateprior

Vielen Dank! Ja, ich mache angewandte Forschung. Würden Sie mir mehr über die Einschränkungen von JAGS und Stan erzählen? Ich habe Stan zum ersten Mal ausprobiert, aber ich habe gerade festgestellt, dass es keine "Online-Überwachung" oder "Probe-bis-Konvergenz" -Funktionen oder -Add-Ons gibt.
user112758

Antworten:


26

Im Allgemeinen würde ich dringend empfehlen , Ihr eigenes MCMC nicht für eine echte angewandte Bayes'sche Analyse zu codieren. Dies ist sowohl viel Arbeit als auch Zeit und führt sehr wahrscheinlich zu Fehlern im Code. Blackbox-Sampler wie Stan verwenden bereits sehr ausgefeilte Sampler. Vertrauen Sie mir, Sie werden keinen Sampler dieses Kalibers nur für eine Analyse codieren!

Es gibt Sonderfälle, in denen dies nicht ausreicht. Wenn Sie beispielsweise eine Analyse in Echtzeit durchführen müssen (dh eine Computerentscheidung basierend auf eingehenden Daten), sind diese Programme keine gute Idee. Dies liegt daran, dass Stan das Kompilieren von C ++ - Code erfordert, was erheblich mehr Zeit in Anspruch nehmen kann, als nur einen bereits vorbereiteten Sampler für relativ einfache Modelle auszuführen. In diesem Fall möchten Sie möglicherweise Ihren eigenen Code schreiben. Darüber hinaus glaube ich, dass es Sonderfälle gibt, in denen Pakete wie Stan sehr schlecht abschneiden, wie z. B. nicht-gaußsche Zustandsraummodelle (vollständige Offenlegung: Ich glaube, dass Stan in diesem Fall schlecht abschneidet, es aber nicht weiß). In diesem Fall kann es sich lohnen, eine benutzerdefinierte MCMC zu implementieren. Dies ist jedoch die Ausnahme, nicht die Regel!

Um ganz ehrlich zu sein, denke ich, dass die meisten Forscher, die Sampler für eine einzelne Analyse schreiben (und das habe ich auch schon gesehen), dies tun, weil sie gerne ihre eigenen Sampler schreiben. Zumindest kann ich sagen, dass ich in diese Kategorie falle (dh ich bin enttäuscht, dass das Schreiben eines eigenen Samplers nicht der beste Weg ist, Dinge zu tun).

Auch wenn es nicht sinnvoll ist, einen eigenen Sampler für eine einzelne Analyse zu schreiben, kann es durchaus sinnvoll sein, einen eigenen Code für eine Klasse von Analysen zu schreiben. Da es sich bei JAGs, Stan usw. um Black-Box-Sampler handelt, können Sie die Dinge immer schneller machen, indem Sie sich auf ein bestimmtes Modell spezialisieren, obwohl das Ausmaß der Verbesserung modellabhängig ist. Das Schreiben eines äußerst effizienten Samplers von Grund auf dauert je nach Erfahrung, Komplexität des Modells usw. 10 bis 1000 Stunden. Es ist dein Job. Aber wenn Ihr Chef sagt "Hey, können Sie diesen Datensatz mit wiederholten Messungen analysieren?" Wenn Sie 250 Stunden damit verbringen, einen effizienten Sampler zu schreiben, ist Ihr Chef wahrscheinlich verärgert. Im Gegensatz dazu hätten Sie dieses Modell in Stan beispielsweise in 2 Stunden schreiben und 2 Minuten Laufzeit anstelle der 1-minütigen Laufzeit des effizienten Samplers haben können.


3
+1. Außerdem behandelt Stan einige Probleme mit diskreten Verteilungen nicht direkt. Sie müssen also genug wissen, um diese zu integrieren, was an sich nicht einfach ist. In diesem Fall kann es hilfreich sein, Ihre eigenen zu rollen. Ich glaube jedoch, dass JAGS solche Fälle direkt behandelt. Wenn Sie also die unterschiedlichen Philosophien von BUGS / JAGS und Stan im Hinterkopf behalten können, ist es am besten, einfach zwischen ihnen zu wechseln.
Wayne

Darüber hinaus kann Stan Probleme haben, wenn eine diagonale euklidische Metrik nicht gut für die Geometrie des Seitenzahns geeignet ist. Dies ist unter anderem dann der Fall, wenn es nur einen schmalen, ungewöhnlich geformten Bereich des Seitenzahns gibt, der eine große Wahrscheinlichkeit hat. Das Ergebnis ist, dass das Abtasten des Seitenzahns dem Versuch gleicht, mit dem Fahrrad am Rand einer Klippe entlang zu fahren: Sie könnten "herunterfallen", wenn Sie falsch abbiegen!
Sycorax sagt Reinstate Monica

2
+1. Meine generelle Empfehlung an Studenten ist, es in JAGS zu programmieren. Wenn das nicht funktioniert, programmieren Sie es in Stan. Wenn das nicht funktioniert, schreiben Sie Ihren eigenen Sampler. Es gibt auch bestimmte Modelle, z. B. räumliche Modelle, in denen Sie möglicherweise BUGS verwenden möchten. Und bestimmte Modelle, z. B. nicht-Gaußsche Zustandsraummodelle, bei denen Sie NIMBLE verwenden möchten. Die Opportunitätskosten für das Schreiben eines eigenen Samplers sind einfach zu hoch.
Jaradniemi

Ich verstehe den "Echtzeit" -Fall nicht - wenn es möglich ist, einen "bereits vorbereiteten" eigenen Sampler zu haben, warum ist es nicht so einfach, ein bereits kompiliertes Stan-Modell zu verwenden? Ich frage mich auch, ob ein MCMC schnell genug für Echtzeitanwendungen ist.
Juho Kokkala

1
Und ich kenne Stan nicht gut genug, um zu wissen, was genau das Kompilieren neuer Modelle erfordert, aber es ist nicht schwer vorstellbar, dass es unabhängig von der Einschränkung ein dynamisches Modell gibt, das komplexer wird, wenn neue Daten eingehen und so wäre eine Neukompilierung notwendig. Ich denke, dass nicht-parametrische Methoden (bei denen der Parameterraum mit der Stichprobengröße wächst) diesen Kriterien entsprechen würden? Aber es kann clevere Wege geben, das zu umgehen.
Cliff AB

6

Diese Frage ist in erster Linie meinungsbasiert, aber ich denke, es gibt genug, um hier eine Antwort aufzuschreiben. Es kann viele Gründe geben, den eigenen Sampler für ein Forschungsproblem zu codieren. Hier sind einige davon

  1. Vorschlag: Wie in den Kommentaren von fcop vorgeschlagen, können Sie, wenn das Sample MH ist, mit Ihrem eigenen Sampler spielen, um den besten Mixing-Sampler zu erhalten.

  2. Flexibilität: In erstellten Programmen erhalten Sie möglicherweise nicht die gewünschte Flexibilität. Möglicherweise möchten Sie mit einem bestimmten Zufallswert beginnen oder eine bestimmte Ausgangsstruktur verwenden.

  3. Verstehen: Das Codieren Ihres eigenen Samplers hilft Ihnen, das Verhalten des Samplers zu verstehen, und gibt Einblicke in den Markov-Kettenprozess. Dies ist nützlich für einen Forscher, der an dem Problem arbeitet.

  4. Onus: Wenn die Daten, für die ich alle meine Bayesianischen Schlussfolgerungen mache, aus einem Programm stammen, das ich nicht codiert habe, dann liegt die Inferenzlast nicht mehr bei mir. Als Forscher möchte ich die Verantwortung für die von mir vorgelegten Methoden / Ergebnisse übernehmen. Mit eingebauten Methoden können Sie das nicht tun.

Es gibt wahrscheinlich noch mehr Gründe, aber diese vier lassen mich meine eigenen Sampler codieren.


6
Ich würde sagen, dass der "Vertrauens" -Grund umstritten ist: Stan ist Open Source und hat viele Mitwirkende. Daher haben sich mehrere Personen den Quellcode angesehen und es ist unwahrscheinlich, dass es schwerwiegende Fehler gibt. Auf der anderen Seite, wenn Sie es selbst tun, können Sie immer den Fehler übersehen, den Sie gemacht haben - und jeder macht Fehler, es ist nur eine Frage der Anzahl der Codezeilen, die Sie schreiben ...
Tim

@ Tim Ich stimme zu. Ich habe diesen Punkt geändert, um zu reflektieren, was ich zu sagen versuchte. Vielen Dank.
Greenparker

5
+1 für das Argument Verstehen. Das Argument von Onus scheint jedoch etwas übertrieben. Fast alles, was Sie selbst programmieren, hängt von der statistischen Sprache, der Bibliothek für lineare Algebra, dem Zufallszahlengenerator usw. eines anderen ab. Die Übernahme von Verantwortung ist also eine Frage des Grades.
Conjugateprior

@conjugateprior Absolut einverstanden. Deshalb war meine Antwort darauf in der ersten Person. Das war rein meine Meinung.
Greenparker

4

Ich habe der Antwort von Cliff AB +1 gegeben. Um einen kleinen Leckerbissen hinzuzufügen, sollten Sie sich nach dem LaplacesDemon- Paket umsehen, wenn Sie auf einer niedrigeren Ebene arbeiten möchten, aber nicht auf der Code-Alles-Selbst-Ebene . Der ursprüngliche Autor war brillant, scheint aber vom Raster gefallen zu sein, und das Paket wurde von jemand anderem übernommen. (Es ist auf Github, glaube ich.)

Es implementiert eine beeindruckende Anzahl von Algorithmen, die in MCMC verwendet werden, und die enthaltenen Vignetten sind auch dann lesenswert, wenn Sie das Paket nicht verwenden. So ziemlich jede Art von Sampler, über die Sie gelesen haben. Sie codieren anders als BUGS / JAGS oder Stan, und es ist alles in R, aber oftmals ist es so effizient, dass es wettbewerbsfähig ist.


1
Schamloser Plug: Sie können auch [nimble] (r-nimble.org) verwenden, mit dem Sie Ihren MCMC anpassen können (dh einen Slice-Sampler für diesen Knoten verwenden, Updater für diese Gruppe von Knoten blockieren usw.), ohne ihn neu schreiben zu müssen diese Sampler jedes Mal. Sie können auch eigene Sampler schreiben, die direkt implementiert werden. Offenlegung: Ich habe an diesem Projekt gearbeitet.
Cliff AB

@CliffAB: Klingt ähnlich LaplacesDemon, wenn Sie damit vertraut sind. Freut mich auch darüber zu hören nimble. Ich werde es zumindest herunterladen. (Auch wenn der Download mehrerer LaplacesDemon-Vignetten wert sein könnte, selbst wenn Sie flinke verwenden.) ... Ohhh, bin gerade auf die Seite gegangen. Wenn der SMC einfach zu bedienen ist, werde ich ein großer Fan. Das einzige R-Paket, das ich bei SMC gesehen habe, ist schrecklich komplex.
Wayne

@CliffAB: Wow, nach dem Lesen der nimbleWebsite ist es ziemlich beeindruckend. Warum habe ich noch nie davon gehört? Es sieht nach einer großartigen Option für Leute aus, die an die BUGS / JAGS-Modellierungssprache gewöhnt sind. Natürlich werden sie die bestmöglichen Vergleiche auf der Website anstellen, aber es gefällt mir bis jetzt immer noch. (Abgesehen davon, dass mit rstanarmund brms, die Stan unter der Haube verwenden, der Champion für die einfache Verwendung in R Stan sein würde.)
Wayne

es ist immer noch sehr neu: v0.1 wurde veröffentlicht, glaube ich, vor etwas mehr als 2 Jahren? Und SMC war ein großer Motivator für das Projekt: Das PI hat umfangreiche Veröffentlichungen zu Partikelfiltern durchgeführt und war jedes Mal verärgert, wenn es sie von Grund auf neu schrieb. Aber ich war ein bisschen mit der aktuellen Arbeit beschäftigt, um mit dem aktuellen Status der SMC-Sampler Schritt zu halten. Als ich (vor fast zwei Jahren) ging, hatten wir gerade eine sehr primitive zusammengestellt.
Cliff AB

1
Sagen Sie einfach dieses arXiv-Papier, an dem Sie interessiert sein könnten.
Cliff AB
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.