2016-10-27 1 views
5

Я начинаю изучать Стэна.Стэн. Использование 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); 
} 
} 

Я думаю, что целевая линия увеличивает целевое значение, что я думаю, что это логарифм задней плотности.
Но задняя плотность для какого параметра?

Когда оно обновляется и инициализируется?

После того, как Стэн заканчивает (и сходится), как вы получаете доступ к его значению и как я его использую?

Другие примеры:

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__ в заднем, но будьте осторожны, так как в нем также содержатся якобианцы, возникающие из ограничений и капли констант в операторах выборки --- вы не хотите использовать его для сравнения модели.

С точки зрения выборки, написание

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

имеет тот же эффект, как

y ~ normal(mu, sigma); 

В _lpdf сигналов это функция плотности вероятности журнала для нормального, что подразумевается в обозначениях выборки. Обозначение сэмплирования является просто сокращением для синтаксиса target + = и, кроме того, снижает постоянные члены в плотности журнала.

Это объясняется в разделе инструкций справочника по языку (вторая часть руководства) и используется в нескольких примерах с помощью руководства программиста (первая часть руководства).

+0

Спасибо за подробное объяснение. Почему синтаксис y ~ не использует добавление, но цель + = делает? – skan

+0

А как насчет использования двух линий «target + =» в одной и той же модели? Некоторые примеры делают это. – skan

+0

Плотность журнала - текущая сумма, а цель + = просто увеличивает ее. У вас может быть столько операторов, сколько вы хотите, и столько же заданий + =, сколько хотите. –

Смежные вопросы