分享

临床预测模型 | 第5期. 探索变量间的共线性

 新用户4064dVjo 2023-07-22 发布于北京

上期内容中,我们介绍了模型过拟合的相关内容(第4期.你的模型过拟合了吗?)。本期将向大家讲解变量之间的共线性问题,包括如何判断变量之间是否存在共线性,以及如何解决这个问题,千万不要错过哟(附代码)!

一、什么是共线性

共线性(collinearity)是指两个或更多的预测变量之间高度相关。例如,在体型相似的情况下,身高越高的人体重往往也越大,身高和体重就呈现明显的共线性。还比如,在基因表达矩阵中,上游基因的表达量增加,可能导致下游基因表达量的增加,因此上下游基因的表达量可能也存在共线性。

两个连续型变量的共线性,根据是否符合正态分布,可以分别采用Pearson或者Spearman相关性分析来检验。我们可以用相关系数r来评价两个变量的相关程度(如下图示)。想要详细学习相关性检验的同学,可以点击文末的B站链接哦。

相关系数r与相关程度

有时,并非某对变量具有特别强的相关性,而是三个或更多变量之间存在共线性。我们把这种情况称为多重共线性(multicollinearity) ,评估多重共线性的方式是计算方差膨胀因子 (variance inflation factor , VIF) 。一般认为,VIF 值超过 5就提示有共线性问题。

二、检验共线性

如果想批量对多个变量进行相关性检验的话,可以用R包PerformanceAnalytics,我们以R的自带数据集mtcars为例,检验变量之间的相关性:

library(PerformanceAnalytics) #如果没有安装此R包,需要提前安装
chart.Correlation(mtcars[,c(1,3,4,5,6,7)], histogram=TRUE, method="pearson")

右上角为两两变量间的相关系数,星号为显著性,星号越多P值越小;左下角为两两变量的散点图和线性拟合。

chart.Correlation()输出的结果

对于VIF,我们可以用car包中的vif()函数计算,结果显示mtcars数据集中的各个变量存在很强的多重共线性(如下图)!

library(car) #如果没有安装此R包,需要提前安装
model=glm(am~mpg+disp+wt+hp+qsec+drat, family="binomial", data=mtcars)
vif(model)

vif()输出的结果

下面,我们更直观的展示多重共线性。从上图,可以看到qsec在两两相关性检验中与mpg(r=0.42)、disp(r=-0.42)、wt(r=0.091)、drat(r=-0.17)均没有强的相关性,但是我们同时用这四个变量可以很好的预测qsec,(如下图,纵坐标为用上述四个变量所预测的qsec,横坐标为实际的qsec,蓝线为拟合的曲线,如果完全一致的话,则散点都落在虚线上,蓝线也会与虚线重合),这提示它们之间存在多重共线性,应证了前文VIF的结果。

处理共线性的有两个比较简便的方法:1. 剔除共线性中的一个变量,这样模型的效果并不会下降很多,因为共线性的两个变量本身就提供了重复的信息;2. 将存在共线性的变量转化为一个变量,如可以把身高体重转化为BMI。当然,还可以使用LASSO等正则化算法,这些内容我们将在今后的内容中讲解,千万不要错过!

那么这就是本期的全部内容啦,你学会了吗?大家对于推送内容有任何问题或建议可以在公众号菜单栏“更多--读者的话” 栏目中提出,我们会尽快回复!

参考文献:

An Introduction to Statistical Learning with Applications in R

写在最后



“观科研”(点击进一步了解我们吧)是由一群北京协和医学院(清华大学医学部)的博士开创的公众号,初心是让医学科研有迹可循,帮助一线的医学科研人员更快地成长,希望大家支持与关注!

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多