将不确定性纳入pymc3模型

时间:2017-05-23 18:19:21

标签: statistics pymc3

我有一组数据,其中我有每个点的平均值,标准偏差和观察次数(即,我对测量的准确性有所了解)。在传统的pymc3模型中,我只关注手段,我可​​能会做以下几点:

x = data['mean']

with pm.Model() as m:
    a = pm.Normal('a', mu=0, sd=1)
    b = pm.Normal('b', mu=1, sd=1)
    y = a + b*x

    eps= pm.HalfNormal('eps', sd=1)
    likelihood = pm.Normal('likelihood', mu=y, sd=eps, observed=x)

将有关观测方差的信息纳入模型的最佳方法是什么?显然,结果应该比高方差(不太确定)的观察更重要地对低方差观测进行加权。

统计学家建议的一种方法是做以下事情:

x = data['mean']   # mean of observation
x_sd = data['sd']  # sd of observation
x_n = data['n']    # of measures for observation
x_sem = x_sd/np.sqrt(x_n)

with pm.Model() as m:
    a = pm.Normal('a', mu=0, sd=1)
    b = pm.Normal('b', mu=1, sd=1)
    y = a + b*x

    eps = pm.HalfNormal('eps', sd=1)
    obs = mc.Normal('obs', mu=x, sd=x_sem, shape=len(x))
    likelihood = pm.Normal('likelihood', mu=y, eps=eps, observed=obs)

然而,当我跑步时,我得到:

TypeError: observed needs to be data but got: <class 'pymc3.model.FreeRV'>

我正在运行pymc3的主分支(3.0有一些性能问题,导致采样时间非常慢)。

1 个答案:

答案 0 :(得分:4)

你很亲密,你只需做一些小改动。主要原因是PyMC3数据总是不变的。请检查以下代码:

with pm.Model() as m:
    a = pm.Normal('a', mu=0, sd=1)
    b = pm.Normal('b', mu=1, sd=1)
    mu = a + b*x

    mu_est = pm.Normal('mu_est', mu, x_sem, shape=len(x))

    likelihood = pm.Normal('likelihood', mu=mu_est, sd=x_sd, observed=x)

请注意,我保持数据不变,并在两点引入观察到的不确定性:估计mu_est和可能性。当然,您可以不使用x_semx_sd而是估算它们,就像您在代码中使用变量eps一样。

在历史记录中,带有“随机数据”的代码用于处理PyMC3(至少对于某些型号而言),但鉴于它并非真正设计为以这种方式工作,开发人员决定阻止用户使用随机数据,这解释了你得到的信息。