我有一组数据,其中我有每个点的平均值,标准偏差和观察次数(即,我对测量的准确性有所了解)。在传统的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有一些性能问题,导致采样时间非常慢)。
答案 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_sem
或x_sd
而是估算它们,就像您在代码中使用变量eps
一样。
在历史记录中,带有“随机数据”的代码用于处理PyMC3(至少对于某些型号而言),但鉴于它并非真正设计为以这种方式工作,开发人员决定阻止用户使用随机数据,这解释了你得到的信息。