web-dev-qa-db-ja.com

スタン。ターゲット+ =構文の使用

私はスタンを学び始めています。

誰かが...のような構文をいつどのように使用するかを説明できますか?

target +=

ただの代わりに:

y ~ normal(mu, sigma)

たとえば、Stanのマニュアルには、次の例があります。

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

上記の例では、ターゲットを1回ではなく2回使用しています。

もう一つの例。

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〜」の2つの異なる方法で書かれた簡単な例を誰かが提供できますか?

よろしく

18
skan

構文

target += u;

ターゲットログ密度にuを追加します。

ターゲット密度は、サンプラーがサンプリングする密度であり、一定までのデータが与えられた場合、すべてのパラメーターの同時密度に等しい必要があります(これは通常、パラメーターの同時密度としてコーディングし、モデル化することによりベイズの定理によって達成されます定数までのデータ)。後部でlp__としてアクセスしますが、制約から生じるヤコビアンも含まれ、サンプリングステートメントで定数を削除するため注意してください---モデルの比較には使用しないでください。

サンプリングの観点から、

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

と同じ効果があります

y ~ normal(mu, sigma);

_lpdfは、それが法線の対数確率密度関数であることを示します。これは、サンプリング表記に暗黙的に含まれています。サンプリング表記は、ターゲット+ =構文の省略形であり、さらに、ログ密度の定数項を削除します。

これは、言語リファレンスのステートメントセクション(マニュアルの第2部)で説明されており、プログラマーズガイド(マニュアルの第1部)を通じて複数の例で使用されています。

29
Bob Carpenter