2017-09-12 34 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(案例研究目錄擴展的例子是目前鏈接在用戶選項卡的文檔鏈接下)。