2016-10-27 22 views
5

Zaczynam uczyć się Stana.Stan. Używanie celu + = składnia

Czy ktoś może wyjaśnić, kiedy i jak używać składni, takiej jak ...?

target += 

zamiast po prostu:

y ~ normal(mu, sigma) 

Na przykład w podręczniku Stan można znaleźć następujący przykład.

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

Myślę, że linia docelowa zwiększa wartość docelową, którą uważam za logarytm gęstości tylnej.
Ale gęstość tylna dla jakiego parametru?

Kiedy jest aktualizowany i inicjalizowany?

Po tym, jak Stan kończy (i konwerguje), w jaki sposób uzyskujesz dostęp do jego wartości i jak z niej korzystam?

Inne przykłady:

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

powyższym przykładzie wykorzystuje celu dwukrotnie, a nie tylko raz.

inny przykład.

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

Ten ostatni przykład nawet miesza obie metody.

Aby zrobić to jeszcze trudniejsze Czytałem, że

y ~ normal(0,1); 

ma ten sam efekt niż

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

Czy ktoś może wyjaśnić dlaczego, proszę?

Czy ktokolwiek mógłby podać prosty przykład napisany na dwa różne sposoby, z "target + =" i prostszym sposobem "y ~"?

Pozdrowienia

+0

Jest oczywiste, że masz szeroki zestaw pytań dotyczących ostatecznego dojścia do użycia rstanu, ale powinieneś najpierw nauczyć się STAN i dopiero po tym należy pomyśleć o rozszerzeniu tej perspektywy na tłumaczenie na inne syntaktyczne środowisko programistyczne . Zawęź pytanie, jeśli nie chcesz go zamknąć. –

+0

Moje pytanie brzmi "Jak i dlaczego używać target + =?" . Reszta to tylko przykłady i objaśnienia. – skan

+0

Tak więc, nie należy dołączać obcej substancji i znaczników do języków i pakietów, które nie są kwestionowane. –

Odpowiedz

13

składnia

target += u; 

dodaje u gęstości dziennika cel.

Gęstość docelowa to gęstość, z której próbki próbnika muszą być równe gęstości połączeń wszystkich parametrów z danymi do stałej (która jest zwykle uzyskiwana za pomocą reguły Bayesa przez kodowanie jako gęstość połączenia parametrów i danych modelowanych do stałej). Uzyskujesz dostęp do niego jako lp__ w odcinku tylnym, ale uważaj, ponieważ zawiera on także jakobianów wynikających z ograniczeń i stałych kropli w instrukcjach próbkowania --- nie chcesz go używać do porównania modeli.

Z perspektywy próbkowania, pisanie

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

ma taki sam efekt jak

y ~ normal(mu, sigma); 

sygnałów _lpdf Jest to funkcja gęstości prawdopodobieństwa dziennika dla normalnego, co jest ukryte w notacji próbkowania. Notacja próbkowania jest tylko skrótem dla składowej docelowej + =, a ponadto powoduje spadek stałych warunków w gęstości logarytmicznej.

Zostało to wyjaśnione w części instrukcji w odnośniku do języka (druga część instrukcji) i użyte w wielu przykładach w przewodniku programisty (pierwsza część instrukcji).

+0

Dzięki za dokładne wyjaśnienie. Dlaczego składnia y ~ nie używa dodawania, ale cel + = robi? – skan

+0

A co z wykorzystaniem dwóch linii "target + =" w tym samym modelu? Niektóre przykłady to robią. – skan

+0

Gęstość kłód jest ciągłą sumą, a cel + = tylko ją zwiększa. Możesz mieć tyle instrukcji, ile chcesz i tyle instrukcji docelowych + =, ile chcesz. –

Powiązane problemy