我正在尝试使用依赖于一些随机向量 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/

10-12 02:16