多元线性回归模型statsmodelsols
前言
什么是多元线性回归分析预测法
在市场的经济活动中,经常会遇到某一市场现象的发展和变化取决于几个影响因素的情况,也就是一个因变量和几个自变量有依存关系的情况。而且有时几个影响因素主次难以区分,或者有的因素虽属次要,但也不能略去其作用。例如,某一商品的销售量既与人口的增长变化有关,也与商品价格变化有关。这时采用一元回归分析预测法进行预测是难以奏效的,需要采用多元回归分析预测法。
多元回归分析预测法,是指通过对两个或两个以上的自变量与一个因变量的相关分析,建立预测模型进行预测的方法。当自变量与因变量之间存在线性关系时,称为多元线性回归分析。
一、多元线性回归
一元线性回归是一个主要影响因素作为自变量来解释因变量的变化,但是在现实问题研究中,因变量的变化往往受几个重要因素的影响,此时就需要用两个或两个以上的影响因素作为自变量来解释因变量的变化,这就是多元回归亦称多重回归。当多个自变量与因变量之间是线性关系时,所进行的回归分析就是多元线性回归。
设y为因变量, 为自变量,并且自变量与因变量之间为线性关系时,则多元线性回归模型为:
其中,b0为常数项, 为回归系数,b1为
固定时,x1 每增加一个单位对 y 的效应,即 x1 对 y 的偏回归系数;同理 b2 为 x1, xk 固定时,x2每增加一个单位对y的效应,故有 x2 对 y 的偏回归系数。如果两个自变量 x1,x2 同一个因变量y呈线性相关时,可用二元线性回归模型描述为:
在建立多元性回归模型时,为了保证回归模型具有优秀的解释能力和预测效果,应首先注意自变量的选择,其准则是:
-
(1)自变量对因变量必须有显著的影响,并呈密切的线性相关;
-
(2)自变量与因变量之间的线性相关必须是真实的,而不是形式上的;
-
(3)自变量之间具有一定的互斥性,即自变量之间的相关程度不能高于自变量与因变量之间的相关程度;
-
(4)自变量应具有完整的统计数据,其预测值容易确定。
多元性回归模型的参数估计,同一元线性回归方程一样,也是在要求误差平方和为最小的前提下,用最小二乘法求解参数。
用二元线性回归模型来求解回归参数的标准参数方程组为:
二、多元线性回归模型求解
多元线性回归模型的主要作用:(主要用于预测)通过建模来拟合我们所提供的或是收集到的这些因变量和自变量的数据,收集到的数据拟合之后来进行参数估计。参数估计的目的主要是来估计出模型的偏回归系数的值。估计出来之后就可以再去收集新的自变量的数据去进行预测,也称为样本量。
多元线性回归模型:
回归模型算法实现:
import pandas as pd
import numpy as np
import statsmodels.api as sm# 实现了类似于二元中的统计模型,比如ols普通最小二乘法
import statsmodels.stats.api as sms#实现了统计工具,比如t检验、F检验...
import statsmodels.formula.api as smf
import scipy
np.random.seed(991)# 随机数种子
# np.random.normal(loc=0.0, scale=1.0, size=None)
# loc:float 此概率分布的均值(对应着整个分布的中心),loc=0说明这一个以Y轴为对称轴的正态分布,
# scale:float 此概率分布的标准差(对应于分布的宽度,scale越大越矮胖,scale越小,越瘦高)
# size:int or tuple of ints 输出的shape,默认为None,只输出一个值
# 数据生成
x1 = np.random.normal(0,0.4,100)# 生成符合正态分布的随机数(均值为0,标准差0.4,所生成随机数的个数为100)
x2 = np.random.normal(0,0.6,100)
x3 = np.random.normal(0,0.2,100)
eps = np.random.normal(0,0.05,100)# 生成噪声数据,保证后面模拟所生成的因变量的数据比较接近实际的环境
X = np.c_[x1,x2,x3]# 调用c_函数来生成自变量的数据的矩阵,按照列进行生成的;100×3的矩阵
beta = [0.1,0.2,0.7]# 生成模拟数据时候的系数的值
y = np.dot(X,beta) + eps# 点积+噪声(dot是表示乘)
X_model = sm.add_constant(X)# add_constant给矩阵加上一列常量1,便于估计多元线性回归模型的截距,也是便于后面进行参数估计时的计算
model = sm.OLS(y,X_model)# 调用OLS普通最小二乘法来求解
# 下面是进行参数估计,参数估计的主要目的是估计出回归系数,根据参数估计结果来计算统计量,
# 这些统计量主要的目的就是对我们模型的有效性或是显著性水平来进行验证。
results = model.fit()# fit拟合
results.summary()# summary方法主要是为了显示拟合的结果
OLS 回归结果:
2.1最小二乘法实现参数估计—估计自变量X的系数
回归系数的计算:X转置(T)乘以X,对点积求逆后,再点乘X转置,最后点乘y 。
beta_hat = np.dot(np.dot(np.linalg.inv(np.dot(X_model.T,X_model)),X_model.T),y)# 回归系数
print('回归系数:',np.round(beta_hat,4))# 四舍五入取小数点后4位
print('回归方程:Y_hat=%0.4f+%0.4f*X1+%0.4f*X2+%0.4f*X3' % (beta_hat[0],beta_hat[1],beta_hat[2],beta_hat[3]))
输出为:
回归系数: [-0.0097 0.0746 0.2032 0.7461]
回归方程:Y_hat=-0.0097+0.0746*X1+0.2032*X2+0.7461*X3
代码讲解:
2.2决定系数:R² 与调整后 R²
决定系数R² 主要作用是:检验回归模型的显著性
# 因变量的回归值=np.dot(X_model,系数向量)
y_hat = np.dot(X_model,beta_hat)# 回归值(拟合值)的计算
y_mean = np.mean(y) # 求因变量的平均值
sst = sum((y-y_mean)**2) # 总平方和:即y减去y均值后差的平方和
ssr = sum((y_hat-y_mean)**2) # 回归平方和: y回归值减去y均值后差的平方和
sse = sum((y-y_hat)**2) # 残差平方和: y值减去y回归值之差的平方和
# sse = sum(results.resid**2) # 结果和上面注释了的式子一样,或许有小数点的误差,但基本上可忽略不计
R_squared =1 - sse/sst # R²:1减去残差平方和除以总平方和商的差;求解方法二:R²=ssr/sst
# 按照线性回归模型原理来说:[残差平方和+回归平方和=总平方和]→[R²=ssr/sst]
print('R²:',round(R_squared,3))
# 调整后平方和:100表示样本数据总数(n),3表示自变量个数(p)
adjR_squared =1- (sse/(100-3-1))/(sst/(100-1)) # 1-(残差的平方和/残差的自由度)/(总平方和/无偏估计),式子开头为常数-1
# 残差的自由度也是残差方差的无偏估计
print('调整后R²:',round(adjR_squared,3))
输出为:
R²: 0.931
调整后R²: 0.929
说明:
2.3F检验参数
F显著性检验:
F = (ssr/3)/(sse/(100-3-1));
print('F统计量:',round(F,1))
# 累积分布函数叫cdf(),调用方法和下面残差函数调用方法一样;注意:cdf+sf算出来的值为1
F_p = scipy.stats.f.sf(F,3,96)# 使用F分布的残存函数计算P值;sf是残存函数英语单词的缩写;3和96分别是两个自由度
print('F统计量的P值:', F_p)
输出为:
F统计量: 432.6
F统计量的P值: 1.2862966484214766e-55
说明:
- 若假设的检验的P值越小,表示的显著性水平就越高。也就是说拒绝原假设H0,接受备选假设H1。
2.4对数似然、AIC与BIC
# 对数似然值计算公式: L=-(n/2)*ln(2*pi)-(n/2)*ln(sse/n)-n/2;sse/n就是方差
res = results.resid# 残差