我有一个 300 多列的 data.frame,无论我如何分解它,我每次都会收到这个错误:
Error in solve.default(cv) :
Lapack routine dgesv: system is exactly singular: U[107,107] = 0
我尝试打破数据框并在其上运行vlf(),然后删除结果为无穷大的因素,但我已经多次这样做(每次都有一个较小的数据集)并且没有运气。有没有更好的方法来判断哪些因素导致了问题?
我有一个 300 多列的 data.frame,无论我如何分解它,我每次都会收到这个错误:
Error in solve.default(cv) :
Lapack routine dgesv: system is exactly singular: U[107,107] = 0
我尝试打破数据框并在其上运行vlf(),然后删除结果为无穷大的因素,但我已经多次这样做(每次都有一个较小的数据集)并且没有运气。有没有更好的方法来判断哪些因素导致了问题?
您可以使用特征分解来查找消失的列的线性组合,然后删除参与这些线性组合的足够多的列。
这是一个具有消失列线性组合的矩阵:
> M <- matrix(c(0, 0, 0, 1, 0, 1, 0, 1, 1, 1, -1, 0), nrow=4, byrow=TRUE)
> M
[,1] [,2] [,3]
[1,] 0 0 0
[2,] 1 0 1
[3,] 0 1 1
[4,] 1 -1 0
如果列的线性组合消失,那么如果我切断矩阵的底部使其成为正方形,情况也是如此:
> sM <- M[1:3, ]
> sM
[,1] [,2] [,3]
[1,] 0 0 0
[2,] 1 0 1
[3,] 0 1 1
现在计算特征值和特征向量:
> eigen(sM)
$values
[1] 1.618034 -0.618034 0.000000
$vectors
[,1] [,2] [,3]
[1,] 0.0000000 0.0000000 0.5773503
[2,] 0.5257311 0.8506508 0.5773503
[3,] 0.8506508 -0.5257311 -0.5773503
所以有一个零特征值,这是我们预期的,它对应于列线性组合:
因此,删除其中一列将产生一个完整的列秩矩阵。