2017-05-09 127 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中解脱出来,并且为了简洁起见,希望能够捕捉到使其工作所需的重要部分。