Bayesian

火車等待時間的貝葉斯建模:模型定義

  • April 12, 2016

這是我第一次嘗試讓來自常客陣營的人進行貝葉斯數據分析。我閱讀了 A. Gelman 的 Bayesian Data Analysis 的許多教程和幾章。

作為我選擇的第一個或多或少獨立的數據分析示例是火車等待時間。我問自己:等待時間的分佈是怎樣的?

該數據集在博客上提供,在 PyMC 之外進行了略微不同的分析。

我的目標是根據這 19 個數據條目估計預期的火車等待時間。

我建立的模型如下:

在哪裡是數據均值和是數據標準差乘以 1000。

我將預​​期的等待時間建模為使用泊松分佈。該分佈的速率參數使用 Gamma 分佈建模,因為它是泊松分佈的共軛分佈。超先驗和分別用正態分佈和半正態分佈建模。標準差盡可能寬泛,盡可能不承諾。

我有一堆問題

  • 這個模型對於任務是否合理(幾種可能的建模方式?)?
  • 我犯了任何初學者的錯誤嗎?
  • 模型可以簡化嗎(我傾向於把簡單的事情複雜化)?
  • 如何驗證速率參數的後驗是否() 實際上是擬合數據嗎?
  • 如何從擬合的泊松分佈中抽取一些樣本來查看樣本?

5000 Metropolis 步後的後驗是這樣的: 跟踪圖

我也可以發布源代碼。在模型擬合階段,我執行參數的步驟和使用堅果。然後在第二步中,我為速率參數做 Metropolis. 最後,我使用內置工具繪製了軌跡。

我將非常感謝任何能讓我掌握更多概率編程的評論和評論。可能還有更多值得嘗試的經典例子嗎?


這是我使用 PyMC3 在 Python 中編寫的代碼。數據文件可以在這裡找到。

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()

我會先告訴你我會做什麼,然後我會回答你的具體問題。

我會做什麼(至少在最初)

這是我從您的帖子中收集到的信息,您有 19 次觀察的訓練等待時間,並且您有興趣推斷出預期的等待時間。

我會定義為了成為火車的等待時間. 我看不出這些等待時間應該是整數的理由,所以我假設它們是正連續量,即. 我假設實際上觀察到了所有的等待時間。

有幾種可能的模型假設可以使用,並且通過 19 次觀察,可能很難確定哪個模型更合理。一些例子是對數正態、伽馬、指數、威布爾。

作為第一個模型,我建議建模然後假設

有了這個選擇,您就可以獲得大量現有的正規理論,例如共軛先驗。共軛先驗是正態逆伽馬分佈,即

在哪裡是逆伽馬分佈。或者,您可以使用默認的先驗在這種情況下,後驗也是正態逆伽馬分佈。 自從,我們可以通過抽取聯合樣本來回答關於預期等待時間的問題和從他們的後驗分佈,這是一個正態逆伽馬分佈,然後計算對於這些樣本中的每一個。這從後部對預期的等待時間進行採樣。

回答您的問題

  • 這個模型對於任務是否合理(幾種可能的建模方式?)?

泊松似乎不適用於可能是非整數值的數據。你只有一個因此您無法學習分配給的伽馬分佈的參數. 另一種說法是,您已經建立了層次模型,但數據中沒有層次結構。

  • 我犯了任何初學者的錯誤嗎?

見之前的評論。

此外,如果您的數學和您的代碼一致,這將非常有幫助,例如在哪裡在您的 MCMC 結果中?您的代碼中的 sd 和 rate 是什麼?

您的先驗不應依賴於數據。

  • 模型可以簡化嗎(我傾向於把簡單的事情複雜化)?

是的,它應該。請參閱我的建模方法。

  • 如何驗證速率參數的後驗是否() 實際上是擬合數據嗎?

不是嗎應該是你的數據?你的意思是? 要檢查的一件事是確保樣本平均等待時間相對於平均等待時間的後驗分佈有意義。除非你有一個奇怪的先驗,否則樣本平均值應該接近後驗分佈的峰值。

  • 如何從擬合的泊松分佈中抽取一些樣本來查看樣本?

我相信你想要一個後驗預測分佈。對於 MCMC 中的每次迭代,您插入該迭代的參數值並進行採樣。

引用自:https://stats.stackexchange.com/questions/206904

comments powered by Disqus