火车等待时间的贝叶斯建模:模型定义


12

这是我从常驻人员那里进行贝叶斯数据分析的第一次尝试。我阅读了A. Gelman撰写的Bayesian Data Analysis中的许多教程和一些章节。

作为第一个或多或少独立数据分析示例,我选择了火车等待时间。我问自己:等待时间的分布是什么?

该数据集在博客上提供,并且在PyMC之外进行了稍有不同的分析。

我的目标是给定这19个数据条目,估计预期的火车等待时间。

我建立的模型如下:

μN(μ^,σ^)

σ|N(0,σ^)|

λΓ(μ,σ)

ρPoisson(λ)

其中μ^是数据平均值,σ^是数据标准偏差乘以1000。

我使用泊松分布将预期的等待时间建模为ρ。此分布的速率参数是使用Gamma分布建模的,因为它是与Poisson分布的共轭分布。超先验μσ分别使用正态分布和半正态分布建模。使标准偏差σ尽可能宽,以使其尽可能不被置信。

我有很多问题

  • 这个模型对任务是否合理(几种可能的建模方法?)?
  • 我有没有犯任何新手错误?
  • 是否可以简化模型(我倾向于使简单的事情复杂化)?
  • 如何验证rate参数()的后验是否确实适合数据?ρ
  • 如何从拟合的泊松分布中抽取一些样本以查看样本?

在经过5000个Metropolis步骤后,后继者看起来像这样: 轨迹图

我也可以发布源代码。在模型拟合阶段,我使用NUTS 执行参数和的步骤。然后在第二步中对速率参数进行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()

这是一个很好的问题,但我建议您编辑标题:您的问题与软件无关,并且似乎更多有关评估模型。您甚至可能希望将其分割为单独的相关问题。
肖恩·复活节

@SeanEaster谢谢!它实际上与软件有关,尽管我同意该标题。我准备根据请求添加源代码,因为它可以讲述更完整的故事,但也可能使问题变得更庞大且可能更令人困惑。随意编辑标题,因为我想到的只是一般的名称。
弗拉迪斯拉夫(Vladislavs Dovgalecs)

我同意。我认为这确实是两个问题。我试图回答建模问题。
jaradniemi '16

Answers:


4

我会先告诉你我会怎么做,然后我会回答你的具体问题。

我会做什么(至少最初是这样)

这是我从您的帖子中收集的信息,您有19个观察值的训练等待时间,并且您对推断预期的等待时间感兴趣。

我将定义为是等待时间列车。我没有理由将这些等待时间设为整数,因此我将假定它们是正的连续量,即。我假设实际上已观察到所有等待时间。Wii=1,,19iWiR+

有几种可能的模型假设可以使用,通过19个观察,可能很难确定哪种模型更合理。一些示例是对数正态,伽马,指数,威布尔。

作为第一个模型,我建议建模,然后假设 通过这种选择,您可以使用现有的大量正常理论,例如共轭先验。共轭先验是正反伽马分布,即 其中是反伽马分布。或者,您可以使用默认的先验在这种情况下,后验也是正反伽马分布。Yi=log(Wi)

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

由于,我们可以通过从和的后验分布中提取联合样本和来回答有关预期等待时间的问题,这是正态倒数-γ分布,然后为每个样本计算。这是从后部采样的预期等待时间。E[Wi]=eμ+σ/2μσ2eμ+σ/2

回答你的问题

  • 这个模型对任务是否合理(几种可能的建模方法?)?

泊松似乎不适用于可能是非整数值的数据。您只有一个,因此您无法了解已分配给的伽马分布的参数。换句话说,您已经建立了一个层次模型,但是数据中没有层次结构。λλ

  • 我有没有犯任何新手错误?

请参阅以前的评论。

另外,如果您的数学和代码一致,这将真正有帮助,例如,MCMC结果中的在哪里?您的代码中的sd和rate是多少?λ

您的事前记录不应该取决于数据。

  • 是否可以简化模型(我倾向于使简单的事情复杂化)?

是的,应该这样。请参阅我的建模方法。

  • 如何验证rate参数()的后验是否确实适合数据?ρ

是不是应该是你的数据?您是说吗?要检查的一件事是确保样本平均等待时间相对于平均等待时间的后验分布有意义。除非您有一个奇怪的先验,否则样本平均值应该在后验分布的峰值附近。ρλ

  • 如何从拟合的泊松分布中抽取一些样本以查看样本?

我相信您需要后验预测分布。对于MCMC中的每个迭代,请插入该迭代的参数值并进行采样。


万分感谢!我很快就读了你的答案。我将需要一些时间来消化它,找到一些发行版和概念的参考并尝试在PyMC中实现它。顺便说一句,我只是为实验添加了Python代码。
弗拉迪斯拉夫(Vladislavs Dovgalecs)'16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.