Bayesianische Modellierung von Zugwartezeiten: Die Modelldefinition

12

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:

μN(μ^,σ^)

σ|N(0,σ^)|

λΓ(μ,σ)

ρPoisson(λ)

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: Trace-Plots

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()
Vladislavs Dovgalecs
quelle
Eine nette Frage, aber ich schlage vor, dass Sie den Titel bearbeiten: Ihre Fragen sind für die Software eher agnostisch und scheinen eher die Bewertung des Modells zu betreffen. Vielleicht möchten Sie es sogar in separate, verwandte Fragen aufteilen.
Sean Easter
@ SeanEaster Danke! Es ist eigentlich softwarebezogen, obwohl ich über den Titel zustimme. Ich bin bereit, den Quellcode auf Anfrage hinzuzufügen, da er eine vollständigere Geschichte erzählt, aber die Frage möglicherweise auch umfangreicher und möglicherweise verwirrender macht. Fühlen Sie sich frei, den Titel zu bearbeiten, da mir nichts allgemeineres einfällt.
Vladislavs Dovgalecs
Genau. Ich denke, das sind wirklich zwei Fragen. Ich habe versucht, die Modellierungsfrage (n) zu beantworten.
Jaradniemi

Antworten:

4

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 iR +Wii=1,,19iWiR+

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)

YiindN(μ,σ2).
μ|σ2N(m,σ2C)σ2IG(a,b)
IGp(μ,σ2)1/σ2

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μσ2eμ+σ/2

Beantwortung Ihrer Fragen

  • Ist dieses Modell für die Aufgabe angemessen (verschiedene Möglichkeiten zur Modellierung?)?

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.λλλ

  • Habe ich Anfängerfehler gemacht?

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.

  • Kann das Modell vereinfacht werden (ich neige dazu, einfache Dinge zu komplizieren)?

Ja und das sollte es auch. Siehe meinen Modellierungsansatz.

  • Wie kann ich überprüfen, ob der Posterior für den Ratenparameter ( ) tatsächlich zu den Daten passt?ρ

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.λρλ

  • Wie kann ich einige Proben aus der angepassten Poisson-Verteilung ziehen, um die Proben zu sehen?

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.

jaradniemi
quelle
Danke vielmals! Ich habe deine Antwort ziemlich schnell gelesen. Ich werde einige Zeit brauchen, um es zu verdauen, die Referenzen für einige Distributionen und Konzepte zu finden und zu versuchen, es in PyMC zu implementieren. Übrigens habe ich gerade den Python-Code für mein Experiment hinzugefügt.
Vladislavs Dovgalecs