2017-10-20 17 views
1

를 벡터화 어려움은 내가 가진 :스탠 -

mu_x을 - 실제 값

의 10 × 10 행렬을

p- 형 - 10000 긴 벡터

sender_name_type - 10000 긴 벡터

의 값을 찾고 싶습니다.
,451,515,

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

[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