简体   繁体   English

错误:sigma必须为正定

[英]error: sigma must be positive definite

I am trying to create truncated multivariate normal r.vector with sigma that depends on some random vector z. 我试图创建截断的多变量正常r.vector与sigma取决于一些随机向量z。 Since initially sigma (in my code called nn) is not positive definite, i used function make.positive.definite() and then i got nn to be positive definite (and symmetric). 由于最初sigma(在我的代码中称为nn)不是正定的,我使用函数make.positive.definite()然后我得到nn是肯定的(和对称的)。

But in calling rtmvnorm i get the following error: 但在调用rtmvnorm我收到以下错误:

"Error in checkSymmetricPositiveDefinite(sigma) -sigma must be positive definite". “checkSymmetricPositiveDefinite(sigma)-sigma中的错误必须是肯定的”。

Any idea what might be wrong? 知道什么可能是错的吗?

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")

Your problem is related to machine precision. 您的问题与机器精度有关。 Your matrix is positive definite after transformation, however you used different precision tolerance level in make.positive.definite than the one used in internal rtmvnorm checks. 变换后的矩阵是正定的,但是在make.positive.definite使用的精度容差级别与内部rtmvnorm检查中使用的精度容差级别不同。

With your example: 用你的例子:

is.positive.definite(nn)
[1] TRUE

However: 然而:

det(nn)
[1] 0

So any function using det() to get determinant of your matrix will see it as non positive definite. 因此,任何使用det()获取矩阵行列式的函数都将其视为非正定。 You can overcome this by making sure your det(nn) returns a positive value. 您可以通过确保det(nn)返回正值来克服这一问题。

One way is to add some variance in all directions: 一种方法是在各个方向上添加一些方差:

nn <- nn + diag(ncol(nn))*0.01
det(nn)
[1] 9.98501e-253

Now rtmvnorm works. 现在rtmvnorm工作。

If you want to use make.positive.definite() you have to change the tolerance: 如果要使用make.positive.definite() ,则必须更改公差:

nn <- make.positive.definite(nn, tol=1e-3)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM