rtmvnorm()中的模拟协方差矩阵在使用吉布斯采样时产生NA

时间:2015-05-20 08:58:27

标签: r matrix covariance na

我正在构建一个协方差矩阵,我想用它来模拟来自多变量截断正态分布的随机值,使用来自R中rtmvnorm()包的tmvtnorm函数。这里的值被截断在1.0之间和10.0。

到目前为止,我已经设法构造了一个对称的协方差矩阵,后来被强制确定为不确定的情况。但是,当我使用rtmvnorm()函数和我的cov矩阵(' sigma')时,我无法使用Gibbs采样,因为这会产生NA。

经过一些试验错误后,我发现只有当我使用cor.sd = 1的cov矩阵作为输入时才会出现此问题,该输入通过使用强制为肯定的确定:

#function to create cov-var matrix sigma, where sd of correlations between distributions can be either 0 or 1.   
sig <- function(cor.mean, cor.sd, n, s2T){ 
if (cor.sd == 0){
c <- c(rep(cor.mean, n*n)) #creating correlation vector where correlations are equal
sigma <- matrix(c,n,n)
diag(sigma) <- 1
 }
if (cor.sd > 0){
c <- c(rnorm((n*(n-1))/2, mean = cor.mean, sd = cor.sd)) #creating correlation vector with varying correlations for one halve of matrix
sigma <- diag(n)
sigma[lower.tri(sigma, diag=F)] <- c
sigma <- forceSymmetric(sigma, "L") #creating symmetric cor matrix  
 }
s <- c(rep(sqrt(s2T), n)) #vector with SD for each test
D = diag(s)
sigma = D%*%sigma%*%D   #creating covariance matrix from correlation matrix & sd
return(list(first = as.matrix(sigma), second = c(mean(c), sd(c))))
}

#creating cov-var matrix
sigma <- sig(.7,1,8,1.5)$first    
sigma <- as.matrix(nearPD(sigma)$mat)
  a = c(rep(1.0, 8))
  b = c(rep(10.0, 8))
  mean = rnorm(8, 6.5, 1.5)
  t <- rtmvnorm(10, mean, sigma, lower = a, upper = b, algorithm = "gibbs")
  t
           [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
  [1,] 5.667528  Inf  NaN  NaN  NaN  NaN  NaN  NaN
  [2,]      NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
  [3,]      NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
  [4,]      NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
  [5,]      NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
  [6,]      NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
  [7,]      NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
  [8,]      NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
  [9,]      NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
 [10,]      NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN

或者,在rtmvnorm()中使用拒绝抽样(这是默认的抽样方法),我得到了可接受的接受率,但也出现了以下错误信息:

pmvnorm(lower = a, upper = b, mean = mean, sigma = sigma)
[1] 0.8911258
attr(,"error")
[1] 0.002500692
attr(,"msg")
[1] "Completion with error > abseps"

不幸的是,我不确定这个abseps代表什么,以及我自己降低它是否合适,因为我的接受率非常高。 总的来说,使用rtmvnorm()和我的协方差矩阵似乎出错了,其中分布之间相关性的sd等于1.我试图找出问题所在。任何有关这方面的帮助都会受到很多赞赏!

0 个答案:

没有答案