我开始学习斯坦。
有人可以解释何时以及如何使用语法,例如......?
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);
}
上面的示例使用目标两次而不是一次。
另一个例子。
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 :(得分:23)
语法
target += u;
将u添加到目标日志密度。
目标密度是采样器采样的密度,它需要等于所有参数的联合密度,给定数据达到常数(通常通过编码为贝叶斯规则来实现)参数和模拟数据的联合密度达到常数)。你可以在后面以lp__的形式访问它,但要小心,因为它还包含由约束产生的雅可比行列式并在采样语句中删除常量 - 你不想用它来进行模型比较。
从抽样的角度来看,写作
target += normal_lpdf(y | mu, sigma);
与
具有相同的效果y ~ normal(mu, sigma);
_lpdf表示它是法线的对数概率密度函数,这在采样表示法中是隐含的。采样符号只是目标+ =语法的简写,此外,还会在对数密度中删除常量项。
在语言参考的语句部分(手册的第二部分)中进行了解释,并通过程序员指南(手册的第一部分)在多个示例中使用。
答案 1 :(得分:2)
我才刚刚开始学习Stan和贝叶斯统计,并且主要依靠John Kruschke的书"Doing Bayesian Data Analysis"。在第14.3.3章中,他解释了:
因此,Stan中的计算本质是处理对数 后验概率密度及其梯度;没有 直接从分布中随机抽取参数。
结果(仍然改写克鲁施克),
模型[...],例如
y ∼ normal(mu,sigma)
[精算]表示将当前后验概率乘以基准值y处的正态分布密度。
按照对数计算规则,该乘法等于将给定数据y
的对数概率密度与当前对数概率相加。 ({log(a*b) = log(a) + log(b)
,因此乘法和和等于)。
我承认我没有完全理解它的含义,但是我认为从数学上来说,targer +=
指向正确的方向。