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()