美文网首页
线性回归

线性回归

作者: 曲凉不见 | 来源:发表于2021-07-23 19:02 被阅读0次

    读到一段话

    A Simple regression model is one that attempts to fit a linear regression model with a single explanatory/independent variable.
    Multiple regression model is one that attempts to predict a dependent variable which is based on the value of two or more independent variables. Example: can daily cigarette consumption be predicted based on smoking duration, age when started smoking, income, gender etc.
    Multi target regression is the term used when there are multiple dependent variables. If the target variables are categorical, then it is called multi-label or multi-target classification, and if the target variables are numeric, then multi-target (or multi-output) regression is the name commonly used.

    从这段话可得:

    一元回归:用单一自变量(解释变量x)来拟合单一因变量y线性回归;
    多元回归:用两个或以上自变量来预测单个因变量。例如:是否可以用吸烟时间(连续变量)、初次吸烟年龄(连续变量)、收入(连续变量)、性别(二元变量)等来预测每日吸烟量(连续变量);
    多目标回归:因变量和自变量都是多个,当目标变量是分类的,叫multi-label classification或multi-target classification,当目标变量是连续的,叫multi-target regression或multi-output regression。

    一元回归:

    核心是最小二乘法(OSL),最终是使拟合线与实际值之间的差的平方和最小。
    可以是线性,也可以是非线性。

    model=lm(x~y,data=data)#可以带function
    summary(model)#展示拟合模型的详细结果
    
    summary()#展示拟合模型的详细结果
    coefficients()#列出拟合模型的模型参数(截距项和斜率)
    confint()#提供模型参数的置信区间(默认95%)
    fitted()#列出拟合模型的预测值
    residuals()#列出拟合模型的残差值
    anova()#生成一个拟合模型的方差分析表,或者比较两个或更多拟合模型的方差分析表
    vcov()#列出模型参数的协方差矩阵
    AIC()#输出赤池信息统计量
    plot()#生成评价拟合模型的诊断图
    predict()#用拟合模型对新的数据集预测响应变量值
    

    改进模型的方法:

    (1)删点:观测点(离群点)或删除变量(多重共线性变量);
    (2)变量变换:相应变量变换(x)和预测变量变换(y)。当回归模型违反正态假设时,可以进行响应变量变换来改善其正态性,使用car包中的powerTranform(变量值)函数来进行Box-Cox正态变换来进行,是否需要可以看结果中的p值(<0.05则为需要进行变换)。当回归模型违反线性假设时,可以使用boxTidwell(回归模型中的参数内容,即去掉lm()之后的内容)函数来进行识别,同样,需要看其中的p值。响应变量(y)的变换同样也可以改善方差齐性,此点之前的同方差性有说明,可以返回查看。
    (3)尝试使用其它方法,当数据不满足OLS假设前提时,不需要使用其它更加合理的方法进行回归,如出现多重共线性时可以使用岭回归,存在离群点/强影响点时使用稳健回归,存在非正态性时,使用非参数回归,存在非线性时尝试非线性回归,如果违反误差独立性假设,还能使用那些专门研究误差结构的模型,比如时间序列或多层次回归模型,最后,还可以使用广泛应用的广义线性模型,它能适用许多OLS回归假设不成立的情况。

    其它学习资料:https://blog.csdn.net/weixin_42712867/article/details/100149812?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.readhide&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.readhide

    选择最佳回归模型:

    最佳只是相对的,回归模型的选择主要通过模型比较以及变量选择来进行。

    模型比较,R语言实战给出两种方法,一个是利用方差anova进行嵌套比较,另一个是使用AIC(赤池信息准则)来进行比较。anova嵌套比较是把变量少的模型嵌套在变量多的模型中,利用p值检验其它变量(即不在变量少的模型但在变量多的模型中的变量)是否需要添加,简单打个比方,模型1为y1+2+3,模型2为y1+2+3+4,则为模型1嵌套在模型2中(注:anova(模型2,模型1)),检测的是4是否需要添加到模型中,p值显著则表明需要添加;AIC方式,它不需要要求嵌套,可心直接使用AIC(fit)来进行计分,所得结果越小越好(AIC=2k-2ln(L),k为模型的因变量数量,ln(L)为对数似然函数,即为因变量越少越,似然函数越大,AIC值越小)。

    变量选择,分为逐步回归和全子集回归,逐步回归有向前,向后,及向前向后,具体可看回归分析,R中使用的是MASS包上的stepAIC函数,参数direction可以决定使用“forward、backward、both”三种方法,以AIC值决定选用哪种;全子集回归使用leaps包中的regsubsets()函数,通过R平方,修正R平方以及Mallow Cp统计量,得到的结果可以使用leaps的plot函数(此处注意,是leaps的plot函数,可以使用leaps::plot来指定,避免后续出错)进行绘图,scale参数可以指定以什么统计量(R平方,修正R平方等)作为纵坐标。也可心使用car包中的subsets()函数进行绘制。leaps::plot画出来的是一幅灰度方格图,从底部向上看,左侧为统计量值,例如书上是以修正R平方为纵坐标的,横坐标是所有变量(含截距),图中的同一行的方格表示它正在使用对应的变量。同一行的两个方格表示它正在使用方格对应变量组成的回归函数的修正R平方值为多少,对修正R平方来说,越高越好。subsets画出来的函数需要添加一条截距和斜率均为1的直线,而图中标记越接近这条直线越好。

    深层次分析
    最后,书中对OLS模型给出了交叉验证以及变量相对重要性来进一步评价模型的合理性及变量的相对重要性。

    交叉验证,给出代码清单,利用bootstrap包中的crossval()函数来进行交叉验证,即使用样本中部分数据做回归估计,然后用另一部分数据去预测,验证其回归方程的好坏,对比前后R平方减少情况,减少得越少越好。

    变量相对重要性,书中给出两种方法,但是,这两种方法得到的结果只有影响最大的一样,其它不一样,这让我觉得有点纠结,从网上找到的资料来看,利用标准化回归系数来衡量为最基础,最简单的方法,而且这个方法不受其它因素的影响,可以直接使用,别一种方法是相对权重,但是得出的结果却和标准回归系数法有较大出入,个人倾向前一种方法。

    多元回归:

    构建模型:

    model.lm=lm(mpg~disp+hp+wt,data=mtcars)
    

    这里是线性回归,如果变量不是连续值,而是其他值,要做广义线性回归

    data(Affairs, package = "AER")
    summary(Affairs)
    table(Affairs$affairs) #创建二分类因变量,1表示发生婚外情,0表示不发生婚外情 Affairs$ynaffair[Affairs$affairs > 0] <- 1
    Affairs$ynaffair[Affairs$affairs == 0] <- 0
    Affairs$ynaffair <- factor(Affairs$ynaffair, levels = c(0, 1), labels = c("No", "Yes"))
    table(Affairs$ynaffair)
    # 拟合模型(link = "logit")
    fit.full <- glm(ynaffair ~ gender + age + yearsmarried + children + religiousness + education + occupation + rating, data = Affairs, family = binomial())
    summary(fit.full)
    
    #去掉不显著的变量
    fit.reduced <- glm(ynaffair ~ age + yearsmarried + religiousness + rating, data = Affairs, family = binomial()) 
    summary(fit.reduced)
    # 输出回归系数
    coef(fit.reduced)
    #解释回归系数
    exp(coef(fit.reduced))
    #回归系数可用coef()获取,exp(回归系数)可以求得自变量引起因变量变化的优势比OR,对于发病率较低的慢性疾病,OR可作为相对危险度RR的估计
     #OR=1,自变量X对于应变量发生与否不起作用,OR>1是一个危险因素,OR<1是一个保护因素。(当1表示发生,0表示不发生的情况)
    #此处结婚年龄yearsmarried是发生婚外情的危险因素,age、religiousness、rating是保护因素。
    #广义先到此为止,更多内容见参考资料处链接
    

    回归诊断:

    1)线性回归需要满足4个条件:

    残差:预测值和实际值之间的差
    (1)线性关系--自变量与因变量之间具有线性关系
    (2)正态性--残差基本呈正态分布;
    (3)同方差性--残差方差基本不变;
    (4)独立性--残差(样本)间相互独立;

    一个命令出四个图: plot(model.lm)
    #差和拟合值(左上),残差和拟合值之间数据点均匀分布在y=0两侧,呈现出随机的分布,红色线呈现出一条平稳的曲线并没有明显的形状特征。 #残差QQ图(右上),数据点按对角直线排列,趋于一条直线,并被对角直接穿过,直观上符合正态分布。 #标准化残差平方根和拟合值(左下),数据点均匀分布在y=0两侧,呈现出随机的分布,红色线呈现出一条平稳的曲线并没有明显的形状特征。 #标准化残差和杠杆值(右下),没有出现红色的等高线,则说明数据中没有特别影响回归结果的异常点。
    
    或者分开出图:
    #线性关系
    crPlots(model.lm)
    #正态性
    library(car)
    qqPlot(model.lm,id.method='identify',simulate = TRUE,labels=row.names(data),main='Q-Q plot')
    #同方差性
    ncvTest(model.lm)
    #p值不显著,说明误差方差恒定
    #独立性:D-W检验
    durbinWatsonTest(model.lm)
    #p值不显著,说明不具有自相关性
    

    对于残差不满足正态性、等方差性的,对模型进行改进,例如对y进行对数变换后再回归

    remodel.lm=lm(log(y)~x1+x2+x3,data=data)
    
    2)多重共线性
    vim(model.lm)
    

    VIF<10,多重共线性还可以容忍。如果存在多重共线性可以直接删除变量,也可以通过岭回归等有偏估计处理

    3)异常值检测

    car包中的influencePlot函数可以将各类异常值可视化
    这一部分在其它内容里有讲(例如某项目线性相关分析里)

    模型优化:

    回归方程需要包含所有的预测变量吗?是否需要去掉对预测贡献不显著的变量?为了选择合适的模型,常常需要平衡预测精度和模型简洁度的关系。
    如果两个模型预测精度没有显著差别,我们肯定会选择包含预测变量较少的模型。
    从大量候选变量中选择最终的预测变量有以下两种流行方法:
    逐步回归法:一种是向前选择(逐渐递增变量),一种是向后选择(逐渐减去p最大的变量),一般偏向选择向后。通过AIC指标来判断是否需要参数优化,选择最小的AIC来选择最优模型。
    全子集回归:就是将所有可能组合的模型都进行检验,从而选择出比较理想的模型。全子集回归可以通过调整R平方或Mallows Cp统计量等准则来决定最佳模型。
    实际操作中,还会根据业务知识来操作。

    AIC(赤池系数)和BIC(贝叶斯系数)都是用于同时衡量模型拟合度和复杂度的统计量。换句话说,我们希望利用AIC或者BIC选择出来的模型既有不错的拟合度又不至于太复杂(太多自变量)。
    对于一个回归模型,如果优化目标只是最大化log-likelihood函数,即不限制变量系数或变量数量,当然是模型越大(变量越多)模型越精确。
    考虑到模型计算以及过度拟合,我们又倾向于一个简单的模型。所以我们需要寻找一个相对最优化的模型,来平衡模型大小与模型拟合准确度的关系。
    选择模型的评估标量有很多,AIC和BIC就是其中的两个。AIC和BIC是似然函数和乘法函数的线性组合。它们的相似处在于都是通过限制模型变量的数量来控制模型的大小,而不同的是惩罚变量数量的函数不同。
    BIC的概念来自贝叶斯,具体不详。

    逐步回归法:
    model1=lm(mpg~disp+hp+wt,data=mtcars) model2=lm(mpg~hp+wt,data=mtcars) step(model1) step(model2)
    

    模型原始的AIC是65.831,去掉disp会降低到63.840,而去掉其它变量会增大,因此可以考虑去掉disp

    全子集回归法:

    #调整R方:
    library(leaps)
    leaps=regsubsets(mpg~disp+hp+wt, data=mtcars,nbest=4) plot(leaps,scale='adjr2')
    第一行(从底部开始)表示,模型只含有截距项和hp时,模型的调整R平方为0.69;
    第二行表示,模型只含有截距项和disp时,模型的调整R平方为0.71;
    依次类推,最上边一行表示,模型含有全部预测变量时,调整R平方为0.81,不含有disp也是0.81,显然此时调整R平方最大,模型的拟合度也最好。
    
    #计算Mallows Cp统计量:
    library(car)
    subsets(leaps,statistic='cp',main='Cp plot for all subsets regression')
    abline(1,1,lty=2,col='blue')
    基于Mallow Cp统计量的七个可能的模型中,越好的模型离截距项和斜率项均为1的直线越近。 基于以上结果,适当调整自变量
    

    比较模型拟合度:

    model.lm=lm(mpg~disp+hp+wt,data=mtcars) remodel.lm=lm(mpg~hp+wt,data=mtcars) anova(remodel.lm,model.lm)
    

    Analysis of Variance Table
    Model 1: mpg ~ hp + wt
    Model 2: mpg ~ disp + hp + wt
    Res.Df RSS Df Sum of Sq F Pr(>F)
    1 29 195.05
    2 28 194.99 1 0.05708 0.0082 0.9285
    p=0.9285,检验不显著,两个模型之间没有显著差别,可以不考虑disp

    模型预测:

    得到了多元线性回归方程的公式,就可以对数据进行预测了。我们可以用R语言的predict()函数来计算预测值y0和相应的预测区间,并把实际值和预测值一起可视化化展示。

    #预测
    dfp=predict(model.lm,interval="prediction")
    #合并数据 df_merge=merge(df$y,dfp)
    #画图 draw(df_merge)
    

    也可以导出表

    获取公式的方法:https://blog.csdn.net/qq_15111861/article/details/86706857

    多项式回归:

    如果残差图中呈现明显的非线性关系,可以考虑对自变量进行多项式回归

    [图片上传中...(image-f1b9d0-1627037495314-0)]

    在这个一元线性回归模型的残差图中,散点的规律还是比较明显,说明线性关系较弱。

    fit1_1 <- lm(medv~poly(lstat,2),data = Boston) plot(fit1_1,which = 1) summary(fit1_1) #能改善R方
    

    或者使用Box-Tidwell变换,car包中的boxTidwell() 函数通过获得预测变量幂数的最大似然估计来改善线性关系。

    library(car)
    boxTidwell(Murder~Population+Illiteracy,data=states)
    Score Statistic p-value MLE of lambda
    Population -0.3228003 0.7468465 0.8693882
    Illiteracy 0.6193814 0.5356651 1.3581188
    iterations = 19
    #这里看lambda,表示各个变量的幂次数
    lmfit <- lm(Murder~Population+Illiteracy,data=states)
    lmfit2 <- lm(Murder~I(Population^0.87)+I(Illiteracy^1.36),data=states)
    plot(lmfit,which = 1)
    

    再用anova或者summary来比较,此处改善效果甚微,若有更好改善,可优化模型

    多目标回归

    https://towardsdatascience.com/regression-models-with-multiple-target-variables-8baa75aacd
    随机森林,支持向量机等

    参考资料:
    https://zhuanlan.zhihu.com/p/38306630
    https://blog.csdn.net/kMD8d5R/article/details/79838933
    http://blog.fens.me/r-multi-linear-regression/
    https://www.jianshu.com/p/4c6c8174f292
    线性多元回归数学解释:https://zhuanlan.zhihu.com/p/48541799
    广义线性回归:https://www.jianshu.com/p/c9cc5f429786
    观察研究中的逻辑回归:https://zhuanlan.zhihu.com/p/86914515?utm_source=wechat_session&utm_medium=social&s_r=0

    相关文章

      网友评论

          本文标题:线性回归

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