使用 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
作为下限。讨论了仅使用此先验作为单纯形的分层先验的计数组件。
如果 a
和 b
是参数,它们可以都被约束为正数,或者您可以让 a
不受约束并声明
real<lower = L - a> b;
投保 a + b > L
。根据您对 a
和 b
的了解,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 来自用户选项卡)。
我正在寻找拟合模型来估计 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
作为下限。讨论了仅使用此先验作为单纯形的分层先验的计数组件。
如果 a
和 b
是参数,它们可以都被约束为正数,或者您可以让 a
不受约束并声明
real<lower = L - a> b;
投保 a + b > L
。根据您对 a
和 b
的了解,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 来自用户选项卡)。