当非常小的特征值时,不能得到正定方差矩阵

joe*_*lme 6 statistics r matrix eigenvalue

要运行Canonical对应分析(cca包ade4),我需要一个正定方差矩阵.(理论上总是如此)但是:

matrix(c(2,59,4,7,10,0,7,0,0,0,475,18714,4070,97,298,0,1,0,17,7,4,1,4,18,36),nrow=5)
> a
     [,1] [,2]  [,3] [,4] [,5]
[1,]    2    0   475    0    4
[2,]   59    7 18714    1    1
[3,]    4    0  4070    0    4
[4,]    7    0    97   17   18
[5,]   10    0   298    7   36

> eigen(var(a))
$values
[1]  6.380066e+07  1.973658e+02  3.551492e+01  1.033096e+01
[5] -1.377693e-09
Run Code Online (Sandbox Code Playgroud)

最后本征值是-1.377693e-09,其是<0但理论框架值为> 0
如果本征值中的一个是我不能运行功能<0

我真的不知道如何解决这个问题而不改变函数cca()的代码

感谢帮助

G. *_*eck 3

这里有两种方法:

V <- var(a)

# 1
library(Matrix)
nearPD(V)$mat

# 2 perturb diagonals
eps <- 0.01
V + eps * diag(ncol(V))
Run Code Online (Sandbox Code Playgroud)