我试图估计Rstan中的贝叶斯分层模型,并希望在我的模型中包含多变量偏差正态分布。这不是已经在Stan中定义的分布,但是文档似乎表明可以使用Cholesky因子来实现它。例如,Stan 2.15.0文档在pp.333-334上说:
"根据标准正态变量对多元正态分布的重新参数化可以扩展到其他多变量分布,这些分布可以概念化为多变量法线的污染,例如多变量学生t和偏态多元正态分布"
有没有人知道如何实际做到这一点?我考虑在斯坦自己实现偏差多元正态,但看起来并没有一个很好的封闭形式可以直接实现分发......
答案 0 :(得分: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()
方法中的矩阵来自核心库here中的dp2cpMv函数。您可以将其移植到functions{}
块中。在你的stan程序中你去(我假设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
中解除,并为了简洁起见,并希望捕获使其工作所需的重要部分。