Dies ist mein erster Versuch für jemanden aus dem Frequentistenlager, eine Bayes'sche Datenanalyse durchzuführen. Ich habe eine Reihe von Tutorials und einige Kapitel aus der Bayesian Data Analysis von A. Gelman gelesen.
Als erstes mehr oder weniger unabhängiges Beispiel für die Datenanalyse habe ich die Wartezeiten für Züge ausgewählt. Ich fragte mich: Wie ist die Verteilung der Wartezeiten?
Der Datensatz wurde in einem Blog bereitgestellt und etwas anders und außerhalb von PyMC analysiert.
Mein Ziel ist es, die erwarteten Zugwartezeiten bei diesen 19 Dateneingaben zu schätzen.
Das Modell, das ich gebaut habe, ist das folgende:
Dabei ist der Datenmittelwert und die Datenstandardabweichung multipliziert mit 1000. & sgr;
Ich habe die erwartete Wartezeit mithilfe der Poisson-Verteilung als modelliert . Der Ratenparameter für diese Verteilung wird unter Verwendung der Gamma-Verteilung modelliert, da es sich um eine konjugierte Verteilung zur Poisson-Verteilung handelt. Die Hyperprioren und wurden mit Normal- bzw. Halbnormalverteilungen modelliert. Die Standardabweichung wurde so breit wie möglich gemacht, um so unverbindlich wie möglich zu sein.μ σ σ
Ich habe ein paar Fragen
- Ist dieses Modell für die Aufgabe angemessen (verschiedene Möglichkeiten zur Modellierung?)?
- Habe ich Anfängerfehler gemacht?
- Kann das Modell vereinfacht werden (ich neige dazu, einfache Dinge zu komplizieren)?
- Wie kann ich überprüfen, ob der Posterior für den Ratenparameter ( ) tatsächlich zu den Daten passt?
- Wie kann ich einige Proben aus der angepassten Poisson-Verteilung ziehen, um die Proben zu sehen?
Die Posterioren nach 5000 Metropolis-Schritten sehen folgendermaßen aus:
Ich kann auch den Quellcode posten. In der Modellanpassungsphase führe ich die Schritte für die Parameter und mit NUTS aus. Dann mache ich im zweiten Schritt Metropolis für den Ratenparameter . Schließlich zeichne ich die Spur mit den eingebauten Werkzeugen.σ ρ
Ich wäre sehr dankbar für alle Bemerkungen und Kommentare, die es mir ermöglichen würden, mehr probabilistische Programmierung zu erfassen. Vielleicht gibt es klassischere Beispiele, mit denen es sich zu experimentieren lohnt?
Hier ist der Code, den ich mit PyMC3 in Python geschrieben habe. Die Datendatei finden Sie hier .
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import pymc3
from scipy import optimize
from pylab import figure, axes, title, show
from pymc3.distributions import Normal, HalfNormal, Poisson, Gamma, Exponential
from pymc3 import find_MAP
from pymc3 import Metropolis, NUTS, sample
from pymc3 import summary, traceplot
df = pd.read_csv( 'train_wait.csv' )
diff_mean = np.mean( df["diff"] )
diff_std = 1000*np.std( df["diff"] )
model = pymc3.Model()
with model:
# unknown model parameters
mu = Normal('mu',mu=diff_mean,sd=diff_std)
sd = HalfNormal('sd',sd=diff_std)
# unknown model parameter of interest
rate = Gamma( 'rate', mu=mu, sd=sd )
# observed
diff = Poisson( 'diff', rate, observed=df["diff"] )
with model:
step1 = NUTS([mu,sd])
step2 = Metropolis([rate])
trace = sample( 5000, step=[step1,step2] )
plt.figure()
traceplot(trace)
plt.savefig("rate.pdf")
plt.show()
plt.close()
Antworten:
Ich werde Ihnen zuerst sagen, was ich tun würde, und dann die spezifischen Fragen beantworten, die Sie hatten.
Was ich tun würde (zumindest anfangs)
Folgendes entnehme ich Ihrem Beitrag: Sie haben Trainingswartezeiten für 19 Beobachtungen und sind an Rückschlüssen auf die erwartete Wartezeit interessiert.
Ich werde für als Wartezeit für Zug . Ich sehe keinen Grund, warum diese Wartezeiten ganze Zahlen sein sollten, daher gehe ich davon aus, dass es sich um positive kontinuierliche Größen handelt, dh . Ich gehe davon aus, dass alle Wartezeiten tatsächlich eingehalten werden. i = 1 , … , 19 i W i ∈ R +Wi i=1,…,19 i Wi∈R+
Es gibt mehrere mögliche Modellannahmen, die verwendet werden könnten, und mit 19 Beobachtungen kann es schwierig sein, zu bestimmen, welches Modell vernünftiger ist. Einige Beispiele sind logarithmisch normal, Gamma, Exponential, Weibull.
Als erstes Modell würde ich vorschlagen, modellieren und dann anzunehmen Mit dieser Wahl haben Sie Zugang zu Reichtum der normalen Theorie, die existiert, z. B. einem konjugierten Prior. Der konjugierte Prior ist eine Normal-Inverse-Gamma-Verteilung, dh wobei ist inverse Gammaverteilung. Alternativ können Sie die Standardeinstellung In diesem Fall ist der hintere Teil auch eine Normal-Inverse-Gamma-Verteilung.Yi=log(Wi)
Da , können wir Fragen zur erwarteten Wartezeit beantworten, indem wir gemeinsame Proben von und aus ihrer posterioren Verteilung ziehen, was eine Normalinverse ist -gammaverteilung und dann Berechnung von für jede dieser Proben. Dies wird vom posterioren für die erwartete Wartezeit abgetastet. μ σ 2 e μ + σ / 2E[Wi]=eμ+σ/2 μ σ2 eμ+σ/2
Beantwortung Ihrer Fragen
Ein Poisson scheint nicht für Daten geeignet zu sein, die nicht ganzzahlig sein könnten. Sie haben nur ein einziges und können daher die Parameter der Gammaverteilung, die Sie zugewiesen haben, nicht lernen . Eine andere Möglichkeit, dies zu sagen, besteht darin, dass Sie ein hierarchisches Modell erstellt haben, die Daten jedoch keine hierarchische Struktur aufweisen.λλ λ
Siehe vorherigen Kommentar.
Außerdem ist es sehr hilfreich, wenn Ihre Mathematik und Ihr Code übereinstimmen, z. B. wo befindet sich in Ihren MCMC-Ergebnissen? Was ist SD und Rate in Ihrem Code?λ
Ihr Prior sollte nicht von den Daten abhängen.
Ja und das sollte es auch. Siehe meinen Modellierungsansatz.
Ist das nicht soll Ihre Daten sein? Meinst du ? Eine zu überprüfende Sache ist, sicherzustellen, dass die durchschnittliche Wartezeit der Stichprobe im Verhältnis zu Ihrer posterioren Verteilung der durchschnittlichen Wartezeit sinnvoll ist. Sofern Sie keinen bizarren Vorgänger haben, sollte der Stichprobenmittelwert nahe dem Peak der posterioren Verteilung liegen.λρ λ
Ich glaube, Sie wollen eine posteriore prädiktive Verteilung. Für jede Iteration in Ihrem MCMC fügen Sie die Parameterwerte für diese Iteration ein und nehmen ein Beispiel.
quelle