Este es mi primer intento para alguien que viene del campo frecuentista de hacer análisis de datos bayesianos. He leído varios tutoriales y algunos capítulos de Bayesian Data Analysis de A. Gelman.
El primer ejemplo de análisis de datos más o menos independiente que he elegido es el de los tiempos de espera de los trenes. 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 forma ligeramente diferente y fuera de PyMC.
Mi objetivo es estimar los tiempos de espera esperados del tren a partir de esos 19 datos.
El modelo que he construido es el siguiente:
$\mu \sim N(\hat\mu,\hat\sigma)$
$\sigma \sim |N(0,\hat\sigma)|$
$\lambda \sim \Gamma(\mu,\sigma)$
$\rho \sim Poisson(\lambda)$
donde $\hat\mu$ es la media de los datos y $\hat\sigma$ es la desviación estándar de los datos multiplicada por 1000.
He modelado el tiempo de espera previsto como $\rho$ utilizando la distribución de Poisson. El parámetro de tasa para esta distribución se modela utilizando la distribución Gamma, ya que es una distribución conjugada a la distribución Poisson. Los hiperprecios $\mu$ y $\sigma$ se modelaron con las distribuciones Normal y Seminormal, respectivamente. La desviación estándar $\sigma$ se hizo lo más amplio posible para ser lo menos comprometido posible..
Tengo un montón de preguntas
- ¿Es este modelo razonable para la tarea (varias formas posibles de modelar?)?
- ¿He cometido algún error de principiante?
- ¿Se puede simplificar el modelo (tiendo a complicar las cosas sencillas)?
- ¿Cómo puedo verificar si la posterior para el parámetro de la tasa ( $\rho$ ) se ajusta realmente a los datos?
- ¿Cómo puedo extraer algunas muestras de la distribución de Poisson ajustada para ver las muestras?
Los posteriors después de 5000 pasos de Metrópolis se ven así:
También puedo publicar el código fuente. En la etapa de ajuste del modelo hago los pasos para los parámetros $\mu$ y $\sigma$ usando NUTS. Luego, en el segundo paso, hago Metrópolis para el parámetro de la tasa $\rho$ . Por último, trazo la huella utilizando las herramientas incorporadas.
Estaría muy agradecido por cualquier observación y comentario que me permita comprender mejor la programación probabilística. ¿Quizás haya más ejemplos clásicos con los que merezca 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()
0 votos
Una buena pregunta, pero te sugiero que edites el título: Tus preguntas son más bien agnósticas con respecto al software, y parecen más sobre la evaluación del modelo. Tal vez incluso quieras dividirla en preguntas separadas y relacionadas.
0 votos
@SeanEaster ¡Gracias! En realidad está relacionado con el software, aunque estoy de acuerdo en lo del título. Estoy dispuesto a añadir el código fuente a petición, ya que cuenta una historia más completa, pero también podría hacer la pregunta más voluminosa y potencialmente más confusa. Siéntete libre de editar el título ya que no se me ocurre nada más genérico.
0 votos
Estoy de acuerdo. Creo que en realidad son dos preguntas. Traté de responder a la(s) pregunta(s) de modelado.