斯坦.使用target + =语法

ska*_*kan 14 bayesian stan

我开始学习斯坦.

任何人都可以解释何时以及如何使用...等语法?

target +=
Run Code Online (Sandbox Code Playgroud)

而不只是:

y ~ normal(mu, sigma)
Run Code Online (Sandbox Code Playgroud)

例如,在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);
}
}
Run Code Online (Sandbox Code Playgroud)

我认为目标线增加了目标值,我认为这是后验密度的对数.
但是后验密度是什么参数?

什么时候更新并初始化?

在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);
}
Run Code Online (Sandbox Code Playgroud)

上面的示例使用目标两次而不是一次.

另一个例子.

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);
}
Run Code Online (Sandbox Code Playgroud)

最后一个例子甚至混合了两种方法.

为此我更加难以阅读

y ~ normal(0,1);
Run Code Online (Sandbox Code Playgroud)

具有相同的效果

increment_log_prob(normal_log(y,0,1));
Run Code Online (Sandbox Code Playgroud)

有人可以解释原因吗?

任何人都可以用两种不同的方式提供一个简单的例子,用"target + ="和常规的简单"y~"方式,好吗?

问候

Bob*_*ter 28

语法

target += u;
Run Code Online (Sandbox Code Playgroud)

将u添加到目标日志密度.

目标密度是采样器采样的密度,它需要等于所有参数的联合密度,给定数据达到常数(这通常通过贝叶斯规则通过编码作为参数的联合密度并建模来实现数据达到常数).你可以在后面以lp__的形式访问它,但要小心,因为它还包含由约束产生的雅可比行列式并在采样语句中删除常量 - 你不想用它来进行模型比较.

从抽样的角度来看,写作

target += normal_lpdf(y | mu, sigma);
Run Code Online (Sandbox Code Playgroud)

具有相同的效果

y ~ normal(mu, sigma);
Run Code Online (Sandbox Code Playgroud)

_lpdf表示它是法线的对数概率密度函数,这在采样符号中是隐含的.采样符号只是目标+ =语法的简写,另外,在对数密度中删除常量项.

它在语言参考的语句部分(手册的第二部分)中进行了解释,并通过程序员指南(手册的第一部分)在多个示例中使用.

  • + =符号遵循通常的编程语言约定(尽管内置了变量目标),而采样语句符号遵循BUGS和统计符号. (3认同)
  • 对数密度是一个持续的和,目标+ =只是增加它。您可以根据需要使用〜语句,也可以使用目标+ =语句。 (2认同)

Luk*_*kas 5

我刚刚开始学习Stan和贝叶斯统计,主要依靠John Kruschke的书《Doing Bayesian Data Analysis》。在第 14.3.3 章中,他解释道:

\n
\n

因此,Stan 中计算的本质是处理后验概率密度及其梯度的对数;没有从分布中直接随机采样参数。

\n
\n

结果(仍然改写克鲁施克),

\n
\n

model [...] like y \xe2\x88\xbc normal(mu,sigma)[actually] 意味着将当前后验概率乘以数据值 y 处的正态分布密度。

\n
\n

根据对数计算规则,该乘法等于给定数据的对数概率密度y与当前对数概率相加。(log(a*b) = log(a) + log(b),因此乘法和和相等)。

\n

我承认我没有完全理解其中的含义,但我认为它指出了从数学上讲的正确方向targer +=

\n