0

第一次使用斯坦。 我从 Coursera 课程中找到的一个示例开始,他们正在使用我试图在 Stan 中重新实现的 JAGS。课程免费旁听,我已链接相关讲座。

模型背景:

(我不知道如何使用 LaTeX,所以我会尽可能地对其进行格式化):
该模型是一个混合模型,其中输入是具有潜在类n的实数向量。2他们假设这些类是Z_1 ~ N(mu_1, stdev)and Z_2 ~ N(mu_2, stdev)(它是 2 个 Normals 的混合,具有不同mu的 's 但相同stdev)。他们假设一个统一的 Dirichlect 先验与 alpha=1在每个类别中的概率。

每个数据点都是从基于概率向量的分类分布中提取的,它们使用相应的正态似然增加似然性。

我的代码

model_code_coursera = """
data {
    int<lower=1> N;         //Num Samples
    int<lower=1> K;         //Num classes
    real y[N];              //Input which we are trying to assign to each class
} parameters {
    simplex[K] probs;       //Prob of being in each class
    vector[K] mu;           //Center of each class
    real<lower=0> prec;
    vector<lower=0, upper=K>[N] z; //Array of classes ****(option 1)****
    int<lower=0, upper=K>[N] z;  // Array of classes ****(option 2)****
} model {
    probs ~ dirichlet(rep_vector(1,K));
    prec ~ gamma(1/2, 2/2);
    for (k in 1:K)
        mu[k] ~ normal(-1+2*(k-1), 1/100);
    for (n in 1:N) {
        z[n] ~ categorical(probs);
        y[n] ~ normal(mu[z[n]], prec);
    }
}
"""

当我使用选项 1 时出现错误,

No matches for: 
  real ~ categorical(vector)
Available argument signatures for categorical:
  int ~ categorical(vector)

这是有道理的,因为分类的输出是一个 int。

但是,当我做有意义的事情并将 z 定义为整数向量时,正如我在 Stan 备忘单中看到的那样,我得到了一个不同的错误(选项 2)

    10:     int<lower=0, upper=K>[N] z;  // Array of classes
                                ^
    11: } model {
  -------------------------------------------------

PARSER EXPECTED: <identifier>
4

1 回答 1

0

Stan 不直接支持整数参数。要实现问题中描述的各种正常混合模型,必须将离散参数边缘化。在Stan 用户指南的混合模型章节中有如何做到这一点的解释。好处是混合在没有离散参数的情况下要好得多,并且期望的推论更精确。

于 2020-05-05T16:38:02.553 回答