2017-09-12 32 views
2

我正在寻找一个模型来估计与Stan有关的二项数据的多个概率。我对每种概率都使用了Beta测试版,但我一直在阅读关于使用hyperpriors来收集信息并鼓励估计收缩的文章。与Stan有关的分层模型的超级启发

我已经看到了这个例子来定义pymc的hyperprior,但我不知道怎么做类似的事情斯坦

@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,然后被用作前公测参数。

任何人都可以给我任何关于如何做与斯坦类似的指针吗?

+1

该手册包含如何建立分层和multilvel模型(你在说什么关于这里)的例子很多。我们的先验的基本建议是在回归手工章,也该wiki页面:https://github.com/stan-dev/stan/wiki/Prior-Choice-Recommendations –

+1

也有分层模型的案例研究,特别是一个直接有关的对比hyperpriors为二项式与回归只有一个拦截(的结果是,你可能不希望使用的β-二项式或狄氏-multinomials)的二元变量:HTTP:// MC-斯坦。组织/用户/文档/案例研究/池二进制试验。html –

+0

@BobCarpenter看起来真的很有帮助 - 谢谢。我正在为AB测试做这件事,对于更复杂的测试,我认为在回归框架中工作会更有意义。能够像在案例研究中一样排列变体,对于将结果传达给同事也很有用。 –

回答

0

以下意见中的建议我不确定我会采用这种方法,但作为参考,我认为我至少应该回答我在斯坦如何完成这个问题的答案。

经过一番询问Stan Discourses和进一步调查后,我发现解决方案是设置自定义密度分布并使用target +=语法。因此,相当于为例子斯坦为pymc是:

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) 
    ... 
} 
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 > LL可以是一个小的常数或更合理的给你的知识ab

你应该小心,因为这不会识别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 web site(案例研究目录扩展的例子是目前链接在用户选项卡的文档链接下)。