Bayesian 斯坦。使用目标+;=语法

Bayesian 斯坦。使用目标+;=语法,bayesian,stan,Bayesian,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]) + no

我开始学斯坦了

谁能解释一下什么时候以及如何使用诸如

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);
}
效果与

increment_log_prob(normal_log(y,0,1));
谁能解释一下原因吗

有谁能提供一个简单的例子,用两种不同的方式编写,分别是“target+=”和常规的更简单的“y~”方式

关于语法

target += u;
将u添加到目标日志密度

目标密度是采样器采样的密度,它需要等于给定数据的所有参数的联合密度,直到一个常数(通常通过贝叶斯规则实现,编码为参数和建模数据的联合密度,直到一个常数)。在后面,您可以将其作为lp_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

从抽样的角度来看,写作

target += normal_lpdf(y | mu, sigma);
具有与相同的效果

y ~ normal(mu, sigma);
_lpdf表示它是正态的对数概率密度函数,这在采样符号中是隐式的。采样表示法只是target+=语法的简写,此外,在日志密度中删除常量项


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

我刚刚开始学习斯坦和贝叶斯统计,主要依赖于约翰·克鲁什克的书。在第14.3.3章中,他解释道:

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

因此(仍用Kruschke的话说),a

类[…]模型
y∼ 正态(mu,sigma)
[实际上]是指将当前后验概率乘以基准值y处正态分布的密度

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


我承认我没有完全理解它的含义,但我认为它指向了正确的方向,从数学上讲,
targetr+=
就是这样做的。

很明显,关于最终使用rstan的问题,你有很多疑问,但是您应该首先学习STAN,并且只有在学习了STAN之后,才应该考虑将该视角扩展到翻译到不同的语法编程环境。如果你不想关闭你的问题,就缩小范围。我的问题是“如何以及为什么使用target+=?”。其余的只是示例和一些解释。因此,不要将无关的材料和标记包含到没有问题的语言和包中。好的,删除标记。感谢您的详细解释。为什么y~语法不使用加法,而target+=使用加法?那么在同一个模型中使用两行“target+=”呢?一些例子可以做到这一点。对数密度是一个持续的总和,而target+=只是增加它。您可以有任意多个~语句和任意多个target+=语句。+=表示法遵循常见的编程语言约定(尽管变量target是内置的),而采样语句表示法遵循bug和统计表示法。
target += normal_lpdf(y | mu, sigma);
y ~ normal(mu, sigma);