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