将不确定性纳入 pymc3 模型

Incorporating uncertainty into a pymc3 model

我有一组数据,每个点都有平均值、标准差和观察次数(即,我知道测量的准确性)。在我只看手段的传统 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'>

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

你已经很接近了,你只需要做一些小的改变。主要原因是对于 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 所做的那样。

根据历史记录,带有 "random data" 的代码曾经在 PyMC3 上工作(至少对于某些模型),但考虑到它并不是真正设计成那样工作的,开发人员决定阻止用户使用随机数据,这就解释了您收到的消息。