Modélisation bayésienne des temps d'attente des trains: la définition du modèle

12

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:

μN(μ^,σ^)

σ|N(0,σ^)|

λΓ(μ,σ)

ρPoisson(λ)

μ 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: Tracer des tracés

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()
Vladislavs Dovgalecs
la source
Une belle question, mais je vous suggère d'éditer le titre: vos questions sont plutôt agnostiques pour le logiciel, et semblent plutôt sur l'évaluation du modèle. Vous pouvez même le découper en questions distinctes et connexes.
Sean Easter
@SeanEaster Merci! Il s'agit en fait d'un logiciel, bien que je sois d'accord sur le titre. Je suis prêt à ajouter le code source à la demande car il raconte une histoire plus complète mais pourrait également rendre la question plus volumineuse et potentiellement plus confuse. N'hésitez pas à modifier le titre car rien de plus générique ne me vient à l'esprit.
Vladislavs Dovgalecs
Je suis d'accord. Je pense que ce sont vraiment deux questions. J'ai essayé de répondre aux questions de modélisation.
jaradniemi

Réponses:

4

Je vais d'abord vous dire ce que je ferais, puis je répondrai aux questions spécifiques que vous aviez.

Ce que je ferais (au moins initialement)

Voici ce que je comprends de votre message, vous avez des temps d'attente de formation pour 19 observations et vous êtes intéressé par des déductions sur le temps d'attente prévu.

Wii=1,,19iWiR+

Il existe plusieurs hypothèses de modèle possibles qui pourraient être utilisées et avec 19 observations, il peut être difficile de déterminer quel modèle est plus raisonnable. Quelques exemples sont log-normaux, gamma, exponentiels, Weibull.

Yi=log(Wi)

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

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

Répondre à vos 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?

Voir le commentaire précédent.

λ

Votre préalable ne devrait pas dépendre des données.

  • Le modèle peut-il être simplifié (j'ai tendance à compliquer les choses simples)?

Oui et ça devrait. Voir mon approche de modélisation.

  • Comment puis-je vérifier si la valeur postérieure du paramètre de vitesse ( ρρ

ρλ

  • Comment puis-je tirer des échantillons de la distribution de Poisson ajustée pour voir les échantillons?

Je crois que vous voulez une distribution prédictive postérieure. Pour chaque itération dans votre MCMC, vous branchez les valeurs des paramètres pour cette itération et prenez un échantillon.

jaradniemi
la source
Merci beaucoup! J'ai lu votre réponse assez rapidement. J'aurai besoin de temps pour le digérer, trouver les références de certaines distributions et concepts et essayer de l'implémenter dans PyMC. Btw, je viens d'ajouter le code Python pour mon expérience.
Vladislavs Dovgalecs