给定大量数据,如何确定所有变量之间的共线性程度?最好不依赖于计算一个变量和所有其他变量之间的线性回归?具体来说,我需要找到任何单个变量和每个其他变量之间的共线性。
对于这个例子,我们会说数据有 10k 个变量和 1 亿行。我本身不需要软件包,相关论文的链接就可以了。
给定大量数据,如何确定所有变量之间的共线性程度?最好不依赖于计算一个变量和所有其他变量之间的线性回归?具体来说,我需要找到任何单个变量和每个其他变量之间的共线性。
对于这个例子,我们会说数据有 10k 个变量和 1 亿行。我本身不需要软件包,相关论文的链接就可以了。
条件编号是您要查看的统计数据。它是设计空间共线性的详尽度量,并且比 VIF 计算成本低得多。公式为:
其中 (的最小(最大)奇异值,X_s居中的、重新缩放的变量。
阅读您的评论:这是我所怀疑的。要计算条件 # 您不需要所有 100e6 个数据点。仅以 100e3 的顺序随机抽样(通过使用模拟数据集进行试验,您可以说服自己,要获得可靠的结果,您应该以大约 5*k 为目标,其中 k 是非共线变量的数量,因此即使 100e3 已经非常大了) .
这应该已经让您很好地了解哪些变量导致了共线性。
此外,您有专门的算法来计算第一个和最后几个奇异值以及最后几个奇异向量。的完整 SVD (SVD-S) 的情况下得到这些。但是,我不知道这些是否在 R 中实现,因此为了使下面的示例易于访问,我将仅使用一个小示例和 R 中的经典 SVD。
高条件数(通常当比率 (1) 大于 10 时)告诉您是病态的,即存在可以重写为其他变量的(接近)线性组合的分量。下面我给出一个简短的(小规模)示例,说明如何使用 SVD 来揭示这种关系。
n<-100
p<-20
#non-ill conditioned part of the dataset.
x<-matrix(rnorm(n*p),nc=p)
x<-scale(x)
#introduce a variable that causes x to be
#ill conditioned.
y<-x%*%c(rnorm(3),rep(0,p))[1:p]
y<-scale(y)
x<-cbind(x,y)
p<-ncol(x)
A<-svd(x,nu=0)
#x is ill-conditioned: this ratio is larger
#than 10. (step 1)
2*log(A$d[1]/A$d[p])
#check what is causing it: (step 2)
round(A$v[,ncol(A$v)],2)
#you can write the last variable as (.23*x_1+.5*x_2-.45*x_3)/(-.7) [1]
#here the relation is exact because:
min(A$d)
#is 0. if min(A$d)>0 then this gives you how much there is noise
#there is arround [1].
#so I remove the last variable. (step 3)
x<-x[,-ncol(x)]
#no more ill-condition.
2*log(A$d[1]/A$d[p-1])
当存在导致不良回归的单个变量时,这适用于问题的线性代数。在大多数情况下,您将拥有多个(接近)精确关系,并且您必须重复步骤 1 到 3。在实践中,计算细节将取决于您用于解决 SVD 问题的方法有多聪明。
您可以通过计算让自己了解数据集中有多少确切的关系
对于所有。为此,您只需要花费