在 stan 中定义自己的非信息性先验

机器算法验证 事先的 斯坦 无信息先验 杰弗里斯之前
2022-04-11 20:24:19

在具有未知均值和方差的正态分布数据的简单情况下,杰弗里的先验由下式给出

p(μ,σ2)=1σ2.
如何在 Stan 语言中定义这样的先验,即如何更改下面的模型语句以获得所需的结果?(现在的模型声明是针对先前的p(μ,σ2)1.

data {
 int<lower=0> n; // obs in group x
 real x[n];
}
parameters {
 real muX;
 real<lower=0> sigmaSquared;
 real postPred;
}
transformed parameters
{
 real<lower=0> sigmaX;
 sigmaX <- sqrt(sigmaSquared);
}
model {
 x ~ normal(muX, sigmaX);
 postPred ~ normal(muX, sigmaX);
}
1个回答

您可以使用该函数在 Stan 语言中定义适当或不适当的先验,该increment_log_prob()函数会将其输入添加到 Metropolis 步骤中使用的累积对数后验值,以决定是否接受或拒绝参数提议。

在您的示例中,模型块需要包含新行 increment_log_block(-log(sigmaSquared)); 但是,有些人(例如 Jaynes)认为 Jeffreys 先验仅适用于比例参数,在这种情况下,您可以根据标准偏差(sigmaX ) 而不是方差 (sigmaSquared)。此外,我假设您尝试从 的后验预测分布中提取x应该在一个generated quantities块中。将所有三个部分放在一起,它看起来像: data { int<lower=0> n; // obs in group x real x[n]; } parameters { real muX; real<lower=0> sigmaX; } model { x ~ normal(muX, sigmaX); increment_log_prob(-log(sigmaX)); } generated quantities { real postPred; postPred <- normal_rng(muX, sigmaX); }