我正在构建一个协方差矩阵,我想用它来模拟来自多变量截断正态分布的随机值,使用来自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.我试图找出问题所在。任何有关这方面的帮助都会受到很多赞赏!