利用python进行回归分析

通常大家会认为曲线拟合和回归分析类似,但其实回归分析中是包含曲线拟合的。拟合是研究因变量和自变量的函数关系的。而回归是研究随机变量间的相关关系的。拟合侧重于调整参数,使得与给出的数据相符合。而回归则是侧重于研究变量的关系,对拟合问题做统计分析。

一元线性回归

一元线性回归模型的一般形式

数据通常呈一条直线,则y和x之间的关系通常可以看做近似线性关系。但是一般来说这些数据点并不在一条直线上,这说明y和x的关系并没有确切到给定x就可以唯一确定y的程度。其实y还受到很多因素的影响。如果主要研究y和x的关系,可以假设有如下关系。

gif.latex?y%3D%5Cbeta%20_%7B0%7D+%5Cbeta%20_%7B1%7Dx+%5Cxi

(1)gif.latex?%5Cbeta%20_%7B0%7D%2C%5Cbeta%20_%7B1%7D为未知待定常数称为回归系数,gif.latex?%5Cxi是其他随机因素对y的影响,并且服从gif.latex?N%280%2C%5Csigma%20%5E%7B2%7D%29分布。

2)对于参数gif.latex?%5Cbeta%20_%7B0%7D%2C%5Cbeta%20_%7B1%7D的估计有多重方法,一方面我们可以使用拟合的方法去估计参数,另一方面我们可以用最小二乘法进行参数的估计。

最小二乘法:使得回归模型和直线方程gif.latex?y%3D%5Cbeta%20_%7B0%7D+%5Cbeta%20_%7B1%7Dx所在的所有数据点都比较接近。

gif.latex?Q%3D%5Csum_%7Bi%3D1%7D%5E%7Bn%7D%28y_%7Bi%7D-%5Cbeta%20_%7B0%7D-x%5Cbeta%20_%7B0%7D%29%5E%7B2%7D,我们为了求得最小Q,对这个式子求导最终计算出gif.latex?%5Cbeta%20_%7B0%7D%2C%5Cbeta%20_%7B1%7D

gif.latex?%5Cbeta%20%5E%7B%5Chat%7B%7D%7D_%7B1%7D%3D%5Cfrac%7BL_%7Bxy%20%7D%7D%7BL_%7Bxx%7D%7Dgif.latex?%5Cbeta%20_%7B0%7D%5Chat%7B%7D%3Dy%5E%7B-%7D-%5Cbeta%20_%7B1%7D%5Chat%7B%7Dx%5E%7B-%7Dgif.latex?L_%7Bxy%7D%3D%5Cfrac%7B1%7D%7Bn%7D%5Csum_%7Bi%3D1%7D%5E%7Bn%7D%28x_%7Bi%7D-x%5E%7B-%7D%29%28y_%7Bi%7D-y%5E%7B-%7D%29gif.latex?L_%7Bxx%7D%3D%5Cfrac%7B1%7D%7Bn%7D%5Csum_%7Bi%3D1%7D%5E%7Bn%7D%28x_%7Bi%7D-x%5E%7B-%7D%29%28x_%7Bi%7D-x%5E%7B-%7D%29

(3)相关性检验,拟合优度和剩余标准差:

gif.latex?SST%3DL_%7Bxy%7D%3D%5Csum_%7Bi%3D1%7D%5E%7Bn%7D%28y_%7Bi%7D-y%5E%7B-%7D%29%5E%7B2%7D,这是原始数据的总变异平方和。

gif.latex?SSR%3D%5Csum_%7Bi%3D1%7D%5E%7Bn%7D%28y_%7Bi%7D%5Chat%7B%7D-y%5E%7B-%7D%29%5E%7B2%7D,拟合直线可解释的变异平方和。

gif.latex?SSE%3D%5Csum_%7Bi%3D1%7D%5E%7Bn%7D%28y_%7Bi%7D-y_%7Bi%7D%5Chat%7B%7D%29%5E%7B2%7D,残差平方和。

由公式推导可以证明有:gif.latex?SST%3DSSR+SSE

对于一个具体的样本来说,gif.latex?SST是一个定值。所以可解释变异gif.latex?SSR越大,则必有残差平方和gif.latex?SSE越小。这个式子可以从两个方面解释拟合程度的优良。

(1)gif.latex?SSR越大,在回归方程中解释因变量得变异部分越大,回归方程对原始数据的解释越好。

(2)gif.latex?SSE越小,观测值围绕回归直线越紧密,回归方程对源数据的拟合程度越好,

 因此定义一个测量标量来说明回归方程对原始数据的拟合程度,这个系数叫拟合优度。拟合优度是指可解释变异占总体变异的百分比,用gif.latex?R%5E%7B2%7D表示。有:

gif.latex?R%5E%7B2%7D%3D%5Cfrac%7BSSR%7D%7BSST%7D%3D1-%5Cfrac%7BSSE%7D%7BSST%7D%3D%5Cfrac%7BL_%7Bxy%7D%7D%7BL_%7Bxx%7DL_%7Byy%7D%7D

gif.latex?R%5E%7B2%7D有以下简单的性质:

(1)gif.latex?0%5Cleqslant%20R%5E%7B2%7D%5Cleq%201

(2)当gif.latex?R%5E%7B2%7D=1时,有gif.latex?SSR%3DSST,此时原数据的变异程度完全可以由拟合值的变异来解释,且残差为0(gif.latex?SSE%3D0),即原数据和拟合点完全吻合。

(3) 当gif.latex?R%5E%7B2%7D=0时,此时的回归方程完全不能解释原数据的总变异,且残差为0(gif.latex?SSE%3D0),即y得变异和x完全无关。

 ( 4)回归方程的显著检验

在以上的讨论中,我们假设y是关于x的回归方程gif.latex?f%28x%29具有形式gif.latex?%5Cbeta%20_%7B0%7D+%5Cbeta%20_%7B1%7Dx。在实际中,需要检验gif.latex?f%28x%29是否为x的线性函数,若gif.latex?f%28x%29与x成线性函数为真,则gif.latex?%5Cbeta%20_%7B1%7D 不为0,如果gif.latex?%5Cbeta%20_%7B1%7D为0,则y和x就无线性关系,所以我们需要进行假设检验。 

提出假设:gif.latex?H_%7B0%7D:gif.latex?%5Cbeta%20_%7B1%7D%3D0,gif.latex?H_%7B1%7Dgif.latex?%5Cbeta%20_%7B1%7D%5Cneq%200

如果接受原假设gif.latex?H_%7B0%7D,则说明回归结果不显著,否则回归结果显著。

求解可到gif.latex?H_%7B0%7D的拒绝域为:2%7D%28n-2%29

 如果满足gif.latex?H_%7B0%7D拒绝域条件,则可以在一定的置信水平上认为线性回归结果显著。

gif.latex?%5Csigma%20%5E%7B2%7D%3D%5Cfrac%7BSSE%7D%7Bn-2%7D2%7D%28n-2%29可以通过查表或者利用软件查出,gif.latex?%5Calpha是检验水平。

当回归效果显著的时候:

可以对系数gif.latex?%5Cbeta%20_%7B1%7D做置信区间估计,系数gif.latex?%5Cbeta%20_%7B1%7D的置信区间为2%7D%28n-2%29*%5Cfrac%7B%5Csigma%20%7D%7B%5Csqrt%7BL_%7Bxx%7D%7D%7D%29

 同理得到相应gif.latex?%5Cbeta%20_%7B0%7D的置信区间,2%7D%28n-2%29*%5Cfrac%7B%5Csigma%20x%5E%7B-%7D%7D%7B%5Csqrt%7BL_%7Bxx%7D%7D%7D%29

点预测和预测区间:

假设gif.latex?Ygif.latex?x%3Dx_%7B0%7D的处的观察结果,gif.latex?Y_%7B0%7D是利用回归方程计算的观察值。在给定的置信区间中,

2%7D%28n-2%29%5Csigma%20%5Chat%7B%7D%5Csqrt%7B1+%5Cfrac%7B1%7D%7Bn%7D+%5Cfrac%7B%28x_%7B0%7D-x%5E%7B-%7D%29%5E%7B2%7D%7D%7BL_%7Bxx%7D%7D%7D%29

这意味着对于观察值gif.latex?Y_%7B0%7D,有gif.latex?1-%5Calpha的把握认为gif.latex?Y_%7B0%7D在区间中。

 例子:合金强度y和其中一个碳含量x有比较密切的关系,今从生产中收集了一批数据如表所示,试拟合一个函数gif.latex?y%3Df%28x%29,并且对回归模型进行检验。

x0.100.110.120.130.140.150.160.170.180.200.220.24
y42.042.545.045.545.047.549.051.050.055.057.559.5

首先我们将图像的散点图画出来,判断使用哪一类方程进行拟合,然后求出方程的未知系数。然后对方程进行拟合优度的检验,最后对系数进行拟合优度的判断。

import pylab as pl
import numpy as np
import statsmodels.api as sm
x = np.array([0.10, 0.11, 0.12, 0.13, 0.14, 0.15, 0.16, 0.17, 0.18, 0.20, 0.22, 0.24])
y = np.array([42.0, 42.5, 45.0, 45.5, 45.0, 47.5, 49.0, 51.0, 50.0, 55.0, 57.5, 59.5])
def sp(a,b):
    pl.plot(a, b, 'o', color='black')
    pl.show()
def main(d):
    re=sm.formula.ols('y~x',d).fit()
    print(re.summary())
sp(x,y)
x1=x;x1=np.delete(x1,[8,4]);y1=y;y1=np.delete(y1,[8,4])
d={'x':x1,'y':y1}
main(d)

(1)这里首先介绍一下基于公式构建并拟合模型的调用公式,调用格式为:

import statsmodels.api as sm
sm.formula.ols(formula,data=df).fit()

这当中formula是引号括起来的公式,df为数据框或字典格式的数据。使用方法summary获取一个关于此回归的统计检验。

(2)我们在进行数据拟合时通常需要对异常值进行剔除,这里是利用t检验将样本中的异常值进行了剔除:

print(re.outlier_test())

注意:通常使用这个函数,样本数量最好大于20个。

多元线性回归

当自变量的个数多余一个时,回归模型是关于自变量的线性表达形式,则称此模型为多元线性回归,数学模型可以表达为:y=\beta _{0}+\beta _{1}x_{x}+....+\beta _{m}x_{m}+\varepsilon

 式中:\beta _{0},\beta _{1},.....\beta _{m}为回归系数;\varepsilon为随机误差,服从正态分布N(0,\sigma ^{2}),\sigma未知。

回归分析的主要步骤是:

(1)由观测值确定参数(回归系数)\beta _{0},\beta _{1},.....\beta _{m}的估计值b_{0},b_{1}....,b_{m}

(2)对线性关系,自变量的显著性进行统计检验

(3)利用回归方程进行预测。

(1) 确定参数

对于模型式y=\beta _{0}+\beta _{1}x_{x}+....+\beta _{m}x_{m}+\varepsilon中的参数\beta _{0},\beta _{1},.....\beta _{m}用最小二乘法估计,即选取b_{i},使得误差平方和最小。原理和上面一元线性回归模型类似,在这里不过多介绍。

(2) 统计检验

前面是在假设随机变量y和变量x_{1},x_{2},....x_{m}j具有线性关系的条件下建立线性回归方程,但是变量y与变量x_{1},x_{2},....x_{m}是否为线性关系?所有的变量x_{1},x_{2},....x_{m}对变量y是否有影响?都需要做统计检验。

对于总平方SST=\sum_{i=1}^{n}(y_{i}-y\hat{})^{2},有SST=SSE+SSR,SSE是定义的残差平方和,反映随机误差对y的影响;SSR=\sum_{i=1}^{n}(y_{i}\hat{}-y\bar{})^{2}称回归平方和,反映自变量对y的影响。这里y\bar{}是因变量的均值。,其中SST的自由度df_{T}=n-1,SSE的自由度df_{E}=n-m-1,SSR的自由度df_{R}=m

因变量y与自变量x_{1},x_{2},....x_{m}之间是否存在线性规关系是需要检验的,显然如果所有\left | \beta _{j}\hat{} \right |都很小,y和x_{1},x_{2},....x_{m}的线性关系就不明显,所以我们可令原假设为

H_{0}:\beta _{1}=\beta _{2}=....=\beta _{3}

H_{0}成立时有分解式定义的SSE,SSR满足

F=\frac{SSR/m}{SSE/(n-m-1)}~F(m,n-m-1)

在显著性水平\alpha上,有上\alpha分位数F_{\alpha }(m,n-m-1),若F>F_{\alpha }(m,n-m-1)回归方程效果显著,若F<F_{\alpha }(m,n-m-1),回归效果不显著。

注:

1.当y和x_{1},x_{2},....x_{m}的关系不明显时,可能存在非线性关系,例如平方关系。

2.这里的F分布检验直接针对这个模型的所有系数,也就说当这个模型的回归效果显著时,依旧有可能某个自变量与y是不相关的,因此我们还需要对各个回归系数做假设检验,这里使用的是t检验。

上面在一元回归中已经有过定义在这里就不在详述。

(3)回归方程的预测

对于需要预测的自变量,我们直接将其代入我们建立的模型当中,然后就得到了预测值。

我们也可以进行区间估计。记s=\sqrt{\frac{SSE}{n-m-1}}

x_{0}=[1,x_{0},x_{1},...x_{m}],则y_{0}的置信度为1-\alpha的预测区间可以近似为(y_{0}\hat{}-2s,y_{0}\hat{}+2s)这是样本量较大时的预测区间。

statsmodels可以使用两种模式求解回归分析模型:一种是基于公式的模型,一种是基于数组的模型。

基于公式的模型:我们在上面的一元线性回归中已经介绍过。

基于数组的模型:

import statsmodels.api as sm
sm.OLS(y,X).fit()

其中y是因变量的观察值向量,而X为自变量观测值矩阵在添加第一列全部为1的增广矩阵。

例题:某企业为了研究车工的平均年龄x_{1},平均文化程度x_{2}和平均产量y之间的变化关系,随机抽取了8个班组,测得的数据如下表所示,试求平均产量对平均工龄,平均文化程度的回归方程。并求x_{1}=9,x_{2}=10x_{1}=10,x_{2}=9时,y的预测值。

12345678
x17.16.89.211.48.76.610.310.6
x211.110.812.410.99.69.010.512.4
x315.41522.827.819.513.124.926.2
import pylab as pl
import numpy as np
import statsmodels.api as sm
a=np.loadtxt('data10_2.txt')
pl.subplot(121)
pl.plot(a[0],a[2],'o',label='x1',color='black')
pl.plot(a[1],a[2],'*',label='x2',color='black')
pl.legend()
d={'x1':a[0], 'x2':a[1],'y':a[2]}
re=sm.formula.ols('y~x1+x2',d).fit()
print(re.summary())
print(re.mse_resid)
yh=re.predict({'x1':[9,10],'x2':[10,9]})
print(yh)
pre=re.get_prediction(d)
df=pre.summary_frame(alpha=0.05)
dfv=df.values;low,upp=dfv[:,4:].T
r=(upp-low)/2
num=np.arange(1,len(a[0])+1)
pl.subplot(122)
pl.errorbar(num,re.resid,r,fmt='o')
pl.show()

这里是基于公式的代码,不做详细介绍。下面附上基于数组的代码,我个人比较推荐基于公式的算法。

import pylab as pl
import numpy as np
import statsmodels.api as sm
a=np.loadtxt('data10_2.txt')
pl.plot(a[0],a[2],'o',label='x1',color='black')
pl.plot(a[1],a[2],'*',label='x2',color='black')
pl.legend()
X=sm.add_constant(a[:2].T)
re=sm.OLS(a[2],X).fit()
print(re.summary())
print(re.mse_resid)
yh=re.predict(np.array([[1,9,10],[1,10,9]]))
print(yh)
pl.show()

(1)这里的函数add_comstant(x)作用是为矩阵x添加一列全为一的作用。

(2)对于基于数组的函数预测和基于公式的有所不同,它的格式和填入OLS函数的格式相同,第一列全为一,第二列为x1,一次类推。

多项式回归

如果我们做出散点图发现y和x呈较明显的二次(或者高次)函数关系,或者用线性关系模拟的效果不太好,就可以使用多项式回归。随机意义下,一元n次多项式回归的数学模型可以表达为y=\beta _{0}+\beta _{1}x+...\beta _{n}x^{n}+\varepsilon

式中:\varepsilon为随机误差,满足E(\varepsilon )=0,D(\varepsilon )=\sigma ^{2}

例子:某厂生产一种电器的销量y和竞争对手的价格x_{1}和本场的价格x_{2}有关,我们给出下表,是此商品在10个城市的销售情况,试根据这些数据建立y和x_{1}x_{2}的关系式,并对得到的模型和系数进行检验。并预测若本厂商品在本市售价为160元,那么竞争对手售价为170元。预测这个商品在本市销量。

x_{1}120140190130155175125145180150
x_{2}10011090150210150250270300250
y10210012077469326696585

我们画出散点图,从中可以看出,y和x_{2}有线性关系,而y和x_{1}之间的关系难以确定,所以我们多拟合几种模型,去取残差方差最小的这个模型为最佳模型。

线性模型:y=a_{0}+a_{1}x_{1}+a_{2}x_{2}

纯二次模型:y=b_{0}+b_{1}x_{1}+b_{2}x_{2}+b_{3}x_{1}^{2}+b_{4}x_{2}^{2}

交叉二次:y=c_{0}+c_{1}x_{1}+c_{2}x_{2}+c_{3}x_{1}x_{2}

纯二次:y=d_{0}+d_{1}x_{1}+d_{2}x_{2}+d_{3}x_{1}x_{2}+d_{4}x_{1}^{2}+d_{5}x_{2}^{2}

import pylab as pl
import numpy as np
import statsmodels.api as sm
a=np.loadtxt('data10_4.txt')
x1=a[0];x2=a[1];y=a[2];
pl.plot(x1,y,'o',label='x1',color='black')
pl.plot(x2,y,'*',label='x2',)
pl.legend()
pl.show()
d={'x1':x1, 'y1':y, 'x2':x2}
resid=[]
idea=['y~x1+x2','y~x1+x2+I(x1**2)','y~x1*x2','y~x1*x2+I(x1**2)+I(x2**2)']
for i in range(0,4):
    re=sm.formula.ols(idea[i],d).fit()
    resid.append(re.mse_resid)
i=resid.index(max(resid))
re=re=sm.formula.ols(idea[i],d).fit()
print('最佳预测值:',re.predict({'x1':170,'x2':160}))

通过选择残差方差s^{2}这个准则,确定纯二次多项式模型式是拟合的最好的。

逐步回归

实际中影响因变量的因素可能很多,有的可能关联性很强,而有的可能弱一些,人们总希望从中挑选对因变量影响显著的自变量来建立回归模型,下面来讨论多元线性回归模型的情形。

基本思想:S={x_{1},x_{2},,,x_{m}}为候选自变量的集合,S_{1}\subset S是集合S的一个子集。设S_{1}中有l个自变量,由S_{1}和因变量y构造的回归模型的残差平方和为SSE,则模型的残差方差s^{2}=SSE/(n-l-1),n为数据样本容量。所选子集应该使s^{2}尽可能的小一般来说回归模型所含的自变量越多,那么残差平方和SSE就越小,如果变量中存在对因变量影响很小的量,那么并不会影响SSE,但是会增大l导致分母变大,使得残差方差增大。

当自变量较多时,我们有自主选择自变量的方法:

通常我们最常用的是逐步回归法。

前进法:逐步添加变量,每步添加一个,直到没有变量可以引入为止。

第一步:对所有的变量和因变量做一元线性回归,然后得到每个回归模型的F统计量。如果F_{i}>=F_{\alpha }(1,n-2),则将对应变量引入方程中。

第二步:假设我们第一步共引入了m个变量,然后把这m个变量再逐一和剩下的变量建立回归方程,并将其F值和F_{\alpha }(1,n-p-1)做对比。

第三步:知道所有引入后所有变量的F值均小于F_{\alpha }(1,n-p-1)。(P为引入变量的个数) 

重复上述步骤,知道添加完所有变量。

后退法:使用与F统计量等价的T检验量

第一步:用所有自变量和因变量做拟合。

第二步:每一步都把未通过t检验的自变量中选择\left | t_{i} \right |最小一个删除,如果均通过t检验,可以为了使得s^{2}最小而删除,最小的变量。

第三步:直到所有的自变量均通过t检验。

逐步回归法:

把变量一个一个的引入,每次引入一个变量就对已选入的变量进行逐个检验,当原引入的变量因为后引入的变量而不再显著时,需要进行剔除。引入一个变量或者删除一个变量都要保证模型中的所有变量均为显著的。直到既无显著变量引入,也无不显著的变量从模型里删除。

要求:引入自变量的显著性水平要高于剔除变量的显著性水平。

Logistic回归模型

通常我们会面临二分类问题,比方说我们去医院抽血化验,我们会得到一张化验单上面会标注血液中各成分的含量,医生需要判断我们的身体到底有病或者没病。

这个时候就是一个二分类问题,而Logistic通常给出的是一个概率值,如果有病1,为没病为0的话,我们对一个样本进行预测会得到一个在0~1之间的预测值,如果这个值大于0.5我们就认为他有病,反之则无。

调用格式为:

import statsmodels.api as sm
md=sm.formula.logit('y~x1+x2+x3',d).fit()

调用格式基本和前面的线性回归类似。

  • 10
    点赞
  • 116
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
回归分析是一种统计方法,常用于预测和建模。在Python中,有多种库可以进行回归分析,其中最常用的是scikit-learn和statsmodels。 使用scikit-learn进行回归分析,可以使用线性回归、岭回归、Lasso回归等方法。首先,你需要导入相关的库和数据集,然后创建回归模型并拟合数据。以下是一个简单的示例: ```python from sklearn.linear_model import LinearRegression from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error # 导入数据集(假设你有一个名为X的特征矩阵和一个名为y的目标向量) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) # 创建线性回归模型 model = LinearRegression() # 拟合训练数据 model.fit(X_train, y_train) # 预测测试数据 y_pred = model.predict(X_test) # 计算均方误差 mse = mean_squared_error(y_test, y_pred) print("均方误差:", mse) ``` 除了线性回归,你还可以尝试其他回归方法,例如岭回归和Lasso回归。使用这些方法的步骤类似,只需将模型替换为相应的回归模型即可。 另外,如果你对统计分析更感兴趣,可以使用statsmodels库。该库提供了更多的统计模型和统计检验方法。以下是一个示例: ```python import statsmodels.api as sm # 添加常数列 X = sm.add_constant(X) # 创建OLS模型(普通最小二乘回归) model = sm.OLS(y, X) # 拟合数据 results = model.fit() # 查看回归结果 print(results.summary()) ``` 这只是回归分析的入门示例,你还可以进一步探索不同的回归方法、特征选择和模型评估等内容。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

first青年危机

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值