2016-10-27 8 views
5

Stan을 배우기 시작했습니다.스탠. target + = 구문 사용

누구든지 다음과 같은 구문을 사용할시기와 방법을 설명 할 수 있습니까? 대신의

target += 

는 :

y ~ normal(mu, sigma) 

스탠 설명서에 예를 들어, 당신은 다음의 예를 찾을 수 있습니다.

model { 
real ps[K]; // temp for log component densities 
sigma ~ cauchy(0, 2.5); 
mu ~ normal(0, 10); 
for (n in 1:N) { 
for (k in 1:K) { 
ps[k] = log(theta[k]) 
+ normal_lpdf(y[n] | mu[k], sigma[k]); 
} 
target += log_sum_exp(ps); 
} 
} 

대상 선이 목표 값을 증가 시키므로 사후 밀도의 대수라고 생각합니다.
그러나 어떤 매개 변수에 대한 사후 밀도?

언제 업데이트되고 초기화됩니까?

Stan이 끝나고 (수렴하면) 그 값과 사용 방법은 어떻게 접근합니까?

다른 예 :

data { 
    int<lower=0> J;   // number of schools 
    real y[J];    // estimated treatment effects 
    real<lower=0> sigma[J]; // s.e. of effect estimates 
} 
parameters { 
    real mu; 
    real<lower=0> tau; 
    vector[J] eta; 
} 
transformed parameters { 
    vector[J] theta; 
    theta = mu + tau * eta; 
} 
model { 
    target += normal_lpdf(eta | 0, 1); 
    target += normal_lpdf(y | theta, sigma); 
} 

예시하면 상기 타겟을 사용하는 대신 두 번만.

다른 예.

data { 
int<lower=0> N; 
vector[N] y; 
} 
parameters { 
real mu; 
real<lower=0> sigma_sq; 
vector<lower=-0.5, upper=0.5>[N] y_err; 
} 
transformed parameters { 
real<lower=0> sigma; 
vector[N] z; 
sigma = sqrt(sigma_sq); 
z = y + y_err; 
} 
model { 
target += -2 * log(sigma); 
z ~ normal(mu, sigma); 
} 

이 마지막 예도 두 가지 방법을 혼합합니다.

은 더욱 어렵게 내가

y ~ normal(0,1); 

, 왜 아무도 설명 할 수

increment_log_prob(normal_log(y,0,1)); 

보다 같은 효과를하십시오 가지고 읽었습니다 할까?

누구나 "target + ="와 두 가지 다른 방식으로 작성된 간단한 예제를 제공 할 수 있습니까? 더 간단한 "y ~"방식으로 알려주십시오.

안부

+0

rstan을 사용하는 시점에 대해 궁금한 점이 많지만 STAN을 먼저 배우고 해당 구문을 다른 구문 프로그래밍 환경으로 변환하는 방법에 대해 생각해보아야 만합니다 . 닫히지 않으려면 질문의 범위를 좁히십시오. –

+0

내 질문에 그냥 "어떻게 사용하는 대상 + =?" . 나머지는 단지 예와 설명 일뿐입니다. – skan

+0

그런 다음 문제가되지 않는 언어 및 패키지에는 관련없는 자료 및 태그를 포함하지 마십시오. –

답변

13

target += u; 

대상 로그 밀도 U 추가 구.

목표 밀도는 샘플러가 샘플링하는 밀도이며 상수까지 데이터가 주어진 모든 매개 변수의 조인트 밀도와 같아야합니다 (일반적으로 접합 밀도로 코딩하여 베이 즈 규칙을 통해 달성됩니다 매개 변수와 모델링 된 데이터를 상수까지). 후방에서 lp__로 접근하지만 조심해야합니다. 제약 조건에서 발생하는 Jacobians과 샘플링 문에서 상수를 떨어 뜨리기 때문에 모델 비교에 사용하지 않으려 고합니다.

target += normal_lpdf(y | mu, sigma); 

쓰는 샘플링 관점에서

y ~ normal(mu, sigma); 

는 샘플링 표기 내재적 인 통상의 로그 확률 밀도 함수 년대 _lpdf 신호와 동일한 효과를 갖는다. 샘플링 표기법은 target + = 구문의 약식이며, 로그 밀도에서 상수항을 삭제합니다.

언어 참조 (설명서의 두 번째 부분)의 문 섹션에서 설명하고 프로그래머 용 가이드 (설명서의 첫 번째 부분)를 통해 여러 예제에 사용됩니다.

+0

철저히 설명해 주셔서 감사합니다. y ~ 구문이 추가를 사용하지 않지만 대상 + =이 사용하는 이유는 무엇입니까? – skan

+0

그리고 동일한 모델에서 두 개의 "target + ="행을 사용하면 어떨까요? 몇 가지 예가 있습니다. – skan

+0

로그 밀도는 진행중인 합계이고 target + =은 단지 증가시킵니다. 원하는만큼 많은 ~ 문을 가질 수 있으며, 원하는만큼 많은 target + = 문을 가질 수 있습니다. –