我正在尝试使用依赖于一些随机向量 z 的 sigma 创建截断的多元正态 r.vector。由于最初的 sigma(在我的代码中称为 nn)不是正定的,我使用了函数 make.positive.definite()
然后我得到了 nn 是正定的(并且是对称的)。
但是在调用 rtmvnorm
时,我收到以下错误:
知道可能有什么问题吗?
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")
最佳答案
您的问题与机器精度有关。您的矩阵在转换后是正定的,但是您在 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)
关于r - 错误 : sigma must be positive definite,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27176595/