大家好,回归分析是研究一个因变量与一个或多个自变量相互依赖的定量关系的一种统计分析方法,今天来讲一下数据分析中的回归分析。

一、简单线性回归

简单线性回归是一种非常简单的根据单一自变量x预测因变量y的方法。

建立模型方程:y=β0+β1*x+ε

其中,β0+β1x表示y随x的变化而线性变化的部分;ε是随机误差,也称为残差,它是其他随机因素影响的总和,其值不可观测。一般称y为被解释变量(因变量),x为解释变量(自变量)。

1.1参数估计

为了由样本数据得到回归参数β0和β1的理想估计值,通常使用普通最小二乘(Ordinary Least Square,OLS)法进行估计。

最小二乘法的思想:寻找参数β0、β1的最优估计值。

可以使用statsmodels库中regression模块的linear_model子模块创建OLS类,该类下的fit函数可以实现最小二乘估计,得到的结果为RegressionResultsWrapper类。RegressionResultsWrapper类下的params属性即为最小二乘估计的结果,OLS类的语法格式如下:

class statsmodels.regression.linear_moder.OLS(endog,
exog=None,missing='none',hasconst=None,**kwarge)
# endog:接受 array,表示因变量y的数据。无默认值
# exog:接受 array,表示自变量的一个阵列,包括截距项
(使用statsmodels.tools.add_constant函数添加)。无默认值

实例:菲利普斯曲线表明,失业率和通货膨胀率之间存在替代关系。下表给出了我国1998~2007年的通货膨胀率和城镇登记失业率。试用简单线性回归分析方法研究这种替代关系在我国是否存在。

import numpy as np
from scipy import optimize
import statsmodels.api as sm
fire = np.loadtxt(r'D:/data/huigui1.csv', delimiter=',')
# 方法一:使用最小二乘法拟合直线的方法
x = fire[:,1]
y = fire[:,2]
def regula(p):
    a,b = p
    return y - a - b*x
result = optimize.least_squares(regula,[0,0])
print('方法一:回归参数β0和β1的估计值分别为:',result.x)
# 方法二:使用statsmodels库中regression模块的linear_model子模块创建OLS类
X = sm.add_constant(fire[:,1])
model = sm.OLS(fire[:,2], X)
results = model.fit()
print('方法二:回归参数β0和β1的估计值分别为:',results.params)

输出结果:

方法一:回归参数β0和β1的估计值分别为:[3.60066458 0.15708295]
方法二:回归参数β0和β1的估计值分别为:[3.60066458 0.15708295]

1.2 显著性检验

t检验:在回归分析中,t检验用于检验回归系数β1的显著性,回归系数的显著性检验就是要检验自变量x对因变量y的影响程度是否显著。如果原假设H0=0成立,则因变量y与自变量x之间并没有真正的线性关系,即自变量x的变化对因变量y并没有影响。

F检验:线性回归方程显著性的另外一种检验是F检验。F检验根据平方和分解式直接由回归效果检验回归方程的显著性。在正态假设下,当原假设H0成立时,该F服从自由度为(1,n−2)的F分布。给定显著性水平α,查表可得到F检验的临界值为Fα(1,n−2)。当F>Fα(1,n−2)时,拒绝原假设H0,说明回归方程显著,x与y有显著的线性关系。

在Python中,使用OLS类下的fit函数的summary方法可查看t检验和F检验的结果:

print('检验的结果为:\n',results.summary())

结果输出:

检验的结果为:
                             OLS Regression Results                            
==============================================================================
Dep. Variable:                      y   R-squared:                       0.401
Model:                            OLS   Adj. R-squared:                  0.326
Method:                 Least Squares   F-statistic:                     5.358
Date:                Tue, 12 Jul 2022   Prob (F-statistic):             0.0493
Time:                        15:25:00   Log-Likelihood:                -4.1477
No. Observations:                  10   AIC:                             12.30
Df Residuals:                       8   BIC:                             12.90
Df Model:                           1                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
const          3.6007      0.149     24.205      0.000       3.258       3.944
x1             0.1571      0.068      2.315      0.049       0.001       0.314
==============================================================================
Omnibus:                        2.151   Durbin-Watson:                   1.055
Prob(Omnibus):                  0.341   Jarque-Bera (JB):                0.861
Skew:                           0.116   Prob(JB):                        0.650
Kurtosis:                       1.581   Cond. No.                         2.67
==============================================================================

从输出结果可以写出最终模型的如下表达式:R(失业率)=3.601+0.157*I(通货膨胀率),这意味着通货膨胀率每增加1,失业率就增加0.157点。

模型的拟合优度也就是对数据的解释能力一般,调整后的R平方为0.326。

B0估计值的标准误差为0.149,B1的估计值的标准误差为0.068;t统计量的值为2.315,对应的P值为0.049;F统计量的值为5.358,对应的P值为0.0493。因为t统计量和F统计量对应的P值均小于显著性水平0.05。

所以,两个结果都是显著的,应拒绝原假设H0,认为通货膨胀和失业的替代关系在我国并不存在。

二、多重线性回归

设随机变量y与一般变量x1,x2,…,xp的线性回归模型为式。

建立模型方程:y=β0+β1*x1+β2*x2+……+βp*xp+ε

其中,β0,β1,…,βp是p+1个未知参数,β0称为回归常数,β1,…,βp称为回归系数;y称为被解释变量(因变量),x1,x2,…,xp称为解释变量(自变量);ε是随机误差。当p=1时,为一元线性回归模型;当p≥2时,上式为多元线性回归模型。

假定条件:

零均值假定,假定随机干扰项ε的期望向量或均值向量为零。

同方差和无序列相关假定,假定随机干扰项ε互不相关且方差相同。

随机干扰项ε与解释变量不相关假定。

无多重共线性假定。

正态性假定,假定随机干扰项ε服从正态分布,即ε~N(0,δ2In)。

2.1参数估计

与简单线性回归模型参数的估计类似,多重线性回归模型未知参数的估计通常采用最小二乘法。

实例:为了检验美国电力行业是否存在规模经济,特收集了1955年145家美国电力企业的总成本(TC)、产量(Q)、工资率(PL)、燃料价格(PF)及资本租赁价格(PK)的数据,如表6.14所示。试以总成本为因变量,以产量、工资率、燃料价格和资本租赁价格为自变量,用多重线性回归分析方法研究其间的关系。

import numpy as np
import statsmodels.api as sm
blood = np.loadtxt(r'D:/data/huigui2.csv', delimiter=',') 
X = blood[:,1:5]
X = np.c_[np.ones(145),X]  # 创建X矩阵
Y = blood[:,0]  # 创建Y矩阵
# 方法二
X = sm.add_constant(X)
model = sm.OLS(Y, X)
results = model.fit()
print('方法二:回归参数β0~β4的估计值分别为:\n',results.params)

输出结果:

方法二:回归参数β0~β4的估计值分别为:
 [-2.22209780e+01  6.39505665e-03  5.65518323e+00  2.07839985e-01
  2.84415016e-02]

2.2 显著性检验

t检验:在多元线性回归中,回归方程显著并不意味着每个自变量对y的影响都显著,所以需要对每个自变量进行显著性检验。显然,如果某个自变量xj对y的影响不显著,那么在回归模型中,它的系数βj取值为零。

F检验:对多元线性回归方程的显著性检验,主要是看自变量x1,x2,…,xp从整体上对随机变量y是否有明显的影响,为此提出原假设和备择假设,H0:βi都为0,如果H0被接受,则表明随机变量y与自变量x1,x2,…,xp之间的关系由线性回归模型表示不合适。

在Python中,使用OLS类下的fit函数的summary方法可查看t检验和F检验的结果:

print('检验的结果为:\n',results.summary())

输出结果:

检验的结果为:
                             OLS Regression Results                            
==============================================================================
Dep. Variable:                      y   R-squared:                       0.923
Model:                            OLS   Adj. R-squared:                  0.921
Method:                 Least Squares   F-statistic:                     418.1
Date:                Tue, 12 Jul 2022   Prob (F-statistic):           9.26e-77
Time:                        16:45:40   Log-Likelihood:                -452.47
No. Observations:                 145   AIC:                             914.9
Df Residuals:                     140   BIC:                             929.8
Df Model:                           4                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
const        -22.2210      6.587     -3.373      0.001     -35.245      -9.197
x1             0.0064      0.000     39.258      0.000       0.006       0.007
x2             5.6552      2.176      2.598      0.010       1.352       9.958
x3             0.2078      0.064      3.242      0.001       0.081       0.335
x4             0.0284      0.027      1.073      0.285      -0.024       0.081
==============================================================================
Omnibus:                      135.057   Durbin-Watson:                   1.560
Prob(Omnibus):                  0.000   Jarque-Bera (JB):             4737.912
Skew:                           2.907   Prob(JB):                         0.00
Kurtosis:                      30.394   Cond. No.                     5.29e+04
==============================================================================

从输出结果可以看出,X4的p值=0.285大于0.05,是不显著的,所以我们修正一下模型,去掉自变量PK。重新修正代码:

import numpy as np
import statsmodels.api as sm
blood = np.loadtxt(r'D:/data/huigui2.csv', delimiter=',') 
X = blood[:,1:4]
X = np.c_[np.ones(145),X]  # 创建X矩阵
Y = blood[:,0]  # 创建Y矩阵
# 方法二
X = sm.add_constant(X)
model = sm.OLS(Y, X)
results = model.fit()
print('方法二:回归参数β0~β3的估计值分别为:\n',results.params)
print('检验的结果为:\n',results.summary())

结果输出:

方法二:回归参数β0~β3的估计值分别为:
 [-1.65443407e+01  6.40615487e-03  5.09777236e+00  2.21664799e-01]
检验的结果为:
                             OLS Regression Results                            
==============================================================================
Dep. Variable:                      y   R-squared:                       0.922
Model:                            OLS   Adj. R-squared:                  0.920
Method:                 Least Squares   F-statistic:                     556.5
Date:                Tue, 12 Jul 2022   Prob (F-statistic):           6.39e-78
Time:                        16:47:18   Log-Likelihood:                -453.06
No. Observations:                 145   AIC:                             914.1
Df Residuals:                     141   BIC:                             926.0
Df Model:                           3                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
const        -16.5443      3.928     -4.212      0.000     -24.309      -8.780
x1             0.0064      0.000     39.384      0.000       0.006       0.007
x2             5.0978      2.115      2.411      0.017       0.917       9.278
x3             0.2217      0.063      3.528      0.001       0.097       0.346
==============================================================================
Omnibus:                      142.387   Durbin-Watson:                   1.590
Prob(Omnibus):                  0.000   Jarque-Bera (JB):             5466.347
Skew:                           3.134   Prob(JB):                         0.00
Kurtosis:                      32.419   Cond. No.                     3.42e+04

最终模型的表达式(即模型3)为:TC=-16.544+0.006Q+0.222PF+5.098PL

最终模型的拟合优度很好,修正的可决系数Adj. R-squared: 0.920超过了0.9。

模型是显著的,F统计量的值为56.5,显著性为6.39e-78。

在模型中,常数项和3个自变量系数的显著性都小于0.05,为显著。

B0估计值的标准误差为0.3.928,B1的估计值的标准误差为0.000;B2估计值的标准误差为2.115,B3的估计值的标准误差为0.063;

结论:经过以上多重线性回归分析可以发现,美国电力企业的总成本(TC)受到产量(Q)、工资率(PL)、燃料价格(PF)及资本租赁价格(PK)的影响,美国电力行业存在规模经济。

三、 Logistic回归

我们经常会遇到因变量只有两种取值的情况,如是否患病、是否下雨等,这时一般的线性回归分析就无法准确地刻画变量之间的因果关系,需要用其他的回归分析方法来进行拟合模型。二项分类Logistic回归分析便是一种简便的处理二分类因变量问题的分析方法。

设y是0-1型变量,x1,x2,…,xp是与y相关的自变量,y是因变量。Logistic回归研究的是x1,x2,…,xp与y发生的概率之间的关系。记y取1的概率为p=P(y=1|x1,x2,…,xp),取0的概率为1−p,取1和取0的概率之比为p/(1-p),称为事件的优势比(Odds)。将优势比取自然对数,得ln[p/(1-p)],该变换称为Logistic变换,然后即可将问题转换为建立ln[p/(1-p)]与自变量x的线性回归模型:

ln[p/(1-p)]=β0+β1*x1+β2*x2+……+βp*xp

3.1参数估计

在Python中,使用statsmodels库中discrete模块的discrete_model子模块可以创建Logit类,该类下的fit函数可以实现极大似然估计,得到的结果为BinaryResultsWrapper类。BinaryResultsWrapper类下的summary方法可展示参数估计值。Logit类的语法格式如下:

class statsmodels.discrete.discrete_moder.Logit(endog,
exog,**kwarge)
# endog:接受 array,表示因变量y的数据。无默认值
# exog:接受 array,表示自变量的一个阵列,包括截距项
(使用statsmodels.tools.add_constant函数添加)。无默认值

3.2 显著性检验

Z检验:对Logistic回归模型的回归系数进行显著性检验时,可以使用Z检验。

可以根据P值做检验,在显著性水平α下,当P<α时,拒绝原假设H0;当P≥α时,不拒绝原假设H0。

大家可以找实例进行logistic回归分析。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐