Python 是否可以使用分类随机变量在PyMC3中创建分层模型?

Python 是否可以使用分类随机变量在PyMC3中创建分层模型?,python,bayesian,categorical-data,pymc3,Python,Bayesian,Categorical Data,Pymc3,我试图使用PyMC3比较两个模型(来自Jake Vanderplas的博客),但我无法让修改后的代码正常工作(Jake的博客文章中解释了函数best_theta()和logL(),该文章以表格形式提供): 这会引发一个异常,因为变量choice是一个RV对象,而不是一个整数(与PyMC2不同),如中所述。然而,在我的代码中,choice的值对于使其工作非常重要 我的问题是,有没有一种方法可以访问RV选项的值,或者更一般地使用分类随机变量建立一个层次模型(即,使用分类RV的值来计算另一个RV的对数

我试图使用PyMC3比较两个模型(来自Jake Vanderplas的博客),但我无法让修改后的代码正常工作(Jake的博客文章中解释了函数
best_theta()
logL()
,该文章以表格形式提供):

这会引发一个异常,因为变量
choice
是一个RV对象,而不是一个整数(与PyMC2不同),如中所述。然而,在我的代码中,
choice
的值对于使其工作非常重要


我的问题是,有没有一种方法可以访问RV
选项的值,或者更一般地使用分类随机变量建立一个层次模型(即,使用分类RV的值来计算另一个RV的对数可能性)?

我对此进行了快速尝试。然而,这种方法需要改变很多,因为向量化模型通常更方便。这也暴露了一个bug,我修复了这个bug(),所以你需要从当前的主机更新它才能工作

以下是完整的NB:


这似乎还不太管用,因为结果并不完全相同,但这是朝着正确方向迈出的一步。

嘿,谢谢!我喜欢你的解决方案,型号规格比我的更清楚。正如你可能知道的,我只是从PyMC3开始。因此,正如我所知,您可以引用RV对象,就像您在当前MCMC步骤中引用它们的当前值一样,但只能在另一个RV的上下文中引用。换句话说,你的
coefs[choice,:(choice+1)]
代码片段是合法的,因为
coefs
本身就是一个(集合)RV,而我的
indmodel[choice]
代码片段是非法的,因为
indmodel
是一个常规ol'列表。对吗?
degrees = [1, 2, 3]

# best_theta() finds the best set of parameters for a given model
thetas = [best_theta(d) for d in degrees]

n = len(degrees)
prob = np.array([ 1 for _ in degrees ])

# model specs
from pymc3 import Model, Dirichlet, Categorical, DensityDist

with Model() as bfactor:
    choices = Dirichlet('choices', prob, shape=prob.shape[0])

    choice = Categorical('choice', choices)

    indmodel = [0] * len(degrees)
    for i, d in enumerate(degrees):
        # logL() calculates the log-likelihood for a given model
        indmodel[i] = DensityDist('indmodel', lambda value: logL(thetas[i]))

    fullmodel = DensityDist('fullmodel', lambda value: indmodel[choice].logp(value))