Esta é a minha primeira tentativa de alguém que vem do campo freqüentador fazer análise de dados bayesiana. Li vários tutoriais e alguns capítulos da análise de dados bayesiana de A. Gelman.
Como o primeiro exemplo de análise de dados mais ou menos independente que escolhi, é o tempo de espera dos trens. Eu me perguntei: qual é a distribuição dos tempos de espera?
O conjunto de dados foi fornecido em um blog e foi analisado de forma ligeiramente diferente e fora do PyMC.
Meu objetivo é estimar os tempos de espera esperados dos trens, considerando essas 19 entradas de dados.
O modelo que eu construí é o seguinte:
onde é a média dos dados e é o desvio padrão dos dados multiplicado por 1000.
Eu modelei o tempo de espera estimado como utilizando a distribuição de Poisson. O parâmetro rate para essa distribuição é modelado usando a distribuição Gamma, pois é uma distribuição conjugada à distribuição Poisson. Os hiperpriores e foram modelados com distribuições Normal e Meia-Normal, respectivamente. O desvio padrão foi feito o mais amplo possível para ser o mais não-compromissivo possível.
Eu tenho um monte de perguntas
- Esse modelo é razoável para a tarefa (várias maneiras possíveis de modelar?)?
- Cometi algum erro de iniciante?
- O modelo pode ser simplificado (eu tendem a complicar coisas simples)?
- Como posso verificar se o posterior para o parâmetro rate ( ) está realmente ajustando os dados?
- Como posso tirar algumas amostras da distribuição de Poisson ajustada para ver as amostras?
As partes posteriores após 5000 etapas da Metropolis são assim:
Também posso postar o código fonte. No estágio de ajuste do modelo, eu faço as etapas para os parâmetros e usando NUTS. Depois, na segunda etapa, faço Metropolis para o parâmetro rate . Finalmente, traço o traço usando as ferramentas incorporadas.
Ficaria muito grato por quaisquer comentários e comentários que me permitissem entender uma programação mais probabilística. Pode haver exemplos mais clássicos que valem a pena experimentar?
Aqui está o código que escrevi em Python usando PyMC3. O arquivo de dados pode ser encontrado aqui .
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()