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

Is it possible to create a hierarchical model in PyMC3 using Categorical random variables?

我正在尝试比较两个模型(example from Jake Vanderplas' blog) using PyMC3, but I can't get my modified code to work (the functions best_theta() and logL() are explained in Jake's blog post, which is available in IPython Notebook 形式):

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))

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

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

我对此进行了快速尝试。然而,这种方法需要做相当多的改变,因为矢量化模型通常更方便。这也揭示了我修复的一个错误 (https://github.com/pymc-devs/pymc3/commit/c784c478aa035b5113e175145df8751b0dea0df3),因此您需要从当前的 master 更新才能工作。

这里是完整的注意事项: https://gist.github.com/anonymous/c1ada3388a40ae767a8d

它似乎还不太奏效,因为结果不尽相同,但这是朝着正确方向迈出的一步。