PyMC3 中的条件先验

Conditional prior in PyMC3

我正在尝试构建一个模型,其中分配给分布的先验值取决于特定值,而该值是另一个被抽样的变量。例如,正确回答问题的学生根据概率为 p 的伯努利试验建模。如果学生有给定的先决条件(他们自己是模型的一部分),p 应该从 Beta(20,5) 中提取。如果不是,p 应该从 Beta(5,20) 中提取。

我使用以下代码在 PyMC2 中运行它:

# prior for thetas - same for all students
lambda1 = pymc.Beta('lambda1',alpha=20,beta=5) 
#top-level node - one for each student
theta1 = []
for i in range(num_students):
    theta1.append(pymc.Bernoulli('theta1_%i' % i, p=lambda1, plot=False))

lambda2 = [
    pymc.Beta('lambda2_0', alpha=5,beta=20),
    pymc.Beta('lambda2_1', alpha=20,beta=5)
]
lambda2_choices = []
theta2 = []
for i in range(num_students):
    @pymc.deterministic(name='lambda2_choice_%i'%(i), plot=False)
    def lambda2_choice(theta1 = theta1[i],
                     lambda2 = lambda2):
        if theta1 == False:
            return lambda2[0]
        elif theta1 == True:
            return lambda2[1]
    lambda2_choices.append(lambda2_choice) 
    theta2.append(pymc.Bernoulli('theta2_%i' % i,p=lambda2_choice))    

换句话说,分配给伯努利随机变量的先验是一个确定性函数,returns 一个随机变量取决于某个其他值的 SAMPLED 值,在本例中为 theta1[i].

我不知道如何在 PyMC3 中执行此操作,因为 @deterministic 装饰器不再存在并且确定性函数必须具有 input/output 作为 Theano 变量。

非常感谢任何见解或建议!!

在这里你可以使用:

pymc3.switch(theta[i], lambda2[1], lambda2[0])