我试图用sigma创建截断的多元正态r.vector,它取决于一些随机向量z。由于最初sigma(在我的代码中称为nn)不是正定的,我使用函数make.positive.definite()
然后我得到nn是正定的(和对称的)。
但在调用rtmvnorm
时,我收到以下错误:
“checkSymmetricPositiveDefinite(sigma)-sigma中的错误必须是肯定的”。
知道可能出现什么问题吗?
library(tmvtnorm)
library(matrixcalc)
library(corpcor)
zmean <- rep(0, 100)
zSigma <- diag(100)
z <- rmvnorm(n=1, mean=zmean, sigma=zSigma)
umean <- rep(0, 100)
usigma <- exp(-0.5 * rep(1, 100) + z)
nn <- t(usigma) %*% usigma
is.positive.definite(nn)
nn <- make.positive.definite(nn)
is.positive.definite(nn)
isSymmetric(nn)
a <- rep(0,100)
b <- rep(+Inf, 100)
U <- rtmvnorm(n=1, mean=umean, sigma=nn, lower=a, upper=b, algorithm="gibbs")
答案 0 :(得分:7)
您的问题与机器精度有关。转换后矩阵是正定的,但是make.positive.definite
中使用的精度容差级别与内部rtmvnorm
检查中使用的精度容差级别不同。
用你的例子:
is.positive.definite(nn)
[1] TRUE
然而:
det(nn)
[1] 0
因此,使用det()
来获得矩阵行列式的任何函数都会将其视为非正定。您可以通过确保det(nn)
返回正值来克服此问题。
一种方法是在所有方向上添加一些差异:
nn <- nn + diag(ncol(nn))*0.01
det(nn)
[1] 9.98501e-253
现在rtmvnorm
有效。
如果您想使用make.positive.definite()
,则必须更改容差:
nn <- make.positive.definite(nn, tol=1e-3)