美文网首页复现rna_seq收入即学习
多学一次回归分析,总没坏处吧

多学一次回归分析,总没坏处吧

作者: 小梦游仙境 | 来源:发表于2020-06-12 17:58 被阅读0次

    回归分析断断续续、囫囵吞枣、半拉卡机、似懂非懂看了几次了,不过每次都是有点新理解,过段时间一回忆,又一脸懵圈的想,什么是回归分析?总之,多看理解下总没坏处咯~主要是变量的筛选上

    回归分析是处理变量之间的相互依存关系的一种有效方法。

    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)))
    

    变量选择原则,随着lamdbda值的增加,回归系数不稳定、震动趋于0的解释变量或回归系数稳定,且绝对值很小的解释变量均需要剔除。根据变量剔除原则,即震动趋于0的变量

    image-20200611175731134
    #剔除掉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这几个变量。

    相关文章

      网友评论

        本文标题:多学一次回归分析,总没坏处吧

        本文链接:https://www.haomeiwen.com/subject/dbsntktx.html