2

我正在尝试估计 Rstan 中的贝叶斯层次模型,并希望在我的模型中包含一个多元偏态正态分布。这不是 Stan 中已经定义的分布,但文档似乎表明可以使用 Cholesky 因子来实现它。例如,Stan 2.15.0 文档在第 333-334 页上说:

“根据标准正态变量对多元正态分布的重新参数化可以扩展到其他多元分布,这些分布可以被概念化为多元正态的污染,例如多元学生 t 和偏斜多元正态分布。”

有谁知道如何实际做到这一点?我考虑过自己在 Stan 中实现偏斜多元法线,但看起来并没有一个很好的封闭形式的分布可以直接实现......

4

1 回答 1

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 函数的工作方式非常相似。您可以将其移植到您的functions{}块中。然后在你的 stan 程序中(我假设 cov 矩阵chol()是一个参数)

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,并为简洁起见进行了解释,并希望捕捉到使其工作所需的重要部分。

于 2017-05-10T18:43:16.700 回答