stan - 难度矢量化

时间:2017-10-20 13:16:59

标签: r stan rstan

我有:

  

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行。但是,它给了我

的错误
  

不匹配:

     

真实[]〜正常(矩阵,真实)

如果可能,我如何向我的当前解决方案进行矢量化?还有其他方法可以加快速度吗?

1 个答案:

答案 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);