多重共线性问题
文章目录
前言
本文介绍多重共线性的相关知识
以下是本篇文章正文内容
一、多重共线性是什么?
要点:
- 定义在线性回归模型中
- 解释变量之间的
- 精确相关关系或高度相关关系
对要点的解释:
- 线性回归模型的一般形式:
Y = β 0 + β 1 X 1 + ⋯ + β p X p + ε = β 0 + ∑ i = 1 p β i X i + ε . Y=\beta_0+\beta _1X_1+\cdots +\beta _pX_p+\varepsilon \\=\beta_0+\sum_{i=1}^p{\beta _iX_i}+\varepsilon. Y=β0+β1X1+⋯+βpXp+ε=β0+i=1∑pβiXi+ε. - 解释变量:即自变量(自变量是随机变量)。在spss里又称为“预测变量”。
- 精确相关关系:即完全的线性相关:存在多重共线性的各个变量线性相关。此时称自变量之间存在完全共线性。其数学表示为:存在一组不全为0的 C 1 , C 2 , ⋯ , C r C_1,C_2,\cdots ,C_r C1,C2,⋯,Cr,使 C 1 X 1 + C 2 X 2 + ⋯ + C r X r = 0. C_1X_1+C_2X_2+\cdots +C_rX_r=0. C1X1+C2X2+⋯+CrXr=0.
- 高度相关关系:不是完全的线性相关:添加了随机误差(即随机扰动项) v v v( v v v满足条件: E ( v ) = 0 , E ( v 2 ) < ∞ E(v)=0,E(v^2)<\infty E(v)=0,E(v2)<∞)。此时称自变量之间存在不完全共线性。数学表示为:存在一组不全为0的 C 1 , C 2 , ⋯ , C r C_1,C_2,\cdots ,C_r C1,C2,⋯,Cr,使 C 1 X 1 + C 2 X 2 + ⋯ + C r X r + v = 0. C_1X_1+C_2X_2+\cdots +C_rX_r+v=0. C1X1+C2X2+⋯+CrXr+v=0.
二、statsmodels最小二乘法的步骤及结果解读
2.1 数据展示
2.2 相关性和散点图
2.2.1 相关系数热力图
def test(df):
dfData = df.corr()
plt.subplots(figsize=(9, 9)) # 设置画面大小
sns.heatmap(dfData, annot=True, vmax=1, square=True, cmap="Blues")
plt.savefig('./BluesStateRelation.png')
plt.show()
test(data_log.iloc[:,:-1])
结果:
2.2.2 各变量散点图
画图代码:
#8个变量与Y的散点图
varia=data_log.columns.tolist()
color=['r','b','g','darkorange','navy','m','c','y']
fig=plt.figure(figsize=(24,12))
plt.rc('font',size=16)
for i in range(8):
ax1 = fig.add_subplot(241+i)
ax1.set_xlabel(varia[i])
ax1.set_ylabel('$lnEM_{LND}+lnEM_{CIT}+lnEM_{AGR}$',labelpad=-75,position=(10,0.6))#设置文本标签与坐标轴的距离为负
ax1.scatter(data_log[varia[i]],data_log['$lnEM_{LND}+lnEM_{CIT}+lnEM_{AGR}$'], c=color[i], marker='o')
plt.show()
结果:
2.3 多元线性回归(最小二乘法)
2.3.1 回归结果
回归代码:
#加载表中x1,x2,x3,x4,x5,x6,x7,x8,y的数据
d={'x1':data_log['$lnLND_2$'],'x2':data_log['$lnLND_1$'],\
'x3':data_log['$lnW_{IND}$'],'x4':data_log['$lnCIT_1$'],\
'x5':data_log['$lnCIT_2$'],'x6':data_log['$lnW_{CIT}$'],\
'x7':data_log['$lnAGR_2$'],'x8':data_log['$lnW_{AGR}$'],\
'y':data_log['$lnEM_{LND}+lnEM_{CIT}+lnEM_{AGR}$']}
md=sm.formula.ols('y~x1+x2+x3+x4+x5+x6+x7+x8',d).fit() #构建并拟合模型']
print(md.summary(),'\n------------\n') #显示模型所有信息
ypred=md.predict({'x1':data_log['$lnLND_2$'],'x2':data_log['$lnLND_1$'],\
'x3':data_log['$lnW_{IND}$'],'x4':data_log['$lnCIT_1$'],\
'x5':data_log['$lnCIT_2$'],'x6':data_log['$lnW_{CIT}$'],\
'x7':data_log['$lnAGR_2$'],'x8':data_log['$lnW_{AGR}$']}) #计算预测值
statsmodels给出的回归结果:
2.3.2 回归结果的分析
2.3.2.1 第一部分左边:
- Dep. Variable:即dependent variable,因变量
- OLS:普通最小二乘法
- least squares:最小化残差平方和
- No. Observations:个案数,即样本容量
- df residuals:残差自由度(观测数No.Observations - (参数数目Df Model+1)),这里的1是常量参数
- df model:模型中自变量(即参数)个数
2.3.2.2 第一部分右边
- R-squared:R方
- Adj . R-squared:调整后的R方
- F-statistic:F统计量,均方误差/残差的均方误差。值越大, H 0 H_0 H0 越不可能,从而回归系数显著
- Prob(F-statistic):当 p r o b ( F − s t a t i s t i c ) < α prob(F-statistic)<α prob(F−statistic)<α时,表示拒绝原假设,即认为模型是显著的
- Log likelihood :对数似然比LLR。值越大,模型拟合得越好。
- (Davidson 与MacKinnon年说:对于线性回归模型,不管它误差是不是正态分布,都不需要过问LM,W,LLR,因为这些信息已被F检验所含有)
- AIC:
A
I
C
=
2
k
−
2
l
n
(
L
)
AIC=2k-2ln(L)
AIC=2k−2ln(L)。其中:k是参数的数量,L是似然函数。它衡量拟合优良性,应选择AIC最小的模型, 引入了惩罚项,避免参数过多,过拟合
- BIC: 贝叶斯信息准则 B I C = k l n ( n ) − 2 l n ( L ) BIC=kln(n)-2ln(L) BIC=kln(n)−2ln(L) ,BIC相比AIC在大数据量时对模型参数惩罚得更多,导致BIC更倾向于选择参数少的简单模型。
2.3.2.3 第二部分(模型描述部分)
- intercept:还不知道是什么意思
- coef:各自变量的估计系数
- std err:系数估计的标准差
- t : 即t统计量,衡量显著性的指标
- P > ∣ t ∣ P>|t| P>∣t∣: H 0 H_0 H0(系数=0)为真的概率。 p < α p< \alpha p<α表示估计的系数在统计学意义上显著
- [ 0.025 , 0.975 ] [0.025,0.975] [0.025,0.975]: 95%置信区间的下限和上限值
2.3.2.4 第三部分
- Omnibus :属于一种统计测验,测试一组数据中已解释方差是否显著大于未解释方差,但omnibus不显著,模型也可能存在合法的显著影响, 比如两个变量中有一个不显著,即便另一个显著.通常用于对比
- Prob(Omnibus):将上面的统计数据变成概率
- Skewness: 偏度
- Kurtosis:峰度
- Durbin-Watson:德宾-沃森检验(检验残差自相关最常用的方法),它用于检验一阶自相关性。
- 自相关系数 − 1 < ρ < 1 ⇒ 0 ≤ D W ≤ 4 -1<ρ<1\Rightarrow0≤DW≤4 −1<ρ<1⇒0≤DW≤4
- 并且
D W = 0 ⇔ ρ = 1 DW=0 \Leftrightarrow ρ=1 DW=0⇔ρ=1 即存在正自相关性
D W = 4 ⇔ ρ = - 1 DW=4\Leftrightarrow ρ=-1 DW=4⇔ρ=-1即存在负自相关性
D W = 2 ⇔ ρ = 0 DW=2\Leftrightarrow ρ=0 DW=2⇔ρ=0 即不存在(一阶)自相关性
- Jarque-Bera(JB) : Jarque–Bera检验。如果统计量 ≫ 0 \gg0 ≫0,则表示数据不是正态分布。
- Prob(JB): JB统计量的概率形式
- Cond. No :条件数。用于诊断多重共线性
2.3.3 结果分析
- 模型不显著、拟合系数不显著
- 存在严重多重共线性
- 减少变量后:仍存在多重共线性、x5的拟合系数不通过显著性检验、将x5变为 x 5 2 x5^2 x52后仍无较大改变
三、消除多重共线性影响——基于python的逐步回归
1.引入库、读取数据、数据结构的转换
引入库:
import numpy as np
import pandas as pd
读取数据:
data_reg_df=pd.read_excel(r'文件的路径')#用于回归的数据,是dataframe结构
数据结构的转换:
data_reg=data_reg_df.values.copy()
#将DataFrame对象转化为数组,数组的最后一列为预报对象(即因变量)
2.计算相关系数(即单变量回归系数)、计算相关系数矩阵
1.计算相关系数:
def get_regre_coef(X,Y):
S_xy=0
S_xx=0
S_yy=0
# 计算预报因子和预报对象的均值
X_mean = np.mean(X)
Y_mean = np.mean(Y)
for i in range(len(X)):
S_xy += (X[i] - X_mean) * (Y[i] - Y_mean)
S_xx += pow(X[i] - X_mean, 2)
S_yy += pow(Y[i] - Y_mean, 2)
return S_xy/pow(S_xx*S_yy,0.5)
2.计算相关系数矩阵(即原始增广矩阵):
全部变量之间的相关系数矩阵为: R = ( R 11 R 12 ⋯ R 1 m R 1 y R 21 R 22 ⋯ R 2 m R 2 y ⋮ ⋮ ⋱ ⋮ ⋮ R m 1 R m 2 ⋯ R m m R m y R y 1 R y 2 ⋯ R y m R y y ) . R=\left( \begin{matrix} R_{11}& R_{12}& \cdots& R_{1m}& R_{1y}\\ R_{21}& R_{22}& \cdots& R_{2m}& R_{2y}\\ \vdots& \vdots& \ddots& \vdots& \vdots\\ R_{m1}& R_{m2}& \cdots& R_{mm}& R_{my}\\ R_{y1}& R_{y2}& \cdots& R_{ym}& R_{yy}\\ \end{matrix} \right) . R=⎝⎜⎜⎜⎜⎜⎛R11R21⋮Rm1Ry1R12R22⋮Rm2Ry2⋯⋯⋱⋯⋯R1mR2m⋮RmmRymR1yR2y⋮RmyRyy⎠⎟⎟⎟⎟⎟⎞.
def get_original_matrix():
# 创建一个数组存储相关系数,data.shape几行(维)几列,结果用一个tuple表示
# print(data.shape[1])
col=data.shape[1]
# print(col)
r=np.ones((col,col))#np.ones参数为一个元组(tuple)
# print(np.ones((col,col)))
# for row in data.T:#运用数组的迭代,只能迭代行,迭代转置后的数组,结果再进行转置就相当于迭代了每一列
# print(row.T)
for i in range(col):
for j in range(col):
r[i,j]=get_regre_coef(data[:,i],data[:,j])
return r
3.计算方差贡献率和方差比(即变量引入的F值)
- 计算方差贡献率:
def get_vari_contri(r):
col = data.shape[1]
#创建一个矩阵来存储方差贡献值
v=np.ones((1,col-1))
# print(v)
for i in range(col-1):
v[0, i] = pow(r[i, col - 1], 2) / r[i, i]
return v
该段代码基于第 l l l步计算的自变量 X j X_j Xj的方差贡献率的计算公式: v j ( l ) = ( R j y ( l − 1 ) ) 2 R j j ( l ) v_{j}^{\left( l \right)}=\frac{\left( R_{jy}^{\left( l-1 \right)} \right) ^2}{R_{jj}^{\left( l \right)}} vj(l)=Rjj(l)(Rjy(l−1))2
- 计算变量引入的F值:
在逐步回归的过程中,不仅要引入方差贡献率最大的自变量,还要剔除贡献率最小的自变量。因此需要对自变量的存留与否进行F假设检验。
F检验(F-test):又称联合假设检验(joint hypotheses test),也称方差比率检验、方差齐性检验。是对统计量F是否服从F-分布的检验。
#选择因子是否进入方程,
#参数说明:r为增广矩阵,v为方差贡献值,k为方差贡献值最大的因子下标,p为当前进入方程的因子数
def select_factor(r,v,k,p):
row=data.shape[0]#样本容量
col=data.shape[1]-1#预报因子数
#计算方差比
f=(row-p-2)*v[0,k-1]/(r[col,col]-v[0,k-1])
# print(calc_vari_contri(r))
return f
- 调用以上函数计算方差贡献率和方差比:
#计算第零步增广矩阵
r=get_original_matrix()
# print(r)
#计算方差贡献值
v=get_vari_contri(r)
print(v)
#计算方差比
# print(data.shape[0])
f=select_factor(r,v,4,0)
print(f)
#######输出##########
22.79852020138227
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。