假设我有一个数据集,由两个具有二进制观测值的子集组成。子集具有相同的比例但不同的长度。基于固定的 Beta 先验和这两个二项式似然分布,我想生成 p 的两个后验分布。然后,我将收集估计集中的均值 p。我不想构建两个不同的模型,而是想在单个模型下完成所有推论。下面您可以看到 PyMC3 模型:
with pm.Model() as single_model:
data = [[1, 0, 1, 1, 0, 0, 0, 0], [0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1]]
estimations = []
p = pm.Beta('p', alpha=1, beta=1)
for i in data:
y = pm.Binomial('y', n=1, p=p, observed=i)
trace = pm.sample(500)
estimations.append(trace['p'].mean())
当我运行代码时,它会引发如下错误:
ValueError: Variable name y already exists.
我尝试在像
shape=len(data)
这样的似然度内定义形状参数,但它不起作用。如何在同一模型中生成多个估计?
你可以做
data = [1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1]
idx = np.repeat([0, 1], [7, 17])
with pm.Model() as single_model:
p = pm.Beta('p', alpha=1, beta=1, shape=2)
y = pm.Binomial('y', n=1, p=p[idx], observed=data)
idata = pm.sample()
或
data = [[1, 0, 1, 1, 0, 0, 0, 0], [0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1]]
with pm.Model() as single_model:
p = pm.Beta('p', alpha=1, beta=1, shape=2)
y0 = pm.Binomial('y0', n=1, p=p[0], observed=data[0])
y1 = pm.Binomial('y1', n=1, p=p[1], observed=data[1])
idata = pm.sample()
作为一般规则,不要使用 for 循环,而使用矢量化版本。另外,PyMC3 不再维护,请使用 PyMC 代替。