1

我正在尝试建立一个模型,其中分配给分布的先验取决于特定值,并且该值是另一个被采样的变量。例如,根据概率 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))    

换句话说,分配给伯努利随机变量的先验是一个确定性函数,它根据某个其他值的 SAMPLED 值返回一个随机变量,在本例中为 theta1[i]。

我无法弄清楚如何在 PyMC3 中执行此操作,因为 @deterministic 装饰器不再存在,并且确定性函数必须将输入/输出作为 Theano 变量。

我真的很感激任何见解或建议!

4

1 回答 1

0

在这里您可以使用:

pymc3.switch(theta[i], lambda2[1], lambda2[0])
于 2015-11-19T14:19:42.380 回答