2017-10-20 4 views
1

J'ai:stan - difficulté vectorisation

mu_x - une matrice 10x10 de valeurs réelles

ptype - un 10000 à long vecteur

sender_name_type - un 10000 à long vecteur

Je voudrais trouver les valeurs de

x_real - 10000 un vecteur à long

Le code que j'ai actuellement, et travaille, est:

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); 
    } 
} 

Je voudrais cependant à vectoriser. Pour ce faire, je dois d'abord traiter de la clause if. Pour ce faire, j'ai essayé simplement d'ajouter deux distributions, comme ceci:

x_real ~ normal(mu_x[ptype,sender_name_type],0.1) * (1-x_avaiable) + normal(x,0.01) * x_available; 

Cependant, Rstan semble gérer ne pas ajouter/multiplier les distributions. La deuxième approche que j'ai essayé était comme ceci:

x_real ~ normal(mu_x[ptype,sender_name_type],0.1); 
x_real[x_available == 1] ~ normal(x,0.01); 

est similaire à la première approche, mais il redéfinit les lignes de x_real, dont la condition est remplie. Cependant, il me donne l'erreur de

Aucun élément correspondant à:

réelle [] ~ normal (matrice, réel)

Comment puis-je vectoriser ma solution actuelle, si possible? Y a-t-il d'autres façons de l'accélérer?

Répondre

1

Le langage Stan ne s'aplatit pas lorsque vous utilisez plusieurs index comme [ptype,sender_name_type]. Le langage Stan ne prend pas non plus en charge l'indexation par condition logique, telle que [x_available == 1].

La façon de faire quelque chose comme ceci est la boucle pour mettre en place les arguments, puis évaluer la probabilité en une étape pour éviter des allocations de mémoire inutiles. Dans votre cas, cela ressemblerait à

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

Merci, c'était très utile. – user2089357