Stan. 使用 target += 语法

36

我开始学习Stan。

有人能解释一下如何使用...这样的语法吗?

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

上面的例子使用了两次target而不是一次。

另一个例子。

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~”方式分别编写,谢谢。

谢谢!


您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - IRTFM
8
我的问题只是“如何以及为什么使用target +=?”。 其余的内容只是一些例子和解释。 - skan
那么,请不要在不相关的语言和包含中添加无关材料和标签。 - IRTFM
好的,已删除标签。 - skan
2个回答

51

语法

target += u;

将"u"加到目标对数密度中。

目标密度是采样器从中采样的密度,它需要等于给定数据下所有参数的联合密度的常数倍(通常通过Bayes规则编码为参数和建模数据的联合密度来实现)。在后验中,您可以通过lp__访问它,但要小心,因为它还包含由约束引起的Jacobian并且在采样语句中删除常量——您不希望将其用于模型比较。

从采样的角度来看,写作:

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

具有相同的效果,就像

y ~ normal(mu, sigma);

_lpdf表示正态分布的对数概率密度函数,在抽样符号中隐含。抽样符号只是目标+=语法的简写,并且在对数密度中省略常数项。

这在语言参考手册的语句部分(手册的第二部分)中有解释,并在程序员指南(手册的第一部分)中的多个示例中使用。


感谢您的详细解释。为什么 y ~ 语法不使用加法,而目标 += 却使用了呢? - skan
1
在同一模型中使用两个“target +=”行怎么样?有些示例这样做。 - skan
5
对数密度是一个持续的总和,target += 语句只是增加它。您可以有任意数量的 ~ 语句和 target += 语句。 - Bob Carpenter
7
+= 符号遵循通常的编程语言约定(尽管变量目标是内置的),而抽样语句符号则遵循 BUGS 和统计符号约定。 - Bob Carpenter
“target +=”版本在处理离散变量时总是必需的,因为这是将它们边缘化的唯一方法,不是吗? - skan
这也是一个有用的资源:https://mc-stan.org/docs/2_29/reference-manual/increment-log-prob.html - gimi

5
我刚开始学习Stan和贝叶斯统计,主要依靠John Kruschke的书"Doing Bayesian Data Analysis"。在第14.3.3章节中,他解释道:
因此,在Stan中进行计算的本质是处理后验概率密度及其梯度的对数;没有直接从分布中随机抽样参数。
因此(仍在重新表述Kruschke),一个如y∼normal(mu,sigma)的模型实际上意味着将当前的后验概率乘以数据值y处正态分布的密度。
根据对数计算规则,这个乘法等于将给定数据y的对数概率密度加到当前的对数概率中。(log(a*b)=log(a)+log(b),因此乘法和求和相等)。
我承认我没有完全理解其全部含义,但我认为它指向了正确的方向,就数学而言,targer += 是做什么的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接