如何在单个 PyMC3 模型下基于多重似然和恒定先验生成多个后验分布?

问题描述 投票:0回答:1

假设我有一个数据集,由两个具有二进制观测值的子集组成。子集具有相同的比例但不同的长度。基于固定的 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)
这样的似然度内定义形状参数,但它不起作用。如何在同一模型中生成多个估计?

python pymc3 pymc
1个回答
0
投票

你可以做

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 代替。

© www.soinside.com 2019 - 2024. All rights reserved.