Bayesianische Modellauswahl in PyMC3

11

Ich verwende PyMC3, um Bayes'sche Modelle für meine Daten auszuführen.

Ich bin neu in der Bayes'schen Modellierung, aber laut einigen Blog-Posts , Wikipedia und QA von dieser Website scheint es ein gültiger Ansatz zu sein, den Bayes-Faktor und das BIC-Kriterium zu verwenden, um auswählen zu können, welches Modell meine Daten am besten repräsentiert (dasjenige, das generiert) meine Daten).

Um den Bayes-Faktor zu berechnen, benötige ich die relative Wahrscheinlichkeit für Modelle, die ich vergleichen möchte. Es ist vielleicht ein bisschen verwirrend für mich, aber ich denke, es gibt zwei Möglichkeiten, die Wahrscheinlichkeit zu ermitteln (korrigieren Sie mich, wenn ich falsch liege):

  • Die algebraische Art und Weise, wenn das Modell einfach ist: siehe Wikipedia-Beispiel Bayes-Faktorseite

  • der numerische Weg: Dies ist, was PyMC3 mit den MCMC-Algorithmen macht

Wie kann ich auf die Wahrscheinlichkeit zugreifen und so meine Modelle in PyMC3 vergleichen? Ich habe eine model.logpMethode gefunden , die laut Dokument die "Log-Wahrscheinlichkeitsdichtefunktion" ist. Kann ich das nutzen, um die Wahrscheinlichkeit zu ermitteln?

Bonusfrage: Wenn zwei Modelle verglichen werden, wird das Verhältnis zwischen beiden Wahrscheinlichkeiten berechnet. Was passiert, wenn Sie mehrere Modelle vergleichen möchten?

Ein konkretes PyMC3-Beispiel wäre sehr hilfreich!

Hadim
quelle

Antworten:

15

Sie können die Wahrscheinlichkeit eines Modells tatsächlich mit model.logp () berechnen. Als Eingabe benötigt es einen Punkt. Zum Beispiel das BEST-Modell aus dem Beispielverzeichnis, das ich ausführen kann:

np.exp(model.logp({'group1_mean': 0.1, 
                   'group2_mean': 0.2, 
                   'group1_std_interval': 1., 
                   'group2_std_interval': 1.2, 
                   'nu_minus_one_log': 1}))

Beachten Sie, dass dieses Modell transformierte Variablen verwendet, daher muss ich diese angeben. Sie können dann das exp () davon nehmen und es in einem numerischen Integrator verwenden, beispielsweise wie von scipy.integrate bereitgestellt. Das Problem ist, dass dies selbst mit nur 5 Parametern sehr langsam ist.

Bayes-Faktoren sind im Allgemeinen sehr schwer zu berechnen, da Sie sie über den gesamten Parameterraum integrieren müssen. Es gibt einige Ideen, MCMC-Beispiele dafür zu verwenden. Weitere Informationen finden Sie in diesem Beitrag und insbesondere im Kommentarbereich: https://radfordneal.wordpress.com/2008/08/17/the-harmonic-mean-of-the-likelihood-worst-monte-carlo-method-ever / Der Fall für BIC ist leider ähnlich.

Wenn Sie den Bayes-Faktor wirklich berechnen möchten, können Sie sich auch den Savage Dickey Ratio-Test ansehen (siehe z. B. http://drsmorey.org/bibtex/upload/Wagenmakers:etal:2010.pdf ), dessen Anwendung jedoch begrenzt ist.

Ich nehme an, Sie versuchen, einen Modellvergleich durchzuführen, der ein Feld mit vielen Meinungen und Lösungen ist (einige sind schwer zu implementieren, wie z. B. BFs). Eine Maßnahme, die sehr einfach zu berechnen ist, ist das Abweichungsinformationskriterium. Es hat seine Nachteile, obwohl einige von ihnen behoben werden können (siehe http://onlinelibrary.wiley.com/doi/10.1111/rssb.12062/abstract ). Leider haben wir den Code pymc3 noch nicht portiert, aber es wäre ziemlich einfach (siehe hier für die Implementierung von pymc2: https://github.com/pymc-devs/pymc/blob/895c24f62b9f5d786bce7ac4fe88edb4ad220364/pymc/MCMC.py# L410 ).

Kruschke bevorzugt den Ansatz, nur das vollständige Modell zu erstellen und sich sagen zu lassen, welche Parameter wichtig sind. Sie können auch eine Variablenauswahl in das Modell selbst einbauen (siehe z . B. http://arxiv.org/pdf/math/0505633.pdf ).

Eine viel umfassendere Behandlung finden Sie in diesem aktuellen Blog-Beitrag: http://jakevdp.github.io/blog/2015/08/07/frequentism-and-bayesianism-5-model-selection/

Twiecki
quelle
1
Eröffnung eines Problems zum Hinzufügen von DIC zu pymc3: github.com/pymc-devs/pymc3/issues/797
twiecki