精华内容
下载资源
问答
  • 线性回归,前面用Python从底层一步一个脚印用两种方法实现了回归拟合。在这个高级语言层出不穷的年代,这样做显然不明智,所以我考虑用优秀的数据分析工具——R语言(不敢说最...

    我的博客

    线性回归,前面用Python从底层一步一个脚印用两种方法实现了回归拟合。在这个高级语言层出不穷的年代,这样做显然不明智,所以我考虑用优秀的数据分析工具——R语言(不敢说最优秀,虽然心里是这么想的,我怕有人要骂我!)做回归分析。包括简单多变量回归、逐步回归、逻辑回归!

    多元回归分析,生活中用的很多,因为一个因素可能与很多其它因素有关!言归正传,这里考虑用R语言里面的相关函数做回归分析。

    需要的用到的知识储备:

    • 线性代数

    • 概率论与数理统计

    • 高等数学

    • R语言基础

    下面分别从普通多元线性回归、逐步回归、逻辑回归进行介绍。前面用Python实现的只是一元回归,由于R语言实现线性回归很方便,所以我会着重介绍原理。

    多元线性回归

    不论是单变量还是多元线性回归分析,他们都是直接或间接(有时候需要通过变量代换)程线性的关系。我们需要找到一个通用的线性模型来描述这种关系,在我们可以接受的误差范围内对数据进行预测或者发现规律。

    多元线性回归理论基础

    对于一组变量数据,如果我们不管是通过画散点图还是其它方法,知道了一个变量与其它变量程很强线性关系。我们就需要知道,到底是什么样的关系,关系系数是多少。通常是用经典的最小二乘法,因为这样算出的确实是最优的系数,可以保证残差平方和最小的优化目标。

    对于一个因变量y,有一组自变量X = (x1,x2,...,xk),x1,x2,...,xk,eps是列向量,考虑它们之间有如下线性关系:

    640?wx_fmt=png

    当然了,这里X = (x1,x2,...,xk),y都是给的一组数据,就像这样

    640?wx_fmt=png

    那么,对每一组(比如第一行)数据,就有如下关系:

    640?wx_fmt=png

    目标函数为残差平方和的关于系数beta0,beta1,...,betak的多元二次函数,我们希望找到一组系数使得目标函数值最小,即误差最小。目标函数如下:

    640?wx_fmt=png

    学过数学分析或者高等数学的人都知道,这只要关于beta0,beta1,...,betak分别求偏导数,得到k+1方程,再求出零点即可。

    我们用矩阵表示各个变量如下:

    640?wx_fmt=png

    那么,学过高等代数(数学专业)或者线性代数(工科)都知道,因变量与自变量关系可以表示为:

    640?wx_fmt=png

    中间推导过程这里不在赘述了,最终系数向量表达式为:

    640?wx_fmt=png

    关于多元线性回归的理论就到这里,有兴趣可以参考:线性回归导论(机械工业出版社 王辰勇 译)

    多元线性回归的R语言实现

    这里用R语言里面的常用数据集iris来说明,这个数据集包含五个指标,我们这里先只用前面四个:花萼长度、花萼宽度、花瓣长度、花瓣宽度,进行多元线性回归分析。

    数据预处理

    大家都知道,为了消除不同变量量纲或者数量级不一致,做数据标准化的数据预处理是有必要的。用到的R语言函数是scale(),这个函数的机理具体公式如下:

    640?wx_fmt=png

    R语言实现如下:

    640?wx_fmt=png

    标准化后数据选择前六行我们看一下:

    > head(sl.sc)

         Sepal.Length

    [1,]   -0.8976739

    [2,]   -1.1392005

    [3,]   -1.3807271

    [4,]   -1.5014904

    [5,]   -1.0184372

    [6,]   -0.5353840

    下面构建多元线性回归

    我们用花萼标准化后的数据sl.sc与其它三个变量做线性回归,先做有常数项的多元回归。

    lm.sc <- lm(sl.sc~sw.sc+pl.sc+pw.sc)

    summary(lm.sc)

    640?wx_fmt=png

    summary(lm.sc)给出了线性回归的相关信息,各个系数Residuals给出了残差的5分位数,Estimate、Std. Error、t value、Pr(>|t|)分别给出了自变量系数、标准误、t值和p值,Multiple R-squared:  0.8586, Adjusted R-squared:  0.8557分别给出了R方与修正的R方,这里 R-squared:  0.8557表示这个线性回归模型可以解释85.57的原数据,还是不错的,后面就不再解释这几个指标的意思了。可以看出无论是每个系数还是总体的p-value都远远小于0.05,给出了三颗星***的等级,但是如图蓝色方框是常数项的值是-1.176e-16,太小了,p值是1,告诉我们常数项可以不用,这些数据是过原点的线性关系。

    去掉常数项的多元回归,不同的是,减一表示不要常数项

    lm.sc <- lm(sl.sc~sw.sc+pl.sc+pw.sc-1)

    summary(lm.sc)

    模型详细情况:

    640?wx_fmt=png

    显然,去掉后R方,F值没有明显变换,系数等级都是三颗星,表明去掉常数项确实在不影响模型情况下简化了模型。

    我们来看一下残差图与QQ图:

    plot(lm.sc,1,col = 'orange',main = '残差图')

    plot(lm.sc,2,col = 'orange',main = 'QQ图')

    640?wx_fmt=png

    640?wx_fmt=png

    通过残差图与QQ图也可以明显看出这个不带常数项的线性回归模型是不错的。

    逐步回归

    逐步回归的基本思想是将变量逐个引入模型,每引入一个解释变量后都要进行F检验,并对已经选入的解释变量逐个进行t检验,当原来引入的解释变量由于后面解释变量的引入变得不再显著时,则将其删除。以确保每次引入新的变量之前回归方程中只包含显著性变量。这是一个反复的过程,直到既没有显著的解释变量选入回归方程,也没有不显著的解释变量从回归方程中剔除为止。以保证最后所得到的解释变量集是最优、最简单的。

    逐步回归最常用的挑选准则有修正复相关系数、预测平方和、Cp和AIC等,这里用AIC准则,对于含有P个自变量的回归方程,n为观测值(样本)个数,AIC越小越好,具体计算公式为:

    640?wx_fmt=png

    使用R语言构建逐步回归模型

    知道原理后,我们试图从三个自变量中筛选出两个,首先看一下上述模型的AIC

    step(lm.sc)

    640?wx_fmt=png

    显然,三个变量时AIC是最小的,这里为了说明问题,实在要剔除一个变量的话,当然要剔除第一个。因为我们发现剔除pw.sc时AIC为-272.06,如果剔除pl.scAIC就为-181.26,而AIC越小越好,所以就剔除变量pw.sc吧。

    lm.new <- lm(sl.sc~sw.sc+pl.sc-1)

    summary(lm.new)

    640?wx_fmt=png

    R方稍微减小了一点,因为三个变量AIC最小(即模型最优),提出后肯定会减小的。这里为了说明问题才强行提出一个。

    逻辑回归

    在介绍逻辑回归前我们先介绍什么是哑变量,其实,R语言用的多的人都知道iris这个数据集有5列,第五列是花的分类:setosa、versicolor、 virginica。那么花萼长度是否与花的分类有关呢?一般是有的。增加三列,我们考虑引入0~1变量,那么对于属于setosa的,记为1,versicolor、 virginica位置记为0,同理就多了3列,这里的0,1就是哑变量。还是为了减少变量,简化模型,我们只增加2列versicolor和 virginica,这样versicolor、 virginica位置都为0时,就属于setosa这个分类,versicolor位置为1时就为versicolor这个分类。0,1是逻辑变量,线性回归引入了逻辑变量,故称为逻辑回归。

    下面就进行R语言实现,要不看一下iris数据集长什么样:

    640?wx_fmt=png

    第五列变量就有三个水平,都是50条,正好。

    640?wx_fmt=png

    两个for()语句就是构造逻辑变量的,还是很好理解的,这样就有五个变量了。构造的应该像这样:

    640?wx_fmt=png

    这里省略了前面的,只为说明构造的逻辑变量(实际应该是s1里面51~100为1,s2里面101~150为1,其它为0)。看一下结果:

    640?wx_fmt=png

    所有变量系数p-value都小于0.05,R-squared:  0.8627,比没有增加逻辑变量的R-squared:  0.8557好一些,可见花的分类确实对花萼长度sl.sc有关系。最终表达式为:

    640?wx_fmt=png

    展开全文
  • 单变量线性回归 绘制散点图 相关系数R 拆分训练集和测试集 多变量线性回归 数据检验(判断是否可以做线性回归) 训练线性回归模型 先甩几个典型的线性回归的模型,帮助大家捡起那些年被忘记的数学。 ● 单...

    目录

    数据导入

    单变量线性回归

    绘制散点图

    相关系数R

    拆分训练集和测试集

    多变量线性回归

    数据检验(判断是否可以做线性回归)

    训练线性回归模型


    先甩几个典型的线性回归的模型,帮助大家捡起那些年被忘记的数学。

    单变量线性回归: h(x)=theta0 + theta1* x 1
    多变量线性回归: h(x)=theta0 + theta1* x 1 + theta2* x 2 + theta3* x 3
    多项式回归:        h(x)=theta0 + theta1* x 1 + theta2* (x2^2) + theta3* (x3^3) 

    多项式回归始终还是线性回归,你可以令x2=x2^2,x3=x3^3,简单的数据处理一下就好了,这样上述多项式回归的模型就变成多变量线性回归的模型了。

    数据导入

    下面我们要开始用数据说话了,先来看看数据源是什么样子吧。

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    from pandas import DataFrame,Series
    from sklearn.cross_validation import train_test_split
    from sklearn.linear_model import LinearRegression
    
    #读取文件
    datafile = u'E:\\pythondata\\dhdhdh.xlsx'#文件所在位置,u为防止路径中有中文名称,此处没有,可以省略
    data = pd.read_excel(datafile)#datafile是excel文件,所以用read_excel,如果是csv文件则用read_csv
    examDf = DataFrame(data)
    examDf.head()

    运行结果:

         Call   Connect    Return
    0  2.1335  1.267760  1.176615
    1  2.5534  1.352941  1.978967
    2  3.3361  1.872093  2.249511
    3  3.3861  1.826667  2.986597
    4  3.9682  1.875000  2.798570

     


    单变量线性回归

     

    绘制散点图

    先将上述数据中的Connect(接通量)和Return(回款量)做一个单变量的线性回归,先绘制一个散点图,大致看一下分布情况。

    #绘制散点图,examDf.jt为X轴,examDf.hk为Y轴
    plt.scatter(examDf.Connect,examDf.Return,color = 'darkgreen',label = "Exam Data")
     
    #添加图的标签(x轴,y轴)
    plt.xlabel("The Connection amount of the average account")#设置X轴标签
    plt.ylabel("The ratio of average return amount")#设置Y轴标签
    plt.show()#显示图像

    运行结果:  

    看来商业中的实际数据总是和课本上的完美数据不一样,看这零零散散的分布,线性关系很是勉强,但是大致还是有一个线性相关的样子的,那么就看看相关系数有多少吧。

    相关系数R

    rDf = examDf.corr()#查看数据间的相关系数
    print(rDf)

    运行结果: 

                 Call   Connect    Return
    Call     1.000000  0.445870  0.441673
    Connect  0.445870  1.000000  0.745338
    Return   0.441673  0.745338  1.000000

    Connect(接通量)和Return(回款量)的相关系数为0.745338,还不错。

    相关系数是用以反映变量之间相关关系密切程度的统计指标,对于相关性强度来说,我们一般认为:

    0~0.3 弱相关

    0.3~0.6  中等程度相关

    0.6~1  强相关

    在数学中,相关系数的计算一般是这样的,给数学狂人看:

    R(相关系数) = X和Y的协方差 / (X的标准差 * Y的标准差) == cov(X,Y)/ σX * σY (即person系数)

    拆分训练集和测试集

    Connect(接通量)和Return(回款量)属于强相关,可以进行线性回归训练,那么我们先来拆分训练集和测试集吧。

    #拆分训练集和测试集(train_test_split是存在与sklearn中的函数)
    X_train,X_test,Y_train,Y_test = train_test_split(examDf.Connect,examDf.Return,train_size=0.8)
    #train为训练数据,test为测试数据,examDf为源数据,train_size 规定了训练数据的占比
     
    print("自变量---源数据:",examDf.Connect.shape, ";  训练集:",X_train.shape, ";  测试集:",X_test.shape)
    print("因变量---源数据:",examDf.Return.shape, ";  训练集:",Y_train.shape, ";  测试集:",Y_test.shape)
     
    #散点图
    plt.scatter(X_train, Y_train, color="darkgreen", label="train data")#训练集为深绿色点
    plt.scatter(X_test, Y_test, color="red", label="test data")#测试集为红色点
     
    #添加标签
    plt.legend(loc=2)#图标位于左上角,即第2象限,类似的,1为右上角,3为左下角,4为右下角
    plt.xlabel("The Connection amount of the average account")#添加 X 轴名称
    plt.ylabel("The ratio of average return amount")#添加 Y 轴名称
    plt.show()#显示散点图

    运行结果:  

    自变量---源数据: (14,) ;  训练集: (11,) ;  测试集: (3,)
    因变量---源数据: (14,) ;  训练集: (11,) ;  测试集: (3,)
    

    回归模型训练

    #调用线性规划包
    model = LinearRegression()
    
    #线性回归训练
    model.fit(X_train,Y_train)#调用线性回归包
    
    a  = model.intercept_#截距
    b = model.coef_#回归系数
    
    #训练数据的预测值
    y_train_pred = model.predict(X_train)
    #绘制最佳拟合线:标签用的是训练数据的预测值y_train_pred
    plt.plot(X_train, y_train_pred, color='blue', linewidth=2, label="best line")
    
    #测试数据散点图
    plt.scatter(X_train, Y_train, color='darkgreen', label="train data")
    plt.scatter(X_test, Y_test, color='red', label="test data")
     
    #添加图标标签
    plt.legend(loc=2)#图标位于左上角,即第2象限,类似的,1为右上角,3为左下角,4为右下角
    plt.xlabel("The Connection amount of the average account")#添加 X 轴名称
    plt.ylabel("The ratio of average return amount")#添加 Y 轴名称
    plt.show()#显示图像
    
    print("拟合参数:截距",a,",回归系数:",b)
    print("最佳拟合线: Y = ",round(a,2),"+",round(b[0],2),"* X")#显示线性方程,并限制参数的小数位为两位
    

    运行结果:  

    拟合参数:截距 -0.7291766860887745 ,回归系数: [1.71584366]
    最佳拟合线: Y =  -0.73 + 1.72 * X

    补充一句,有博友说单变量线性回归上面的这段代码中,加一个reshape就能运行出来了,可能是版本不同,我没加也能运行出来,所以分享在下面给大家参考一下,如果有和博友一样的情况,可以试试增加下面一段代码(谢谢博友 dsy23 的分享):

    
    #调用线性规划包
    model = LinearRegression()
    
    
    #在这里加一段
    X_train = X_train.values.reshape(-1,1)
    X_test = X_test.values.reshape(-1,1)
    
    
    
    #线性回归训练
    model.fit(X_train,Y_train)#调用线性回归包
    
    a  = model.intercept_#截距
    b = model.coef_#回归系数


    多变量线性回归

    在单变量线性回归中,我们将每一步都讲解的极其详细,所以在多变量线性回归中,我们不会重复讲那些简单的部分了,但是为了防止python小白迷失自己,所以在这部分该有的代码还是会甩出来,该有的备注也都有,只不过不会一点一点分步骤来了。

    上面我们提到多变量线性回归的模型为h(x)=theta0 + theta1* x 1 + theta2* x 2 + theta3* x 3,下面,我们还是使用单变量线性回归中的数据,单变量线性回归中,我们只用到了Connect(接通量)和Return(回款量),既然是多变量回归模型,那么我们就多加一个变量Call(拨打量)。

     

    数据检验(判断是否可以做线性回归)

    #-*- coding:utf-8 -*- 
    
    import pandas as pd
    import numpy as np
    import seaborn as sns
    import matplotlib.pyplot as plt
    from pandas import DataFrame,Series
    from sklearn.cross_validation import train_test_split
    from sklearn.linear_model import LinearRegression
    
    #读取文件
    datafile = u'E:\\pythondata\\dhdhdh.xlsx'#文件所在位置,u为防止路径中有中文名称,此处没有,可以省略
    data = pd.read_excel(datafile)#datafile是excel文件,所以用read_excel,如果是csv文件则用read_csv
    examDf = DataFrame(data)
    
    #数据清洗,比如第一列有可能是日期,这样的话我们就只需要从第二列开始的数据,
    #这个情况下,把下面中括号中的0改为1就好,要哪些列取哪些列
    new_examDf = examDf.ix[:,0:]
    
    #检验数据
    print(new_examDf.describe())#数据描述,会显示最值,平均数等信息,可以简单判断数据中是否有异常值
    print(new_examDf[new_examDf.isnull()==True].count())#检验缺失值,若输出为0,说明该列没有缺失值
    
    #输出相关系数,判断是否值得做线性回归模型
    print(new_examDf.corr())#0-0.3弱相关;0.3-0.6中相关;0.6-1强相关;
    
    #通过seaborn添加一条最佳拟合直线和95%的置信带,直观判断相关关系
    sns.pairplot(data, x_vars=['Call','Connect'], y_vars='Return', size=7, aspect=0.8, kind='reg')  
    plt.show()
    

    运行结果:

                Call    Connect     Return
    count  99.000000  99.000000  99.000000
    mean    3.153649   1.967779   2.591121
    std     1.027607   0.470364   0.790172
    min     1.280100   1.014208   0.941292
    25%     2.373528   1.596610   2.044147
    50%     3.040000   1.913472   2.476091
    75%     3.835980   2.253994   3.035603
    max     5.851181   3.234977   5.160840
    Call       0
    Connect    0
    Return     0
    dtype: int64
                 Call   Connect    Return
    Call     1.000000  0.837052  0.744792
    Connect  0.837052  1.000000  0.844640
    Return   0.744792  0.844640  1.000000
    

    判断是否可以做线性回归

    • 异常值:通过最值或者平均数或者中位数等判断,或者直接通过查看是否有游离在大部队之外的点来判断是否有异常值;
    • 空值:这个没办法,你必须看运行结果的10-12行是否等于0,是0则无空值,如果不是0,就要看看是删掉空值呢?还是用其他值代替呢?不同情况不同对待;
    • 相关性:要么通过相关系数的大小判断,要么看散点图中的最佳拟合直线和95%的置信带,直观判断相关关系;

     

    训练线性回归模型

    #拆分训练集和测试集
    X_train,X_test,Y_train,Y_test = train_test_split(new_examDf.ix[:,:2],new_examDf.Return,train_size=0.8)
    #new_examDf.ix[:,:2]取了数据中的前两列为自变量,此处与单变量的不同
     
    print("自变量---源数据:",new_examDf.ix[:,:2].shape, ";  训练集:",X_train.shape, ";  测试集:",X_test.shape)
    print("因变量---源数据:",examDf.Return.shape, ";  训练集:",Y_train.shape, ";  测试集:",Y_test.shape)
    
    #调用线性规划包
    model = LinearRegression()
    
    model.fit(X_train,Y_train)#线性回归训练
    
    a  = model.intercept_#截距
    b = model.coef_#回归系数
    print("拟合参数:截距",a,",回归系数:",b)
    
    #显示线性方程,并限制参数的小数位为两位
    print("最佳拟合线: Y = ",round(a,2),"+",round(b[0],2),"* X1 + ",round(b[1],2),"* X2")
    
    Y_pred = model.predict(X_test)#对测试集数据,用predict函数预测
    
    plt.plot(range(len(Y_pred)),Y_pred,'red', linewidth=2.5,label="predict data")
    plt.plot(range(len(Y_test)),Y_test,'green',label="test data")
    plt.legend(loc=2)
    plt.show()#显示预测值与测试值曲线
    

    运行结果:

    自变量---源数据: (99, 2) ;  训练集: (79, 2) ;  测试集: (20, 2)
    因变量---源数据: (99,) ;  训练集: (79,) ;  测试集: (20,)
    拟合参数:截距 -0.006540954521370601 ,回归系数: [0.08624344 1.19029593]
    最佳拟合线: Y =  -0.01 + 0.09 * X1 +  1.19 * X2

    效果勉强满意,毕竟才用了80个数训练的模型,要求高的话多用一些数据就好。

    除了用 Python 做线性回归,我们还可以使用 SPSS 来做,不用编程,不用各种调参,就是点几下就可以输出结果,更简便!具体操作请参考下面链接里的文章:

    数据建模 - SPSS做多元线性回归 - 分析步骤、输出结果详解、与Python的结果对比 -(SPSS)

     

    【此处是重点】打赏一下发数据!

    https://download.csdn.net/download/weixin_40683253/11890448

     

     

    展开全文
  • 多元统计分析之多元线性回归的R语言实现多元统计分析--multivariate statistical analysis研究客观事物中多个变量之间相互依赖的统计规律性。或从数学上说, 如果个体的观测数据能表为 P维欧几里得空间的点,那么...

    多元统计分析之多元线性回归的R语言实现

    多元统计分析--multivariate statistical analysis

    研究客观事物中多个变量之间相互依赖的统计规律性。或从数学上说, 如果个体的观测数据能表为 P维欧几里得空间的点,那么这样的数据叫做多元数据,而分析多元数据的统计方法就叫做多元统计分析 。

    重要的多元统计分析方法有:多重回归分析、判别分析、聚类分析、主成分分析、对应分析、因子分析、典型相关分析、多元方差分析等。

    多元线性回归(普通最小二乘法)

    用来确定2个或2个以上变量间关系的统计分析方法。多元线性回归的基本的分析方法与一元线性回归方法是类似的,我们首先需要对选取多元数据集并定义数学模型,然后进行参数估计,对估计出来的参数进行显著性检验,残差分析,异常点检测,最后确定回归方程进行模型预测。(1)做个简单线性回归热热身

    women#使用自带的woman数据集

    73256c5d7cb5eb7f87086b59a6eee36e.png

    fit

    summary(fit)#展示拟合模型的详细信息

    f93a81ef002ab5822e7ee66fe145d423.png

    women$weight#列出真值

    fitted(fit)#列出拟合模型的预测值

    e0faf1b0472f636e172aa8712bda180a.png

    residuals(fit)#列出拟合模型的残差值

    coefficients(fit)#列出拟合模型的模型参数

    confint(fit)#列出拟合模型参数的置信区间

    anova(fit)#生成一个拟合模型的方差分析表,或者比较两个或更多拟合模型的方差分析表

    0f831a1975921a5cbbc98492840a245b.png

    vcov(fit)#列出拟合模型的协方差矩阵

    0a3d79292dc6282e3d0e0368f6c54b33.png

    par(mfrow=c(2,2))

    plot(fit)

    675e67d54477f104860cd83c14957059.png

    plot(women$height,women$weight,

         xlab="Height (in inches)",

         ylab="Weight (in pounds)")#生成观测,变量散点图

    abline(fit)#给散点图加上拟合曲线

    2fa029fce2461d7f0b16ed158834d30d.png

    (2)多项式回归

    fit2=lm(weight~height+I(height^2),data=women)#I(height^2)表示向预测等式添加一个平方项

    summary(fit2)

    plot(women$height,women$weight,

         xlab="Height (in inches)",

         ylab="Weight (in pounds)")

    lines(women$height,fitted(fit2))

    b02ba95c21a17fa09eb0e1934d43b829.png c7dbc2226bbf82ee55b5a47b379eaa7b.png

    fit3=lm(weight~height+I(height^2)+I(height^3),data=women)

    summary(fit3)

    lines(women$height,fitted(fit3),col="red")

    b43525dea3adb41fba3ffb197d84a8e3.png 87082649fe85ae4d3e19e86fbdd01fdc.png

    #使用car包的scatterplot()函数

    install.packages("car")

    library(car)

    library(carData)

    scatterplot(weight~height,data=women,

                spread=FALSE,smooth.args=list(lty=2),pch=19,

                main="Women Age 30-39",

                xlab="Height (in inches)",

                ylab="Weight (in pounds)")

    #该函数提供了身高与体重的散点图,线性拟合曲线以及平滑拟合曲线(loess),每个轴还展示了两个变量的箱线图。

    b313445f4f7457b14535b55d61cf481b.png

    (3)多元线性回归

    states

    cor(states)#检查一下各变量之间的相关性

    6c9f387aa09efadaaf3a72b327696939.png

    scatterplotMatrix(states,spread=FALSE,smooth.args=list(lty=2),pch=19,main="scatterplot matrix")

    #非对角线位置绘制变量间的散点图,并添加平滑和线性回归图

    #对角线区域绘制每个变量对应的密度图和轴须图

    ff72eb8cf2d8ab50fbcff97eb3ef7b62.png

    #使用lm函数进行没有交互项多元线性回归的拟合

    states

    fit=lm(Murder~Population+Illiteracy+Income+Frost,data=states)

    summary(fit)

    b52ccfdc2546bc10ff7ac0c02a18dcd6.png

    #使用lm函数进行有交互项多元线性回归的拟合

    fit

    summary(fit)

    e93a9eb6f4704bc44b9cb778134ea256.png

    交互项也是显著的,说明相应变量与其中一个预测变量之间的关系依赖于另一个预测变量。

    (4)回归诊断--常规方法

    fit

    par(mfrow=c(2,2))

    plot(fit)

    R vs F图:如果自变量和因变量线性相关,残差值和拟合值之间没有任何系统联系,如果是一条清楚的曲线,可能在暗示要在拟合的时候加上多次项

    正态QQ图:当自变量的值固定时,因变量应该成正态分布,残差值也应该是一个均值为0的正态分布,如果满足假设,图上的点应该都落在一条45度的直线上

    scale-location图:如果满足方差不变的假设,图中水平线周围的点应该随机分布

    Residuals vs leverage图:鉴别离群点,高杠杆值点,强影响点。

    675e67d54477f104860cd83c14957059.png

    加上多次项的拟合结果

    fit2

    par(mfrow=c(2,2))

    plot(fit2)

    879d9068a6b4f4cf39c1be79700947a5.png

    13和15是强影响点,可以去除强影响点。

    fit2

    再对数据集state.x77进行试验

    states=as.data.frame(state.x77[,c("Murder","Population","Illiteracy","Income","Frost")])

    fit=lm(Murder~Population+Illiteracy+Income+Frost,data=states)

    par(mfrow=c(2,2))

    plot(fit)

    3e4544349ac2010a33a21617181aa01b.png

    (5)回归诊断--改进方法

    library(car)

    states=as.data.frame(state.x77[,c("Murder","Population","Illiteracy","Income","Frost")])

    fit=lm(Murder~Population+Illiteracy+Income+Frost,data=states)

    par(mfrow=c(1,1))

    qqPlot(fit,labels=row.names(states),id.method="identify",simulate=TRUE,main="Q-Q Plot")

    states["Nevada",]

    fitted(fit)["Nevada"]

    residuals(fit)["Nevada"]

    rstudent(fit)["Nevada"]

    a1db86692e5eb2a2e6276dcd2136b67a.png c7614853096ffe75c77d2e1f7cda3bae.png

    学生化残差

    residplot

      z

      hist(z,breaks=nbreaks,freq=FALSE,

           xlab="Studentized Residual",

           main="Distribution of Errors")

      rug(jitter(z),col="brown")

     curve(dnorm(x,mean=mean(z),sd=sd(z)),add=TRUE,col="blue",lwd=2)

      lines(density(z)$x,density(z)$y,

            col="red",lwd=2,lty=2)

      legend("topright",

             legend=c("Normal Curve","Kernel Density Curve"),

             lty=1:2,col=c("blue","red"),cex=.8)

    }

    residplot(fit)

    c25bbd08dd5cf247c3e9e44a3a9aa732.png

    除了一个很明显的离群点,误差很好地服从了正态分布。

    误差的独立性

    durbinWatsonTest(fit)

    crPlots(fit)

    p值显著说明无自相关性,误差项之间独立。滞后项(lag=1)表明数据集中每个数据都是与其后一个数据进行比较。

    通过成分残差图可以看因变量和自变量之间是否成非线性关系。

    688dfebc360234a767c7fccc540f1880.png dc58e42a1e72c8b6bd2f120d55ec94f5.png

    同方差性

    ncvTest(fit)

    spreadLevelPlot(fit)

    分布水平图的点随机分布在直线的周围,如假设不正确,将看到曲线。

    下图说明P值不显著,满足方差不变假设

    d609d3435362504b718759ebe7f3c8e8.png

    线性模型假设的综合验证

    install.packages("gvlma")

    library(gvlma)

    gvmodel

    summary(gvmodel)

    下图表示P值都不显著,满足假设条件。

    5c49bb53a95f343fb597615aff0fd692.png

    多重共线性

    library(car)

    vif(fit)

    sqrt(vif(fit))#如果>2,表明存在多重共线性问题

    d5890fe2af78168a74c4e1dbebbda1fd.png

    (6)异常观测值

    a.离群点:预测效果不佳的观测,有很大的或正或负的残差值。正代表模型低估了响应值,负代表模型高估了响应值

    library(car)

    outlierTest(fit)

    返回值Nevada,P值小于0.05,判定为离群点。

           rstudent               unadjusted p-value     Bonferonni p

           Nevada 3.542929         0.00095088     0.047544

    b.高杠杆点:与其他变量相关的离群点

    hat.plot

      p

      n

      plot(hatvalues(fit),main="Index Plot of Hat Values")

      abline(h=c(2,3)*p/n,col="red",lty=2)

      identify(1:n,hatvalues(fit),names(hatvalues(fit)))

    }

    hat.plot(fit)

    5e41c6a6fdc0991d82b098e5d0f1a0d0.png

    c.强影响点:模型估计参数值影响有些比例失衡的点,方法是测量Cook距离,可通过变量添加图得出。

    一般来讲,Cook距离大于4/(n-k-1),表明是强影响点。

    n——样本量大小,K——预测变量数目

    cutoff

    plot(fit,which=4,cook,levels=cutoff)

    abline(h=cutoff,lty=2,col="red")

    下图中高于水平线的是强影响点

    d6de2a1b02945eb8095736f635ffe891.png

    d.变量添加图:三种点都可以显现出来

    library(car)

    avPlots(fit,ask=FALSE,id.method="identify")

    00ef59878d989f2c4b7f4d3a5a42e84f.png

    整合到一张图

    library(car)

    influencePlot(fit,id.method="identify",main="Influent Plot",

                  sub="Circle size is proportional to Cook's distance")

    纵坐标超过正负2的被认为是离群点,水平轴超过0.2或0.3的被认为是高杠杆点,圆圈大的被认为是强影响点。

    8d44b83dc3c51f0fa90d543607e26236.png

    (7)处理违背回归假设的问题

    a.删除变量:离群点和强影响点

    b.变量变换:当模型违反正态假设时

    library(car)

    summary(powerTransform(states$Murder))

    4ae3203ade0cd5dc426a1d48045c7e3e.png

    结果表明可以用Murder^0.6来正态化Murder,该函数使用极大似然法正态化变量

    library(car)

    boxTidwell(Murder~Population+Illiteracy,data=states)

               MLE of lambda  Score Statistic (z) Pr(>|z|)

    Population   0.86939             -0.3228   0.7468

    Illiteracy       1.35812              0.6194   0.5357

    iterations =  19 

    结果显示使用Population0.86939和Illiteracy1.35812可以大大改善线性关系。但对二者的记分检验又表明不会不需要变换。p值比较大。

    c.增删变量:改变模型的变量数目可以影响变量的拟合优度——多重共线的变量要删掉

    (8)选择最佳的回归模型

    a.模型比较:

    a1. anova()函数,需要模型嵌套

    states=as.data.frame(state.x77[,c("Murder","Population","Illiteracy","Income","Frost")])

    fit1=lm(Murder~Population+Illiteracy+Income+Frost,data=states)

    fit2=lm(Murder~Population+Illiteracy,data=states)

    anova(fit1,fit2)

    28adaeb8be5768a6a7d36dfdfabc182a.png

    anova将两个回归模型进行比较,p值(0.9939)不显著,所以不需要加到模型中。

    a2. AIC(赤池信息准则):考虑模型的统计拟合优度,AIC值小的要优先选择。

    states=as.data.frame(state.x77[,c("Murder","Population","Illiteracy","Income","Frost")])

    fit1=lm(Murder~Population+Illiteracy+Income+Frost,data=states)

    fit2=lm(Murder~Population+Illiteracy,data=states)

    AIC(fit1,fit2)

            df      AIC

    fit1  6   241.6429

    fit2  4   237.6565

    根据AIC值选择fit2,不需要模型嵌套。

    b.变量选择:

    b1. 逐步回归法:模型每次增加(向前)或者删除(向后)一个变量,直到达到某个判停条件为止。

    library(MASS)

    states=as.data.frame(state.x77[,c("Murder","Population","Illiteracy","Income","Frost")])

    fit=lm(Murder~Population+Illiteracy+Income+Frost,data=states)

    stepAIC(fit,direction = "backward")

    40a876967664111af635eb9f6176a7f8.png

    开始模型删除一个变量之后,AIC值降低,再删除一个变量之后,AIC值变低,最后剩下两个变量。弊端:不能找到最佳的

    b2. 全子集回归法:所有可能的模型都会被检验。

    install.packages("leaps")

    library(leaps)

    states=as.data.frame(state.x77[,c("Murder","Population","Illiteracy","Income","Frost")])

    leaps=regsubsets(Murder~Population+Illiteracy+Income+Frost,data=states,nbest=4)

    leaps

    plot(leaps,scale="adjr2")

    7e304e6ab60be3cd9b09d5c631c45d79.png

    图中的0.33表示截距项与income变量模型调整R平方0.33,可以看出截距项和P和I的调整模型R平方和最大,模型最佳

    or:

    library(car)

    subsets(leaps,statistic="cp",main="Cp Plot for All Subsets Regression")

    abline(1,1,lty=2,col="red")

    d0c0349844c925d836381f3fd5d189cd.png

    越好的模型离截距和斜率都为1的红线最近。

    (9)深层次分析

    a.交叉验证:最小二乘法的目的时预测误差(残差)平方和最小,响应变量解释度(R平方)最大化,交叉验证法可以评定该回归模型的泛化能力。

    定义:将一定的数据挑选出来作为训练样本,其他的数据作为保留样本,现在训练样本中做回归,再在保留样本中做预测

    install.packages("bootstrap")

    library(bootstrap)

    shrinkage

      require(bootstrap)

      theta.fit

        lsfit(x,y)

      }

      theta.predict

      x

      y

      results

      r2

      r2cv

      cat("Original R-square=",r2,"\n")

      cat(k,"Fold Cross-Validated R-square=",r2cv,"\n")

      cat("Change=",r2-r2cv,"\n")

    }

    states

    fit

    shrinkage(fit)

    结果:

    Original R-square= 0.5669502 

    10 Fold Cross-Validated R-square= 0.4642092 

    Change= 0.1027411 

    验证后的R值更客观,验证前过于乐观,R值较大。

    fit2

    shrinkage(fit2)

    验证前后R方变化不大,说明模型预测较为精确。

    b.相对重要性:比较标准化回归系数,表示当其他预测变量不变时,该预测变量一个标准差的变化可yying引起响应值的变化。

    在回归分析前,先将数据集用scale函数标准化为均值为0,标准差1的矩阵,再转化为数据框进行回归分析。

    states=as.data.frame(state.x77[,c("Murder","Population","Illiteracy","Income","Frost")])

    zstates=as.data.frame(scale(states))

    zfit=lm(Murder~Population+Illiteracy+Income+Frost,data=ztates)

    coef(zfit)

    结果:

      (Intercept)    Population    Illiteracy        Income         Frost 

    -2.054026e-16  2.705095e-01  6.840496e-01  1.072372e-02  8.185407e-03 

    结果显示:人口和文盲率对谋杀率的影响很大,而Frost的影响率很小。

    c.相对权重法:将相对重要性看成是每个预测变量对R平方的贡献大小。

    relweight

      R

      nvar

      rxx

      rxy

      svd

      evec

      ev

      delta

      lambda

      lambdasq

      beta

      rsquare

      rawwgt

      import

      import

      row.names(import)

      names(import)

      import

      dotchart(import$Weights,labels = row.names(import),

               xlab="% of R-Square",pch=19,

               main="Relative Importance of Predictor Variables",

               sub=paste("Total R-Square=",round(rsquare,digit=3))

      )

    }

    states

    fit

    relweight(fit,col="grey")

    df64c82db953c3801711b61013dfa2ac.png

    结果显示,文盲率对谋杀率的影响最大,其次是结冰率。

    展开全文
  • R语言与多元线性回归+逐步回归

    万次阅读 多人点赞 2019-11-16 12:31:12
    多元线性回归 多元线性回归的核心问题:应该选择哪些变量??? RSS(残差平方和)与R2 (相关系数的平方)选择法:遍历所有可能的组合,选出使RSS最小,R2最大的模型。 AIC(Akaike Information Criterion)准则与...

    多元线性回归

    多元线性回归的核心问题:应该选择哪些变量???

    • RSS(残差平方和)与R2  (相关系数的平方)选择法:遍历所有可能的组合,选出使RSS最小,R2  最大的模型。
    • AIC(Akaike Information Criterion)准则与BIC(Bayesian Information Criterion)准则

    AIC = n ln (RSSp/n)+2p

    其中:n为变量总个数,p为选出的变量个数(AIC越小越好

    逐步回归

    • 向前引入法:从一元回归开始,逐步增加变量,使指标变量达到最优为止
    • 向后剔除法:从全变量回归方程开始,逐步删去某个变量,使指标到达最优为止
    • 逐步筛选法:综合上述两种方法

    step函数

    image

    根据上图中对该数据集作出的线性回归模型的各个统计量进行分析发现:

    • 在该数据集中的EXAMINATION变量与模型的相关性中没有一个*,从而表示,该变量与该模型没有相关性,可以去除。
    • 模型拟合的相关系数的平方值为:0.7067

    这里使用step函数,R会自动计算原始模型的AIC数值和去除各个变量后AIC的变化情况,从而找到去除模型无关变量,作出更为准确的线性回归模型。

    image

    因为第一次作出的线性回归模型为全变量的模型,所以这里使用step进行逐步回归的时候,只能使用backward或者both方法进行逐步回归。从而得到在去除无关变量EXAMINATION变量后,得到一个拟合效果更好的线性回归模型。

    image

    逐步回归计算实例

    例 6.10 某种水泥在凝固时放出的热量Y(卡/克)与水泥中四种化学成分X1,X2,X3,X4有关,现测得13组数据,如表6.5所示。希望从中选取重要的变量,建立Y关于它们的线性回归方程。

    image

    分析步骤:

    首先作出多元线性回归方程,建立所有变量的回归模型

    image

    从上述建立的回归模型可知,从X1到X4四个变量的“显著性检验”一个*都没有。可见,如果选择全部变量做回归方程,效果是很不好的。

    下面使用函数step()做逐步回归:

    image

    使用step方法处理后的结果如下:

    image

    在使用step函数进行处理的时候,最后一步的操作,无论去掉哪一个变量,AIC值均会升高,因此R软件终止计算,得到了“最优”的回归方程

    可见,现在变量X1,X2,X4的“显著性检验”发生了好转。虽然R2也达到了0.9823,但仍然有不足。在R软件中,还有两个函数可以用来做逐步回归。这两个函数是add1()和drop1():

    image

    从运算结果来看,如果去掉变量X4,AIC值会从24.97增加到25.42,是增加的最少的。另外,除AIC准则外,残差的平方和也是逐步回归的重要指标之一,从直观来看,拟合越好的方程,残差的平方和应越小。去掉X4,残差的平方和上升9.93,也是最少的。因此,从这两个指标来看,应该再去掉变量X4.

    image

    这个结果应该还是满意的,因为所有的检验均是显著的,最后得到“最优”。

    展开全文
  • 多元线性回归

    千次阅读 2018-04-05 13:30:55
    什么是多元线性回归?  在线性回归分析中,如果有两个或两个以上的自变量,就称为多元线性回归(multivariable linear regression)。如果我们要预测一套房子的价格,影响房子价格的因素可能包括:面积、卧室数量...
  • 多元线性回归建模 文章大纲 (Article Outline) Dataset description 数据集描述 Exploratory data analysis 探索性数据分析 A simple linear regression model fitting 简单的线性回归模型拟合 Model interpretation...
  • SPSS多元线性回归输出结果的详细解释

    万次阅读 多人点赞 2017-06-27 17:41:05
    最近做了一些用SPSS进行线性回归的实验,还是感觉很多细节把握不好,这里结合我的实验结果,以及网上别人的介绍总结一下,先贴几张SPSS的输出: 下面简单解释一下这三张图中的结果: 第一个表模型汇总表中,...
  • 多元线性回归总结

    万次阅读 2018-10-26 10:51:45
    1.多元线性回归模型 1.1多元线性回归形式 相对上一篇文章之中的一元线性回归,多元线性回归的主要特点是,自变量不再是一组数据,而是由多于一组以上的数据作为自变量。所以,多元线性回归的模型形式为: 其中...
  • 原始数据在这里 1.观察数据 首先,用Pandas打开数据,并进行观察... 以上这篇关于多元线性回归分析——Python&SPSS就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。 时间: 2020-02-23
  • R多元线性回归

    千次阅读 2016-05-31 15:56:18
    多元线性回归 统计建模与R软件-薛毅书p325 选择自变量 建立多元线性模型 > data(swiss) > s=lm(Fertility~ .,data=swiss) #除因变量Fertility其他所有当自变量 > print(s) 模型汇总信息 > summary(s) #查看相关性...
  • 多元线性回归程序(vb)

    热门讨论 2012-07-03 15:17:54
    多元线性回归
  • 多元线性回归分析

    2021-08-07 20:34:33
    多元线性回归分析 回归分析是数据分析中最基础也是最重要的分析工具,绝大多数的数据分析问题,都可以使用回归的思想来解决。回归分析的任务就是,通过研究自变量X和因变量Y的相关关系,尝试去解释Y的形成机制,进而...
  • 上期我们分享了,有同学留言想了解matlab多元线性回归,安排!回归分析(regressionanalysis)回归分析是确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,运用十分广泛。回归分析按照涉及的变量的多少...
  • 本文使用 R 语言,对各个影响因素的相关性进行了筛选分析,并采用逐步回归法得到了最优的多元线性回归模型。在讨论中,对线性回归模型的回归显著性以及拟合优度进行了检验,最后使用最优的多元线性回归模型对波士顿...
  • 多元线性回归-EViews

    千次阅读 2019-09-25 18:42:20
    分享经典书籍:A Modern Approach to Regression with R....多元线性回归 掌握多元线性回归模型的估计方法、掌握多重共线性模型的识别和修正。 多元线性回归模型,并识别和修正多重共线性。 普通最小二乘法、简单...
  • 关于线性回归的分析思路及操作步骤,可阅读下方链接文章:①问题一:SPSSAU多元线性回归在哪儿?【通用方法】--【线性回归】。当考察一个自变量对因变量的影响称为一元线性回归,多于一个自变量的情况称为多元线性...
  • 四、一元线性回归 1. 预测函数 输入 输出 0 1 1 3 2 5 3 7 4 9 … … 预测函数为:y=1+2xy=1+2xy=1+2x 预测:输入10;输出21 y=w0+w1xy=w_0+w_1xy=w0​+w1​x,任务就是寻找预测函数中的...
  • 在这种情况下可用逐步回归分析,进行x因子的筛选,这样建立的多元回归模型预测效果会更好。 可以解决的实际问题: 收入水平与受教育程度、所在行业、工作 年限、工作种类的关系。 公路客运量与人口增长量、私家...
  • 4、spss做多元线性回归

    千次阅读 2015-04-15 15:19:34
    回归一直是个很重要的主题。因为在数据分析的领域里边,模型重要的也是主要...本文主要讨论多元线性回归(包括一般多元回归,含有虚拟变量的多元回归,以及一点广义差分的知识)。请大家不要觉得本人偷奸耍滑,居然只有
  • 参考书籍:1、《应用多元统计分析》高惠璇 1、表达式 用来研究因变量Y和m个自变量的相关关系(一共有n个样本,) 矩阵表示为: 记为或 2、回归方程和回归系数的显著性检验 2.1 回归方程的显著性检验(又...
  • 多元线性回归分析理论详解及SPSS结果分析

    万次阅读 多人点赞 2017-05-17 16:23:23
    当影响因变量的因素是多个时候,这种一个变量同时与多个变量的回归问题就是多元回归,分为:多元线性回归和多元非线性回归。这里直说多元线性回归。对比一元线性回归: 1.1多元回归模型: y=β0+β1x1+β2x2+…+β...
  • 多元线性回归模型检验-续上篇

    千次阅读 2020-04-04 20:42:46
    其实上一篇讨论的多元线性回归还不是很全面,而且训练和测试集都没有分,在这里继续讨论多元线性回归模型检验的相关问题。 多元线性回归的输出变量是连续变量,输入变量中如果包含离散变量需要做哑变量或One-hot编码...
  • 经典线性模型自变量的线性预测就是因变量的估计值。 广义线性模型:自变量的线性预测的函数是因变量的...1.线性回归原理 其中,为偏置参数,M为特征数目,为基函数(径向基函数(rbf)、sigmoid基函数等), 特...
  • spss进行多元线性回归并分析表格

    万次阅读 多人点赞 2019-04-01 00:50:26
    1.如何使用spss进行多元线性回归。 2.分析生成结果,并判断回归是否可行。 一、使用spss进行多元线性回归: 1.输入数据 2. 3. 4. 5. 6. 二、表格结果分析: R方是检验回归是否成功的重要要素...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,468
精华内容 1,787
关键字:

逐步多元线性回归