如何识别奇异回归矩阵中哪些变量是共线的?

机器算法验证 回归 多重共线性 零通胀
2022-04-07 09:05:47

我有一个矩阵,我在其上执行零膨胀回归模型,但它返回一个错误,表明某些变量之间存在共线性

zinf1 = zeroinfl(count ~ origin + variable + gene, data = count_FGT_free, dist = "negbin")
Warning message:
In value[[3L]](cond) :
  Lapack routine dgesv: system is exactly singular: U[590,590] = 0FALSE

确定哪些变量是造成这种情况的最佳方法是什么?

2个回答

您可以将 QR 分解与列旋转一起使用(参见Engler (1997) 的“列旋转的 QR 分解算法的行为”)。如该论文中所述,枢轴通过“最线性独立”对列进行排序。假设我们已经计算了矩阵的秩(这是一个公平的假设,因为通常我们首先需要这样做才能知道它的秩较低),然后我们可以取第一个rank(X)枢轴并且应该得到一个满秩矩阵。

这是一个例子。

set.seed(1)
n <- 50
inputs <- matrix(rnorm(n*3), n, 3)
x <- cbind(
  inputs[,1], inputs[,2], inputs[,1] + inputs[,2],
  inputs[,3], -.25 * inputs[,3]
)
print(Matrix::rankMatrix(x))  # 5 columns but rank 3

cor(x)  # only detects the columns 4,5 collinearity, not 1,2,3
svd(x)$d  # two singular values are numerically zero as expected

qr.x <- qr(x)
print(qr.x$pivot)
rank.x <- Matrix::rankMatrix(x)
print(Matrix::rankMatrix(x[,qr.x$pivot[1:rank.x]]))  # full rank

关于仅使用成对相关问题的另一个评论是,具有完美相关性的两列甚至不能保证矩阵是低秩的。举个例子:

set.seed(1)
x <- rnorm(n)
x <- cbind(x, x + 1)
print(Matrix::rankMatrix(x))
cor(x)

这两列是完全相关的,但由于常数向量不在它们的范围内,它实际上并不影响排名。如果还有一个截距列,那么这个矩阵确实是秩的2(几乎可以肯定)。

看起来您在 3 个自变量对中的一对之间具有完美的共线性。运行一个相关矩阵,并检查哪对的相关性正好为 1。在 R 中,

cor(count_FGT_free)

count_FGT_free如果很大,您还可以使用这三个变量创建一个较小的数据框。