我正在寻找一个模型来估算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做类似事情的指示吗?
答案 0 :(得分:1)
要正确地将其标准化,您需要帕累托分布。例如,如果您想要分发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
。根据您对L
和a
的了解,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)
...
}