2017-05-09 61 views
2

我正在嘗試估計Rstan中的貝葉斯分層模型,並且希望在我的模型中包含多元偏斜正態分佈。這不是Stan中已經定義的分佈,但文檔似乎表明可以使用Cholesky因子來實現它。例如,斯坦2.15.0文檔在頁333-334上說:Stan中的多元偏斜正態分佈

「多元正態分佈的標準正態變量重新參數化可以擴展到其他多元分佈,多變量正態分佈,如多元學生t和偏態多變量正態分佈。「

有沒有人有任何想法如何實際做到這一點?我考慮在Stan實施自己的偏多變量正態分佈,但它看起來不像是一個很好的分佈封閉形式,它可以直接執行...

+0

我沒有斯坦代碼,但這可能有幫助:http://www.anstuocmath.ro/mathematics/pdf10/83_96_RVernic.pdf。 –

回答

0

因此sn包具有rmsn函數清楚地顯示出下面的代碼段:

function (n = 1, xi = rep(0, length(alpha)), Omega, alpha, tau = 0, dp = NULL) { 
//.... 
    lot <- dp2cpMv(dp = dp0, family = "SN", aux = TRUE) 
    d <- length(dp0$alpha) 
    y <- matrix(rnorm(n * d), n, d) %*% chol(lot$aux$Psi) 
//.... 
} 

這非常類似於如何mvtnorm::rmvn作品只是矩陣chol()方法來自dp2cpMv功能的核心庫here。您可以將其移植到您的functions{}區塊。而在你斯坦計劃你走(我在chol()假設COV矩陣是一個參數)

functions { 
    // Contains code for your ported cholesky factor 
} 
transformed parameters { 
    matrix[K, J] z; 
    cholesky_factor_corr[K] L_tri = dp2cvClone(...); // Cholesky factor from your function{} block.. 
    beta = foo + (L_tri * z)'; // Assuming foo is baseline parameter representing the mean of dimensionality J*K. 
.... 
} 

parameters { 
    matrix[K, J] beta; //# J levels/groups and K dimensional parameters 
    to_vector(z) ~ normal_pdf(0, 1); 
    .... 
} 

你也可能希望從轉化參數轉變東西阻止數據或轉換的數據塊,如果輸入dp2cvClone()是數據。但你明白了。 代碼的最後一部分從stan手冊section 8.15中解脫出來,並且爲了簡潔起見,希望能夠捕捉到使其工作所需的重要部分。