2

我正在尝试将一些代码从 JAGS 迁移到 Stan。假设我有以下数据集:

N <- 10 
nchoices <- 3
ncontrols <- 3
toydata <- list("y" = rbinom(N, nchoices - 1, .5), 
                "controls" = matrix(runif(N*ncontrols), N, ncontrols), 
                "N" = N, 
                "nchoices" = nchoices,
                "ncontrols" = ncontrols)

并且我想使用以下代码运行多项 logit(取自文档的第 9.5 节):

data {
  int N;
  int nchoices;
  int y[N];
  int ncontrols;
  vector[ncontrols] controls[N];
}

parameters {
  matrix[nchoices, ncontrols] beta;
}

model {
  for (k in 1:nchoices)
    for (d in 1:ncontrols)
      beta[k,d] ~ normal(0,100);
  for (n in 1:N)
    y[n] ~ categorical(softmax(beta * controls[n]));
}

我现在想将第一行修复beta为零。在 JAGS 中,我只需在模型块中声明

for (i in 1:ncontrols) {
   beta[1,i] <- 0 
}

但我不确定如何在 Stan 中执行此操作。我已经按照文档(部分已知参数)第 6.2 节的内容尝试了许多组合,例如,

parameters {
  matrix[nchoices, ncontrols] betaNonObs;
}

transformed parameters {
  matrix[nchoices, ncontrols] beta;
  for (i in 1:ncontrols) beta[1][i] <- 0
  for (k in 2:nchoices) beta[k] <- betaNonObs[k - 1]
}

但它们都不起作用。有什么建议么?

4

1 回答 1

4

提及错误消息会很有帮助。在这种情况下,如果 beta 被声明为一个矩阵,那么你想要的语法就是 R-like 语法

beta[1,i] <- 0.0; // you also omitted the semicolon 

为了回答您更广泛的问题,我相信您的最后一种方法是正确的。我将在名为 free_beta 的参数块中创建一个参数矩阵,并将这些元素复制到在名为 beta 的模型块中声明的另一个矩阵,该矩阵在顶部有一个额外的行用于固定零。像

data {
  int N;
  int nchoices;
  int y[N];
  int ncontrols;
  vector[ncontrols] controls[N];
}

parameters {
  matrix[nchoices-1, ncontrols] free_beta;
}

model {
  // copy free beta into beta
  matrix[nchoices,ncontrols] beta;
  for (d in 1:ncontrols)
    beta[1,d] <- 0.0;
  for (k in 2:nchoices)
    for (d in 1:ncontrols)
      beta[k,d] <- free_beta[k-1,d];

  // priors on free_beta, which execute faster this way
  for (k in 1:(nchoices-1))
    row(free_beta,k) ~ normal(0.0, 100.0);

  // likelihood
  for (n in 1:N)
    y[n] ~ categorical(softmax(beta * controls[n]));
}
于 2012-10-21T11:30:46.860 回答