我有:
mu_x - 实际值的10x10矩阵
ptype - 一个10000长的载体
sender_name_type - 10000长矢量
我想找到
的值x_real - 10000长矢量
我目前拥有和运作的代码是:
for(i in 1:N){
if(x_available[i]){
x_real[i]~normal(x[i],0.01);} else{
x_real[i]~normal(mu_x[ptype[i],sender_name_type[i]],0.1);
}
}
然而,我想要矢量化它。要做到这一点,我首先需要处理if子句。为此,我尝试添加两个发行版,如下所示:
x_real ~ normal(mu_x[ptype,sender_name_type],0.1) * (1-x_avaiable) + normal(x,0.01) * x_available;
然而,Rstan似乎无法处理添加/乘法分布。我尝试的第二种方法是这样的:
x_real ~ normal(mu_x[ptype,sender_name_type],0.1);
x_real[x_available == 1] ~ normal(x,0.01);
这与第一种方法类似,但它重新定义了符合条件的x_real行。但是,它给了我
的错误不匹配:
真实[]〜正常(矩阵,真实)
如果可能,我如何向我的当前解决方案进行矢量化?还有其他方法可以加快速度吗?
答案 0 :(得分:1)
使用[ptype,sender_name_type]
等多个索引时,Stan语言不会变平。 Stan语言也不支持按逻辑条件编制索引,例如[x_available == 1]
。
执行此类操作的方法是设置参数的循环,然后在一步中评估可能性以避免不必要的内存分配。在你的情况下,它看起来像
vector[N] x_hat;
vector[N] noise;
for (i in 1:N) {
x_hat[i] = x_available[i] ? x[i] : mu_x[ptype[i],sender_name_type[i]];
noise[i] = x_available[i] ? 0.01 : 0.1;
}
target += normal_lpdf(x_real | x_hat, noise);