执行变量选择时如何处理多重共线性?

机器算法验证 r 多重回归 特征选择 多重共线性
2022-02-07 03:54:01

我有一个包含 9 个连续自变量的数据集。我正在尝试在这些变量中进行选择,以使模型适合单个百分比(因)变量,Score. 不幸的是,我知道几个变量之间会有严重的共线性。

我尝试使用stepAIC()R 中的函数进行变量选择,但奇怪的是,该方法似乎对方程中列出变量的顺序很敏感......

这是我的 R 代码(因为它是百分比数据,所以我对分数使用了 logit 转换):

library(MASS)
library(car)

data.tst = read.table("data.txt",header=T)
data.lm = lm(logit(Score) ~ Var1 + Var2 + Var3 + Var4 + Var5 + Var6 + Var7 +
             Var8 + Var9, data = data.tst)

step = stepAIC(data.lm, direction="both")
summary(step)

出于某种原因,我发现等式开头列出的变量最终被stepAIC()函数选择,并且可以通过列出来操纵结果,例如,Var9首先(在波浪号之后)。

在这里拟合模型的更有效(且争议更少)的方法是什么?我实际上并没有死心塌地使用线性回归:我唯一想要的是能够理解 9 个变量中的哪个变量真正推动了Score变量的变化。最好是考虑到这 9 个变量中潜在的共线性的一些方法。

3个回答

因为很难确定要删除哪些变量,所以通常最好不要删除变量。沿着这条路线前进的两种方法是(1)使用数据缩减方法(例如,变量聚类或主成分)并将汇总分数放入模型而不是单个变量,以及(2)将所有变量放入模型但不测试根据竞争变量的影响调整一个变量的影响。对于 (2),竞争变量的块检验很强大,因为共线变量在整体多自由度关联检验中联合起来,而不是像单独测试变量时那样相互竞争。

首先,解决这个问题的一个很好的资源是 T. Keith,Multiple Regression and Beyond。书中有很多关于路径建模和变量选择的材料,我想你会在那里找到问题的详尽答案。

解决多重共线性的一种方法是将预测变量居中,即从每个值中减去一个系列的平均值。当数据高度共线时,也可以使用岭回归。最后,顺序回归可以帮助理解预测变量之间的因果关系,同时分析预测事件的时间顺序。

所有 9 个变量都显示共线性吗?对于诊断,您可以使用 Cohen 2003 方差膨胀因子。VIF 值 >= 10 表示高共线性和夸大的标准误差。我了解您对预测变量和结果之间的因果关系更感兴趣。如果不是,多重共线性不被认为是一个严重的预测问题,因为您可以通过检查样本外数据的 MAE 与建立的模型进行确认,同时添​​加一个预测变量。如果您的预测器具有边际预测能力,您会发现即使存在模型多重共线性,MAE 也会降低。

如果您想在存在高共线性的情况下进行变量选择,我可以推荐l0ara 包,它使用迭代自适应岭程序适合L0 惩罚 GLM 由于该方法最终基于岭正则化回归,因此它可以很好地处理共线性,并且在我的模拟中,它产生的误报要少得多,同时与 LASSO、弹性网络或自适应 LASSO 等相比,它仍然具有出色的预测性能。或者,您也可以尝试L0Learn 包L0 和 L2 惩罚的组合。然后,L0 惩罚有利于稀疏性(即小型模型),而 L2 惩罚则规范了共线性。也经常建议使用弹性网络(使用 L1 和 L2 惩罚的组合),但在我的测试中,这会产生更多的误报,而且系数会严重偏颇。如果您改用 L0 惩罚方法(也称为最佳子集),您可以摆脱这种偏差 - 它是所谓的预言机估计器,它同时获得一致且无偏的参数系数。所有这些方法中的正则化参数都需要通过交叉验证进行优化,以提供最佳的样本外预测性能。如果您还想获得参数的显着性水平和置信区间,那么您也可以通过非参数自举来做到这一点。

迭代自适应岭算法l0ara(有时称为折断自适应岭),像弹性网一样,具有分组效应,这将使其在进入模型时立即分组选择高度相关的变量。这是有道理的——例如,如果您的模型中有两个近乎共线的变量,它会将效果平均分配给两者。

如果您正在分析比例数据,您最好使用逻辑回归模型 btw - 该l0ara软件包允许您结合 L0 惩罚来做到这一点;对于L0Learn包,这将很快得到支持。