簡體   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