2017-10-20 59 views
1

我:斯坦 - 難度矢量化

mu_x - 實際值

的10×10矩陣

p型 - 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的行,爲此,滿足條件。然而,它給了我

號的錯誤匹配:

真正[]〜NORMAL(矩陣,實)

我怎樣才能向量化我目前的解決方案,如果可能的話?有沒有其他方法可以加快速度?

回答

1

當您使用多個索引(如[ptype,sender_name_type])時,斯坦語不會變平。 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); 
+0

謝謝,這是非常有益的。 – user2089357