使用Stan

时间:2017-09-12 09:50:46

标签: bayesian pymc stan

我正在寻找一个模型来估算Stan的二项式数据的多个概率。我每个概率都使用beta先验,但我一直在阅读使用超级驱动程序来汇集信息并鼓励估算缩减。

我已经看过这个例子来定义pymc中的hyperprior,但是我不知道如何用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做类似事情的指示吗?

2 个答案:

答案 0 :(得分:1)

要正确地将其标准化,您需要帕累托分布。例如,如果您想要分发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。根据您对La的了解,b可以是一个小常数或更合理的东西。

您应该小心,因为这不会识别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的案例研究页面获得(案例研究目录目前链接在用户选项卡的文档链接下)。

答案 1 :(得分:0)

根据评论中的建议我不确定我是否会遵循这种方法,但作为参考,我想我至少会回答我在斯坦如何实现这个问题的答案。

在询问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)
  ...
}