问题描述
我想通过 MCMC 采样来估计多元正态分布的参数。棘手的部分是协方差矩阵。我知道传统的先验选择是逆愿望先验(或精度矩阵的愿望先验)。但是,我不知道该给谁使用。当我尝试估计多元正态分布的参数时,MHadaptive 会崩溃,因为 sigma 不是正定的。我也用不同的采样器尝试过,但最终还是遇到了同样的问题。以下是我迄今为止尝试过的其他一些事情:
使用带有 cholesky 参数化的逆心愿图并估计 U
的上三角。然后sigma=t(U)%*%U
。这不会导致正定问题,但它也不起作用。
改用精度矩阵,这也没有解决问题。
当然,我也尝试过只估计Sigma的上三元并重建Sigma,使其对称。然而,它仍然不是正定的。
这是我的代码:
library(mvtnorm)
library(MHadaptive)
#data
x <- rmvnorm(100,c(20,65,-44),diag(3))
#define the log prior
logprior <- function(parvect){
logprior <- LaplacesDemon::dinvwishart(matrix(parvect[1:9],3,byrow=TRUE),diag(3),log=TRUE) +
dnorm(parvect[10],100000,log=TRUE) +
dnorm(parvect[11],log=TRUE) +
dnorm(parvect[12],log=TRUE)
return(logprior)
}
#define the log likelihood
LL <- function(parvect,data){
LL <- sum(mvtnorm::dmvnorm(data,parvect[10:12],matrix(parvect[1:9],log=TRUE))
return(LL)
}
LL_reg <- function(parvect,data){
LL <- LL(parvect = parvect,data=data)
logPrior <- logprior(parvect = parvect)
LL_reg <- LL+logPrior
return(LL_reg)
}
#inits etc.
df_params <- data.frame(name = c( "covmat[1,1]","covmat[1,2]",3]","covmat[2,"covmat[3,"mean[1]","mean[2]","mean[3]"),min = c(rep(-Inf,12)),max = c(rep(Inf,init=c(as.vector(t(cov(x))),colMeans(x)))
Metro_Hastings(li_func = LL_reg,pars = df_params$init,par_names = df_params$name,data=x)
解决方法
既然你知道似然和先验,为什么不试试 Rstan 来得到估计呢?定义 cov_matrix 或直接将方差-协方差矩阵放在多正态函数的方差部分会限制为 p.d.