Stan中部分观察到的参数

时间:2012-10-20 01:43:11

标签: stan

我正在尝试将一些代码从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 
}

但我不确定如何在斯坦这样做。我已经尝试了许多组合,就像文档(部分已知参数)的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]
}

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

1 个答案:

答案 0 :(得分:3)

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

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]));
}