目录

一、数据

二、共线性检查

三、岭回归

四、lasso回归

五、适应性lasso回归

六、偏最小二乘回归


一、数据

糖尿病数据(diabetes.csv)包含在R程序包的lars中,是关于糖尿病的血液等化验指标。除了因变量y之外,还有两个自变量矩阵,前者经过标准化,后者包括前者及一些交互作用。

可以使用以下代码将数据保存为csv文件方便调用

#install.packages("lars")
library(lars)
data(diabetes)  #加载数据
write.csv(diabetes,"diabetes.csv",row.names = FALSE)

二、共线性检查

在多元回归中,当两个或更多的自变量有些相关的时候,就可能出现多重共线性的情况。这种情况严重的时候,模型或数据的微小变化有可能造成系数估计的较大变化,使结果模型不稳定,也不易解释。

有一些关于多重共线性的度量,其中之一使容忍度(tolerance)或方差膨胀因子(VIF)【两者等价】

R语言线性同余发生器 r语言共线性分析_数据

容忍度太小(按照一些文献,小于0.2或0.1)或VIF太大(如5或10),则有多重共线性的问题

还有一个是条件数,常用R语言线性同余发生器 r语言共线性分析_多重共线性_02表示,大于15时有共线性问题,大于30时说明共线性严重

R语言线性同余发生器 r语言共线性分析_多重共线性_03

VIF可以通过程序包car的函数vif()得到,条件数可用R固有的函数kappa()得到

w=read.csv("diabetes.csv")
#w[,1:10]为x,w[,11]为y,w[,12:75]为x2
kappa(w[,12:75])
library(carData)
library(car)
vif(lm(y~.,w[,11:75]))

计算结果显示,数据x2的条件数=11427.09,x2最大的5个VIF都大于60000,共线性十分严重,因此直接修正,不尝试简单回归。

三、岭回归

普通最小二乘回归寻求使残差平方和最小的系数β,岭回归加入一个惩罚项

R语言线性同余发生器 r语言共线性分析_多重共线性_04

来约束系数。使得残差平方和小,又不能使得系数太膨胀,这里需要确认系数λ。

R语言线性同余发生器 r语言共线性分析_岭回归_05

w=read.csv("diabetes.csv")
library(ridge)
a=linearRidge(y~.,data=w[,11:75])
summary(a)

这里显示岭回归参数(5.363159)以及各个变量的系数。

四、lasso回归

原理上和岭回归相似,但是惩罚项不是系数的平方而是绝对值,在约束条件

R语言线性同余发生器 r语言共线性分析_多重共线性_06

下,需满足

R语言线性同余发生器 r语言共线性分析_数据_07

lasso回归不像岭回归那样把系数缩小,而是筛选掉一些系数。可以用k折交叉验证(CV)选择平均方误差最小的模型,也可以用Mallows Cp统计量来评价回归,即如果从k个自变量中选取p个参与回归,则Cp统计量的定义为:

R语言线性同余发生器 r语言共线性分析_R_08

对于糖尿病数据,使用lars程序包,代码如下:

#lasso回归
library(lars)
#lars函数只用于矩阵型数据
#自变量和因变量变为矩阵
x=as.matrix(w[,1:10])
y=as.matrix(w[,11])
x2=as.matrix(w[,12:75])
laa=lars(x2,y)  
plot(laa)
summary(laa)  #给出cp值
cva=cv.lars(x2,y,K=10)  #10折交叉验证
best=cva$index[which.min(cva$cv)] #选合适值
coef=coef.lars(laa,mode="fraction",s=best)#使CV最小步时的系数
#plot(coef)
coef[coef!=0]  #CV所选自变量
min(laa$Cp) #答案为15
coef1=coef.lars(laa,mode="step",s=15)
#plot(coef1)
coef1[coef1!=0]  #Cp所选自变量

R语言线性同余发生器 r语言共线性分析_数据_09

R语言线性同余发生器 r语言共线性分析_R_10

图1中,上面数据代表迭代次数,右边代表最终选择的变量。

图2中,可以看出应选取的λ值小于0.1的一半。

通过coef[coef!=0]和coef1[coef1!=0]查看由CV和Cp所确定的变量

五、适应性lasso回归

是lasso回归的改进模型,其系数β同样要满足

R语言线性同余发生器 r语言共线性分析_R_11

它的惩罚项是系数绝对值的加权平均,即约束条件

R语言线性同余发生器 r语言共线性分析_数据_12

,其中

R语言线性同余发生器 r语言共线性分析_岭回归_13

,γ>0是一个调整参数,适用于很大范围的损失函数及惩罚条件,岭回归和lasso回归仅仅是其方法的特例。这里使用包msgps,不仅包括适应性lasso(alasso)回归,还包括弹性网络和广义弹性网络等方法。程序包基于广义路径搜索方法寻求最优参数。

对于糖尿病的例子,有如下代码:

#适应性lasso回归
x=as.matrix(w[,1:10])
#y是向量
y=w[,11]
x2=as.matrix(w[,12:75])
library(msgps)
al=msgps(x2,y,penalty="alasso",gamma=1,lambda=0)
summary(al)
plot(al)

输出结果显示γ=45.41。各个准则的值和自由度为:

R语言线性同余发生器 r语言共线性分析_多重共线性_14

不同情况下参数的变化:

R语言线性同余发生器 r语言共线性分析_岭回归_15

六、偏最小二乘回归

偏最小二乘回归类似于主成分回归。它在因变量(如果也有多个变量组成)和自变量中各自寻找一个因子(成分),条件是这两个因子在其他可能的成分中最相关,然后再选中的这一对因子的正交空间再选一对最相关的因子,直到这些对因子具有充分代表性(可用交叉验证)

使用包pls,该包也可做主成分分析,一些研究发现(Wold et al.,1984,Gartwaite,1994)偏最小二乘回归在预测上优于普通最小二乘回归及主成分回归。在观测数据相对较少(甚至少于变量数目)时,偏最小二乘回归依然可以使用。主成分回归的计算完全类似,只需把下面的函数plsr()换成pcr()。

#偏最小二乘回归
library(pls)
ap=plsr(y~x2,64,validation="CV")  #求出所有可能的64个因子
ap$loadings  #看代表性,前28个因子可以代表76.4%的方差
ap$coef  #看各个因子作为原变量的线性组合系数
validationplot(ap)  #根据CV所用准则最优的原则挑选因子
RMSEP(ap);MSEP(ap);R2(ap) #不同准则在不同因子数量的值

5个因子时RMSEP最小,用其他准则,如MSEP和R2都选择了5个因子