错误:sigma必须是肯定的

时间:2014-11-27 17:58:30

标签: r matrix

我试图用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")

1 个答案:

答案 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)