回归分析断断续续、囫囵吞枣、半拉卡机、似懂非懂看了几次了,不过每次都是有点新理解,过段时间一回忆,又一脸懵圈的想,什么是回归分析?总之,多看理解下总没坏处咯~主要是变量的筛选上
回归分析是处理变量之间的相互依存关系的一种有效方法。
1.利用swiss数据集进行逐步回归探索
#这个算法利用AIC准则来度量添加变量的效果。
#利用swiss数据集来进行逐步回归
data("swiss")
summary(swiss) #47行观测,6个变量。
#看一下数据之间的相关性,发现Examination和Education之间的相关性较强,即解释变量之间存在多重共线性。
corrplot::corrplot(cor(swiss))
image-20200611191106577
#首先对原始数据进行分析
lm5 <- lm(Fertility~.,data = swiss)
summary(lm5)
image-20200611201205060
#从结果可以看到Examination的显著性非常低,同时Education的p值又非常小,为了解决这一个问题,下面用step()函数进行逐步回归。
tstep <- step(lm5)
#从结果可以看到,当5个变量Examination、Agriculture、Infant.Mortality、Catholic、Education都有的时候呢,AIC值是190.69,当进行了逐步回归step后,提出了刚才提到的相关性很高并且p值不显著的其中一个变量Examination后,AIC值变小为189.86。
image-20200611201245387
#逐步回归法是基于AIC值最小的选择变量,如果挑选出的变量可能p值不显著,就用drop1()进行后续处理,如下
drop1(lm5)
#这样的话就人为地剔除变量Examination外是AIC值最小的变量(Agriculture,AIC值是195.10,这里要明确的是虽然Agriculture的值是除了Examination以为最小的,但是剔除它以后,却能使整体的AIC 值最小。
image-20200611201322224
2.利用longley数据集进行岭回归探索
lm6 <- lm(Employed ~.,data = longley)
summary(lm6)
#上述结果可以看到有限就不显著,用car包中的函数vif()查看个自变量之间的的共线性情况。
image-20200611201506997
library(car)
vif(lm6)
#vif值超过10表示存在多重共线性,上面结果可以看到GNP、Population、Year的值都超过200,说名存在严重的多重共线性。
#接下来利用lm.ridge()进行变量选择
image-20200611201604370
library(MASS)
plot(lm.ridge(Employed ~.,data = longley,lambda = seq(0,0.1,0.0001)))
image-20200611175731134变量选择原则,随着lamdbda值的增加,回归系数不稳定、震动趋于0的解释变量或回归系数稳定,且绝对值很小的解释变量均需要剔除。根据变量剔除原则,即震动趋于0的变量
#剔除掉GNP.deflator
plot(lm.ridge(Employed ~.-GNP.deflator,data = longley,lambda = seq(0,0.1,0.0001)))
select(lm.ridge(Employed ~.-GNP.deflator,data = longley,lambda = seq(0,0.1,0.0001)))
image-20200611180931659
#删掉了GNP,根据前面的vif值,反正光看图片我是看不出来要删除哪个,应该是可以标注的,之前看到过某些基因标注了出来,那么可以删掉那些基因,但是根据图片展示可以看出并决定删除哪个变量嘛?还不知。
plot(lm.ridge(Employed ~.-GNP.deflator-GNP,data = longley,lambda = seq(0,0.1,0.0001)))
select(lm.ridge(Employed ~.-GNP.deflator-GNP,data = longley,lambda = seq(0,0.1,0.0001)))
image-20200611181213204
#删掉以后继续建回归模型
lm7 <- lm(Employed ~.-GNP.deflator-GNP,data = longley)
summary(lm7)
image-20200611202031154
上述的结果通过了显著性检验(p<0.05), 并且Adjusted R-squared是0.9927 ,说明模型有效。
3.利用longley数据集进行lasso回归探索
head(longley[,1:7])
image-20200611202324950
library(lars)
longley <- as.matrix(longley)
lar.1 <- lars(longley[,1:6],longley[,7])
lar.1
summary(lar.1)
结果图展示如下,算法一共迭代了10次,按照下图中标注的1、2、3、4序号看,首先这个模型要选择Cp值最小,Cp用来衡量多重共线性,越小越好,故选择第6步的迭代结果,即选择GNP 、Unemployed 、Armed.Forces 、Year、 Population这5个变量的迭代结果
image-20200611202552112 image-20200611203213893但是根据刚才岭回归的结果,可以知道这5个变量做多元线性回归还是不能使所有参数估计通过显著性检验,因此西门结合交叉验证来选择变量。
cva <- cv.lars(longley[,1:6],longley[,7],K = 10,plot.it = T)
best <- cva$index[which.min(cva$cv)]
#得到使得cv最小时的系数
coef <- coef.lars(lar.1,mode='fraction',s=best)
coef
#通过cv选择的变量
coef[coef!=0]
#可以看到GNP.deflator和GNP的回归系数都是0,这两个变量就可以剔除不要了。
image-20200611184717386出现一个非常记忆深刻的报错,就是之前也见过,问过老大,参数没有用!到底是没用还是用错了!
把小写的k改成大写的K就可以了~!
上面的代码表示,利用cv.lars()做10次交叉验证,并绘制cv的变化图。cv值越小越好,故计算使得cv值最小的回归系数,并通过回归系数进行变量选择。
image-20200611185757470 image-20200611203411036通过上述结果可知,交叉验证选择的变量最后为 Unemployed 、Armed.Forces 、Year、 Population这几个变量。
网友评论