r - 当特征值非常小时,无法得到正定协方差矩阵

标签 r matrix eigenvalue statistics

要运行规范对应分析(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

最后一个特征值是-1.377693e-09,它<0。但理论值>0。
如果特征值之一为 < 0

,我无法运行该函数

我真的不知道如何在不更改函数 cca() 代码的情况下解决这个问题

感谢帮助

最佳答案

您可以稍微更改输入,以使矩阵为正定。

如果有方差矩阵,则可以截断特征值:

correct_variance <- function(V, minimum_eigenvalue = 0) {
  V <- ( V + t(V) ) / 2
  e <- eigen(V)
  e$vectors %*% diag(pmax(minimum_eigenvalue,e$values)) %*% t(e$vectors)
}
v <- correct_variance( var(a) )
eigen(v)$values
# [1] 6.380066e+07 1.973658e+02 3.551492e+01 1.033096e+01 1.326768e-08

使用奇异值分解,您可以直接使用a做同样的事情。

truncate_singular_values <- function(a, minimum = 0) { 
  s <- svd(a)
  s$u %*% diag( ifelse( s$d > minimum, s$d, minimum ) ) %*% t(s$v)
}
svd(a)$d
# [1] 1.916001e+04 4.435562e+01 1.196984e+01 8.822299e+00 1.035624e-01
eigen(var( truncate_singular_values(a,.2) ))$values
# [1] 6.380066e+07 1.973680e+02 3.551494e+01 1.033452e+01 6.079487e-09

但是,这会将您的矩阵 a 更改最多 0.1,这是很多 (我怀疑它那么高,因为矩阵 a 是正方形:因此, var(a) 的特征值之一正好为 0。)

b <- truncate_singular_values(a,.2)
max( abs(b-a) )
# [1] 0.09410187

我们实际上可以通过添加一些噪音来做得更好。

b <- a + 1e-6*runif(length(a),-1,1)  # Repeat if needed
eigen(var(b))$values
# [1] 6.380066e+07 1.973658e+02 3.551492e+01 1.033096e+01 2.492604e-09

关于r - 当特征值非常小时,无法得到正定协方差矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16859899/

相关文章:

Python 线性方程 - 高斯消元法

c - xGEHRD 和 xHSEQR 例程中 WORK 数组的维数在特征值计算中是否应该相等?

r - h2o.deeplearning 中的意外预测

R (spatstat) : Built-In Functions Not Evaluating to Desired Limit

r - 解码十六进制表示的字符串

c++ - 2x2 自邻(埃尔米特)矩阵的对角化

python - 计算大矩阵特征值的最快方法

R sf ggplot 标记 ID 中列出的多个多边形

python - 如何在 NumPy 中连接两个一维数组?

c - 当使用双指针传递二维矩阵来打印函数时,它打印矩阵零的最后一个元素