【问题标题】:error: sigma must be positive definite错误:sigma 必须是正定的
【发布时间】:2014-11-27 17:58:29
【问题描述】:

我正在尝试使用取决于某个随机向量 z 的 sigma 创建截断的多元正态 r.vector。由于最初的 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")

【问题讨论】:

  • 不知道,但也许你可以试试Matrix::nearPD,用ensureSymmetry=TRUE 代替?
  • 它似乎没有帮助,假设我以正确的方式使用 nearPD...

标签: r matrix


【解决方案1】:

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

【讨论】:

  • 这是一个很好的答案,非常感谢您花时间解释!
猜你喜欢
  • 1970-01-01
  • 2017-03-19
  • 2014-12-13
  • 2018-02-18
  • 2014-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-19
相关资源
最近更新 更多