C'est ma première tentative pour quelqu'un venant du camp fréquentiste de faire l'analyse des données bayésiennes. J'ai lu un certain nombre de tutoriels et quelques chapitres de Bayesian Data Analysis par A. Gelman.
Le premier exemple d'analyse de données plus ou moins indépendant que j'ai choisi est le temps d'attente des trains. Je me suis demandé: quelle est la répartition des temps d'attente?
L'ensemble de données a été fourni sur un blog et a été analysé légèrement différemment et en dehors de PyMC.
Mon objectif est d'estimer les temps d'attente attendus en train compte tenu de ces 19 entrées de données.
Le modèle que j'ai construit est le suivant:
où μ est donnée moyenne et σ est l' écart type de données multiplié par 1000.
J'ai modélisé le temps d'attente attendu comme utilisant la distribution de Poisson. Le paramètre de vitesse pour cette distribution est modélisé en utilisant la distribution Gamma car il s'agit de la distribution conjuguée à la distribution de Poisson. Les hyper-prieurs μ et σ ont été modélisés avec des distributions normales et semi-normales respectivement. L'écart type σ a été rendu aussi large que possible pour être aussi non contraignant que possible.
J'ai un tas de questions
- Ce modèle est-il raisonnable pour la tâche (plusieurs façons de modéliser?)?
- Ai-je fait des erreurs de débutant?
- Le modèle peut-il être simplifié (j'ai tendance à compliquer les choses simples)?
- Comment puis-je vérifier si la valeur postérieure du paramètre de vitesse ( ) correspond bien aux données?
- Comment puis-je tirer des échantillons de la distribution de Poisson ajustée pour voir les échantillons?
Les postérieurs après 5000 marches Metropolis ressemblent à ceci:
Je peux également publier le code source. Dans l'étape d'ajustement du modèle, je fais les étapes pour les paramètres et σ en utilisant NUTS. Ensuite, dans la deuxième étape, je fais Metropolis pour le paramètre de taux ρ . Enfin, je trace la trace à l'aide des outils intégrés.
Je serais très reconnaissant pour toutes remarques et commentaires qui me permettraient de saisir une programmation plus probabiliste. Peut-être y a-t-il des exemples plus classiques qui valent la peine d'être expérimentés?
Voici le code que j'ai écrit en Python en utilisant PyMC3. Le fichier de données se trouve ici .
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()