使用 Stan 的分层模型的 Hyperpriors

Hyperpriors for hierarchical models with Stan

我正在寻找拟合模型来估计 Stan 的二项式数据的多重概率。我对每个概率都使用 beta 先验,但我一直在阅读有关使用超先验来汇集信息并鼓励估计收缩的信息。

我看过这个在 pymc 中定义超先验的例子,但我不确定如何用 Stan 做类似的事情

@pymc.stochastic(dtype=np.float64)
def beta_priors(value=[1.0, 1.0]):
    a, b = value
    if a <= 0 or b <= 0:
        return -np.inf
    else:
        return np.log(np.power((a + b), -2.5))

a = beta_priors[0]
b = beta_priors[1]

然后将 a 和 b 用作 beta 先验的参数。

任何人都可以告诉我如何用 Stan 完成类似的事情吗?

按照评论中的建议,我不确定我是否会遵循这种方法,但作为参考,我认为我至少 post 回答了我关于如何在 Stan 中完成的问题.

在询问 Stan Discourses 并进一步调查后,我发现解决方案是设置自定义密度分布并使用 target += 语法。所以 pymc 的例子的 Stan 的等价物是:

parameters {
  real<lower=0> a;
  real<lower=0> b;
  real<lower=0,upper=1> p;
  ...
}

model {
  target += log((a + b)^-2.5);

  p ~ beta(a,b)
  ...
}

要正确规范化,您需要帕累托分布。例如,如果你想要一个分布p(a, b) ∝ (a + b)^(-2.5),你可以使用

a + b ~ pareto(L, 1.5);

其中 a + b > L。无法通过支持所有大于或等于零的值来标准化密度——它需要一个有限的 L 作为下限。讨论了仅使用此先验作为单纯形的分层先验的计数组件。

如果 ab 是参数,它们可以都被约束为正数,或者您可以让 a 不受约束并声明

real<lower = L - a> b;

投保 a + b > L。根据您对 ab 的了解,L 可以是一个小常数或更合理的值。

你应该小心,因为这不会识别 a + b。我们将此构造用作单纯形的分层先验:

parameters {
  real<lower = 1> kappa;
  real<lower = 0, upper = 1> phi;
  vector<lower = 0, upper = 1>[K] theta;

model {
  kappa ~ pareto(1, 1.5);  // power law prior
  phi ~ beta(a, b);  // choose your prior for theta
  theta ~ beta(kappa * phi, kappa * (1 - phi));  // vectorized

我的 Stan 案例研究中有一个关于重复二元试验的扩展示例,可以从 Stan web site 上的案例研究页面访问(案例研究目录目前 link 在文档下编辑link 来自用户选项卡)。