当我看到一些奇怪的事情时,我正试图在R中计算 OLS 回归。当且仅当行列式为 0 时方阵的逆不存在。此外,矩阵必须是满秩的。
所以不确定以下如何可能:
> dim(X)
[1] 20000 51
> det(t(X) %*% X)
[1] 3.863823e+161 #non-zero
> solve(t(X) %*% X)
Error in solve.default(t(X) %*% X) :
system is computationally singular: reciprocal condition number = 3.18544e-17
当我们知道行列式不为零时,为什么在尝试计算逆时solve()会抛出错误?我在这里想念什么?
检查矩阵是否具有满秩:
> qr(t(X) %*% X)$rank
[1] 51
但是为了进一步测试,我将其中一个 X 列重新分配给另一个相同的值:
> X[,2] = X[,3]
因此,X 矩阵的两列现在是相同的。
> qr(t(X) %*% X)$rank
[1] 50
我们现在可以确认X'X矩阵不是满秩的。
> det(t(X) %*% X)
[1] 1.634637e+138
但是行列式还是不等于0?这怎么可能,我错过了什么?