Modelado bayesiano de tiempos de espera de trenes: la definición del modelo

12

Este es mi primer intento para que alguien que viene del campo frecuentista haga análisis de datos bayesianos. Leí varios tutoriales y algunos capítulos del Análisis de datos bayesianos de A. Gelman.

Como el primer ejemplo de análisis de datos más o menos independiente que elegí es el tiempo de espera del tren. Me pregunté: ¿cuál es la distribución de los tiempos de espera?

El conjunto de datos se proporcionó en un blog y se analizó de manera ligeramente diferente y fuera de PyMC.

Mi objetivo es estimar los tiempos de espera esperados del tren dados esos 19 datos ingresados.

El modelo que construí es el siguiente:

μN(μ^,σ^)

σ|N(0,σ^)|

λΓ(μ,σ)

ρPoisson(λ)

donde μ es la media de datos y σ son datos de desviación estándar se multiplica por 1.000.μ^σ^

Modelé el tiempo de espera esperado como utilizando la distribución de Poisson. El parámetro de velocidad para esta distribución se modela utilizando la distribución Gamma, ya que es la distribución conjugada a la distribución de Poisson. Los hiper-previos μ y σ fueron modelados con distribuciones Normal y Media Normal, respectivamente. La desviación estándar σ se hizo lo más amplia posible para que fuera lo menos comprometida posible.ρμσσ

Tengo muchas preguntas

  • ¿Es este modelo razonable para la tarea (varias formas posibles de modelar?)?
  • ¿Cometí algún error de principiante?
  • ¿Se puede simplificar el modelo (tiendo a complicar las cosas simples)?
  • ¿Cómo puedo verificar si la parte posterior del parámetro de velocidad ( ) realmente se ajusta a los datos?ρ
  • ¿Cómo puedo extraer algunas muestras de la distribución de Poisson ajustada para ver las muestras?

Los posteriores después de 5000 pasos de Metropolis se ven así: Trazar trazados

Puedo publicar el código fuente también. En la etapa de ajuste del modelo, realizo los pasos para los parámetros y σ utilizando NUTS. Luego, en el segundo paso, hago Metrópolis para el parámetro de velocidad ρ . Finalmente trazo el rastro usando las herramientas incorporadas.μσρ

Estaría muy agradecido por cualquier comentario y comentario que me permitiera captar una programación más probabilística. ¿Puede haber ejemplos más clásicos con los que valga la pena experimentar?


Aquí está el código que escribí en Python usando PyMC3. El archivo de datos se puede encontrar aquí .

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
fuente
Una buena pregunta, pero le sugiero que edite el título: sus preguntas son bastante agnósticas para el software y parecen más sobre la evaluación del modelo. Es posible que incluso desee dividirlo en preguntas separadas y relacionadas.
Sean Easter
@SeanEaster ¡Gracias! En realidad está relacionado con el software, aunque estoy de acuerdo con el título. Estoy listo para agregar el código fuente a la solicitud, ya que cuenta una historia más completa, pero también podría hacer que la pregunta sea más voluminosa y potencialmente más confusa. Siéntase libre de editar el título ya que nada más genérico viene a mi mente.
Vladislavs Dovgalecs
Estoy de acuerdo. Creo que estas son realmente dos preguntas. Traté de responder las preguntas de modelado.
jaradniemi

Respuestas:

4

Primero te diré lo que haría y luego responderé las preguntas específicas que tengas.

Lo que haría (al menos inicialmente)

Esto es lo que deduzco de su publicación: tiene tiempos de espera de capacitación para 19 observaciones y está interesado en inferencia sobre el tiempo de espera esperado.

Wii=1,,19iWiR+

Hay varios supuestos posibles del modelo que podrían usarse y con 19 observaciones puede ser difícil determinar qué modelo es más razonable. Algunos ejemplos son log-normal, gamma, exponencial, Weibull.

Yi=log(Wi)

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

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

Contestando tus preguntas

  • ¿Es este modelo razonable para la tarea (varias formas posibles de modelar?)?

λλ

  • ¿Cometí algún error de principiante?

Ver comentario anterior.

λ

Su prior no debe depender de los datos.

  • ¿Se puede simplificar el modelo (tiendo a complicar las cosas simples)?

Si y deberia. Vea mi enfoque de modelado.

  • ¿Cómo puedo verificar si la parte posterior del parámetro de velocidad ( ρρ

ρλ

  • ¿Cómo puedo extraer algunas muestras de la distribución de Poisson ajustada para ver las muestras?

Creo que quieres una distribución predictiva posterior. Para cada iteración en su MCMC, conecte los valores de los parámetros para esa iteración y tome una muestra.

jaradniemi
fuente
¡Gracias una tonelada! Leí tu respuesta bastante rápido. Necesitaré algo de tiempo para digerirlo, encontrar las referencias de algunas distribuciones y conceptos e intentar implementarlo en PyMC. Por cierto, acabo de agregar el código de Python para mi experimento.
Vladislavs Dovgalecs