考虑下面的Stan脚本,我正在通过RStan使用它:
data {
int K; //outcome classes
int N; //rows
int D; //input dimensions
int y[N];
matrix[N, D] X;
real days[N];
}
parameters {
matrix[D, K] C;
matrix[D, K] B;
}
model {
matrix[N, K] pred = X*C + days*X*B; //If I remove days, it works fine.
to_vector(pred) ~ normal(0, 5);
for (n in 1:N)
y[n] ~ categorical_logit(pred[n]');
}
一个不理想的解决方案是复制R中的days列,使其成为一个矩阵,可以用于矩阵乘法。但这真的有必要吗?应该很容易通过标量值“缩放”矩阵。
错误是:
编辑:我也把日子塑造成一个矩阵
matrix[N,1] days[N]
。虽然这确实通过了“scrub”,但由于维度不匹配,它在编译时会被拒绝。
Edit2:我已经调整了代码,现在可以执行了。但我很困惑为什么这个嵌套的for循环是必要的。应该有一种简单的方法将所有向量元素乘以相同的标量值。
data {
int K; //outcome classes, 3
int N; //num rows
int D; //input dimensions, 5
int Y[N];
matrix[N,D] X;
int days[N];
}
parameters {
matrix[D, K] C; //[5,3]
matrix[D, K] B; //[5,3]
}
model {
for (n in 1:N){
vector[K] pred;
vector[D] ipt;
matrix[K,K] day_diag;
for (i in 1:K){
for (j in 1:K){
if (i == j)
day_diag[i,j] = days[n];
else
day_diag[i,j] = 0;
}
}
ipt = X[n]'; // now row_vector [1xD]
// [D,K] x [1,D] + [D,K] x [1,D]
pred = C * ipt + B * (day_diag * ipt);
Y[n]~categorical_logit(pred);
}
}