繁体   English   中英

错误:sigma必须为正定

[英]error: sigma must be positive definite

我试图创建截断的多变量正常r.vector与sigma取决于一些随机向量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")

您的问题与机器精度有关。 变换后的矩阵是正定的,但是在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)

暂无
暂无

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

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