我正在尝试将一些代码从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]
}
但它们都不起作用。有什么建议吗?
答案 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]));
}