Modellazione bayesiana dei tempi di attesa dei treni: la definizione del modello


12

Questo è il mio primo tentativo per qualcuno proveniente dal campo frequentista di fare analisi dei dati bayesiani. Ho letto una serie di tutorial e alcuni capitoli di Bayesian Data Analysis di A. Gelman.

Come primo esempio di analisi dei dati più o meno indipendente che ho scelto sono i tempi di attesa dei treni. Mi sono chiesto: qual è la distribuzione dei tempi di attesa?

Il set di dati è stato fornito su un blog ed è stato analizzato in modo leggermente diverso e al di fuori di PyMC.

Il mio obiettivo è stimare i tempi di attesa previsti per il treno dati questi 19 dati.

Il modello che ho costruito è il seguente:

μN(μ^,σ^)

σ|N(0,σ^)|

λΓ(μ,σ)

ρPoisson(λ)

dove μ è dati significano e σ è la deviazione standard dei dati moltiplicato per 1000.μ^σ^

ρμσσ

Ho un sacco di domande

  • Questo modello è ragionevole per l'attività (diversi modi possibili per modellare?)?
  • Ho fatto errori per principianti?
  • Il modello può essere semplificato (tendo a complicare le cose semplici)?
  • ρ
  • Come posso prelevare alcuni campioni dalla distribuzione Poisson installata per vedere i campioni?

I posteriori dopo 5000 passi di Metropolis si presentano così: Tracciare grafici

μσρ

Sarei molto grato per eventuali osservazioni e commenti che mi permettessero di cogliere una programmazione più probabilistica. Potrebbero esserci esempi più classici con cui vale la pena sperimentare?


Ecco il codice che ho scritto in Python usando PyMC3. Il file di dati può essere trovato qui .

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

Una bella domanda, ma ti consiglio di modificare il titolo: le tue domande sono piuttosto agnostiche per il software e sembrano più sulla valutazione del modello. Potresti anche voler dividerlo in domande separate e correlate.
Sean Easter,

@SeanEaster Grazie! In realtà è legato al software, anche se sono d'accordo sul titolo. Sono pronto ad aggiungere il codice sorgente su richiesta in quanto racconta una storia più completa ma potrebbe anche rendere la domanda più voluminosa e potenzialmente più confusa. Sentiti libero di modificare il titolo poiché non mi viene in mente nulla di più generico.
Vladislavs Dovgalecs

Sono d'accordo. Penso che queste siano davvero due domande. Ho provato a rispondere alle domande di modellazione.
Jaradniemi,

Risposte:


4

Prima ti dirò cosa farei e poi risponderò alle domande specifiche che avevi.

Cosa farei (almeno inizialmente)

Ecco cosa raccolgo dal tuo post, hai dei tempi di attesa per 19 osservazioni e sei interessato a dedurre il tempo di attesa previsto.

Wii=1,,19iWiR+

Esistono diverse ipotesi di modello che potrebbero essere utilizzate e con 19 osservazioni può essere difficile determinare quale modello sia più ragionevole. Alcuni esempi sono log-normali, gamma, esponenziali, Weibull.

Yi=log(Wi)

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

E[Wi]=eμ+σ/2μσ2eμ+σ/2

Rispondere alle tue domande

  • Questo modello è ragionevole per l'attività (diversi modi possibili per modellare?)?

λλ

  • Ho fatto errori per principianti?

Vedi il commento precedente.

λ

Il tuo precedente non dovrebbe dipendere dai dati.

  • Il modello può essere semplificato (tendo a complicare le cose semplici)?

Sì e dovrebbe. Vedi il mio approccio alla modellazione.

  • ρ

ρλ

  • Come posso prelevare alcuni campioni dalla distribuzione Poisson installata per vedere i campioni?

Credo che tu voglia una distribuzione predittiva posteriore. Per ogni iterazione nel tuo MCMC, inserisci i valori dei parametri per quell'iterazione e prendi un campione.


Grazie mille! Ho letto la tua risposta piuttosto rapidamente. Avrò bisogno di un po 'di tempo per digerirlo, trovare i riferimenti per alcune distribuzioni e concetti e provare a implementarlo in PyMC. A proposito, ho appena aggiunto il codice Python per il mio esperimento.
Vladislavs Dovgalecs,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.