线性回归:异方差检测及其处理方法

线性回归:异方差检测及其处理方法异方差性的存在 会对回归模型的正确建立和统计推断带来严重后果 首先 在异方差情况下 所有与参数估计量方差有关的相关计算都会受到影响

1.异方差的定义
1.1 定义

  对于经典线性回归模型 Y i = β 0 + β 1 X 1 i + β 2 X 2 i + ⋯ + β n X n i + u i Y_{i}=\beta_{0}+\beta_{1}X_{1i}+\beta_{2}X_{2i}+\dots+\beta_{n}X_{ni}+u_{i} Yi=β0+β1X1i+β2X2i++βnXni+ui在其他假设不变条件下,若随机误差项 u i u_{i} ui的方差不相等,即 V a r ( u i ∣ X 1 i , X 2 i , … , X n i ) = σ i 2 Var(u_{i}|X_{1i},X_{2i},\dots,X_{ni})=\sigma_{i}^{2} Var(uiX1i,X2i,,Xni)=σi2则称随机误差项(即总体方差) u i u_{i} ui具有异方差性。

1.2 影响

  异方差性的存在,会对回归模型的正确建立和统计推断带来严重后果。首先,在异方差情况下,所有与参数估计量方差有关的相关计算都会受到影响。 t t t检验、多元回归的 F F F检验都会因此变得不再准确。其次,异方差条件下参数的OLS估计量不再有效(仍然具有线性和一致性),会导致对 Y Y Y的预测也失去有效性。

1.3 产生原因

  异方差产生的原因大致可以归纳为以下几种情况,具体如下:

  • 解释变量变化对被解释变量所产生影响的程度不断变化,会引起异方差性;
  • 遗漏变量或模型形式设定偏误都可能会产生异方差性。当遗漏的变量与解释变量相关时,其对被解释变量的影响被归入随机误差项,则可能使随机误差项产生异方差性。当模型形式设定偏误时,如变量间本来为非线性关系,而错误的设定为线性关系时,则该模型往往表现出异方差性。
  • 样本数据本身属性也会导致异方差性;
2. 异方差的检测

  异方差性表现为解释变量与随机干扰项方差之间的某种关系。具体常用的几种检测方法如下:

2.1 图示法

  该方法的做法主要是通过绘制某个解释变量与样本残差平方 e i 2 e_{i}^{2} ei2的散点图,查看这两者之间是否存在某种关系。如果不存在异方差性,则 e i 2 e_{i}^{2} ei2不会随着 X X X的变化而变化,若 e i 2 e_{i}^{2} ei2会随着 X X X的变化而发生同步变化,则可以初步判断模型存在异方差性。

2.2 G-Q检验

  G-Q检验又称为样本分段检验,该检验可用于检验递增性或递减性异方差的有效方法。该方法的检验思路是,若随机干扰项方差随着某解释变量的增加同步递增或递减,则将该解释变量按大小排序之后,分成两段,则前后两段的残差平方和的差别会较大。其具体步骤如下:

  • 将样本观测值按照认为可能会引起异方差的某个解释变量观测值的大小排序;如果是时间序列数据,则不可以排序;
  • 将序列中间不大于 1 / 3 1/3 1/3观测总量的观测值删除。此时序列形成前后两段,记其前后两段的样本容量分别为 n 1 n_{1} n1 n 2 n_{2} n2。为计算方便,一般设置 n 1 = n 2 n_{1}=n_{2} n1=n2
  • 分别用OLS方法对前后两段数据进行回归,可以得到两个回归模型各自的残差,分别记为 e 1 i e_{1i} e1i e 2 i e_{2i} e2i。则这两个回归模型的残差平方分别为 R S S 1 = ∑ i = 1 n 1 e i 1 2 RSS_{1}=\sum_{i=1}^{n_{1}}e_{i1}^{2} RSS1=i=1n1ei12 R S S 2 = ∑ i = 1 n 2 e i 2 2 RSS_{2}=\sum_{i=1}^{n_{2}}e_{i2}^{2} RSS2=i=1n2ei22
  • 分别计算前后两个回归模型随机误差项方差的估计量 σ ^ 1 2 = R S S 1 n 1 − k \hat \sigma_{1}^{2}=\frac{RSS_{1}}{n_{1}-k} σ^12=n1kRSS1 σ ^ 2 2 = R S S 2 n 2 − k \hat \sigma_{2}^{2}=\frac{RSS_{2}}{n_{2}-k} σ^22=n2kRSS2,其中 k k k为模型参数的个数。将大方差设为分子,小方差设为分母。由此构建检验统计量 F = σ ^ 1 2 σ ^ 2 2 F=\frac{\hat \sigma_{1}^{2}}{\hat \sigma_{2}^{2}} F=σ^22σ^12在同方差假定下, F F F满足自由度为 n 1 − k n_{1}-k n1k n 2 − k n_{2}-k n2k F F F分布。
  • 在同方差假定下, σ ^ 1 2 \hat \sigma_{1}^{2} σ^12 σ ^ 2 2 \hat \sigma_{2}^{2} σ^22应近似相等,即 F F F统计量应接近于1;如果统计量 F F F偏离1越远,则随机干扰项存在异方差性的可能性就越大。在给定显著性水平 α \alpha α下,若 F > F α ( n 1 − k , n 2 − k ) F>F_{\alpha}(n_{1}-k,n_{2}-k) F>Fα(n1k,n2k),则拒绝同方差性假定,表明存在异方差性。
2.3 戈里瑟检验

  戈里瑟检验的基本思想是用残差绝对值 ∣ e i ∣ |e_{i}| ei对每个解释变量建立各种回归模型,比如: ∣ e i ∣ = α 1 + α 2 X i + v i |e_{i}|=\alpha_{1}+\alpha_{2}X_{i}+v_{i} ei=α1+α2Xi+vi ∣ e i ∣ = α 1 + α 2 1 X i + v i |e_{i}|=\alpha_{1}+\alpha_{2}\frac{1}{X_{i}}+v_{i} ei=α1+α2Xi1+vi ∣ e i ∣ = α 1 + α 2 X i + v i |e_{i}|=\alpha_{1}+\alpha_{2}\sqrt{X_{i}}+v_{i} ei=α1+α2Xi
+
vi
对回归系数 α 2 \alpha_{2} α2进行显著性检验。如果 α 2 ≠ 0 \alpha_{2} \neq0 α2=0,则认为存在异方差性。该检验的缺点是不能判断模型是否不存在异方差,并要求变量的观测值为大样本。

2.4 怀特检验

  怀特检验的基本思想是:如果存在异方差,其方法 σ i 2 \sigma_{i}^{2} σi2与解释变量有关系,则可以分析 σ i 2 \sigma_{i}^{2} σi2是否与解释变量有某些形式的联系,以此判断异方差性。其具体步骤如下:

  • 使用普通最小二乘法估计模型,并获取样本残差 e i e_{i} ei
  • 构建所有解释变量及其平方项和交叉乘积项对残差平方 e i 2 e_{i}^{2} ei2的线性回归模型,并检验各回归系数是否为0,若所有参数都为0则不存在异方差性。
3. 异方差的修正

  通过加权变换使原模型中的异方差误差项转换为同方差误差项,使加权变换后的模型满足最小二乘法的假定,从而使用普通最小二乘法估计参数,这种方法称为加权最小二乘法(Weighted Least Square, WLS)。在实践中可以根据实际情况寻找合适的权进行加权最小二乘法估计。以一元线性回归模型为例进行说明: Y i = β 1 + β 2 X i + u i Y_{i}=\beta_{1}+\beta_{2}X_{i}+u_{i} Yi=β1+β2Xi+ui

3.1 σ i 2 \sigma_{i}^{2} σi2已知

  如果每个观测点的误差项方差 σ i 2 \sigma_{i}^{2} σi2是已知的,使用 1 / σ i 1/\sigma_{i} 1/σi为权数,对模型作如下变换即可: Y i σ i = β 1 σ i + β 2 X i σ i + u i σ i \frac{Y_{i}}{\sigma_{i}}=\frac{\beta_{1}}{\sigma_{i}}+\beta_{2}\frac{X_{i}}{\sigma_{i}}+\frac{u_{i}}{\sigma_{i}} σiYi=σiβ1+β2σiXi+σiui

3.2 σ i 2 \sigma_{i}^{2} σi2未知

  当 σ i 2 \sigma_{i}^{2} σi2是未知时,可根据模型首次估计的残差与解释变量或被解释变量的关系来确定变换的权数。一般先采用戈里瑟检验方法确定 e i e_{i} ei X i X_{i} Xi之间的关系

  • 如果 ∣ e i ∣ |e_{i}| ei X i \sqrt{X_{i}} Xi
    之间为线性关系,则可对模型两边同时乘以 1 X i \frac{1}{\sqrt{X_{i}}} Xi
    1
    ,即可将异方差模型变为同方差模型。此时模型为: Y i X i = β 1 X i + β 2 X i + u i X i \frac{Y_{i}}{\sqrt{X_{i}}}=\frac{\beta_{1}}{\sqrt{X_{i}}}+\beta_{2}\sqrt{X_{i}}+\frac{u_{i}}{\sqrt{X_{i}}} Xi
    Yi
    =
    Xi
    β1
    +
    β2Xi
    +
    Xi
    ui
  • 如果 ∣ e i ∣ |e_{i}| ei X i X_{i} Xi之间为线性关系,则选择 1 X i \frac{1}{X_{i}} Xi1为权数,将其变换为如下模型: Y i X i = β 1 X i + β 2 + u i X i \frac{Y_{i}}{X_{i}}=\frac{\beta_{1}}{X_{i}}+\beta_{2}+\frac{u_{i}}{X_{i}} XiYi=Xiβ1+β2+Xiui

  实践中,遇到异方差时,往往分别以 1 X i \frac{1}{X_{i}} Xi1 1 X i \frac{1}{\sqrt{X_{i}}} Xi
1
1 ∣ e i ∣ \frac{1}{|e_{i}|} ei1为权,对原模型进行加权最小二乘法估计,选取最优结果作为最终估计结果。

4 实验
4.1 构造数据

  因为没有找到找到符合异方差性的数据,所以这里只能自己构造。这里构造的数据中 Y Y Y与变量 X 1 X_{1} X1之间并不是线性关系。另外,生成 Y Y Y的公式中的各参数是随意设置的。

import pandas as pd from scipy import stats import statsmodels.api as sm import numpy as np from sklearn.datasets import make_regression from matplotlib import pyplot as plt X,_ = make_regression(n_samples=2000, n_features=5,random_state=5) X=pd.DataFrame(X) #参数是随便设置的 y=0.2*X[0]+5*(X[1]2)+0.56*X[2]+2.7*X[3]-1.3*X[4] y=pd.DataFrame(y,columns=['val']) X=sm.add_constant(X) model=sm.OLS(y,X) results=model.fit() y_pred=pd.DataFrame(model.predict(results.params,X), columns=['val']) print(results.summary()) 

此时线性回归的结果如下( R 2 R^{2} R2值较低,模型无法用于预测):
在这里插入图片描述

4.2 异方差检测
#误差项 err_abs=(y_pred-y).abs() #1.检验是否存在异方差性 #1.1 图示法 fig,((ax1,ax2),(ax3,ax4))=plt.subplots(nrows=2,ncols=2) ax1.scatter(X[0],(err_abs)2) ax1.set_xlabel('X[0]') ax2.scatter(X[1],(err_abs)2) ax2.set_xlabel('X[1]') ax3.scatter(X[2],(err_abs)2) ax3.set_xlabel('X[2]') ax4.scatter(X[3],(err_abs)2) ax4.set_xlabel('X[3]') plt.show() 

其具体结果如下(从图中可以看到 e i 2 e_{i}^{2} ei2 X 1 X_{1} X1之间有明确的关系,但不是递增或递减的关系):
在这里插入图片描述
戈里瑟检验
  因为各个变量 X i X_{i} Xi值既有正值又有负值,所以这里只判断 ∣ e i ∣ |e_{i}| ei X i X_{i} Xi 1 / X i 1/X_{i} 1/Xi之间是否存在线性关系。具体如下:






for col in [0,1,2,3,4]: print("第{}个变量".format(col)) X_tmp=X[['const',col]] model_i=sm.OLS(err_abs,X_tmp) result_tmp=model_i.fit() print(result_tmp.pvalues) #判断|e|与1/X之间是否存在线性关系 X_tmp[col]=1/X_tmp[col] model_i=sm.OLS(err_abs,X_tmp) result_tmp=model_i.fit() print(result_tmp.pvalues) 
 G-Q检验 from scipy import stats for col in [0,1,2,3,4]: X_tmp=X.sort_values(by=[col],axis=0) #X共有2000个样本,删除中间650个样本,将剩余样本分为前后两段,各段分别有675个样本 X_head=X_tmp.iloc[:675,:] X_tail=X_tmp.iloc[-675:,:] y_head=y.loc[X_head.index] y_tail=y.loc[X_tail.index] m_head=sm.OLS(y_head,X_head) r_head=m_head.fit() y_pre_head=m_head.predict(r_head.params,X_head) RSS_head=((y_pre_head-y_head.values)2).sum() m_tail=sm.OLS(y_tail,X_tail) r_tail=m_tail.fit() y_pre_tail=m_tail.predict(r_tail.params,X_tail) RSS_tail=((y_tail.values-y_pre_tail)2).sum() if RSS_head>RSS_tail: f_val=(RSS_head/(y_head.shape[0]-5))/(RSS_tail/(y_tail.shape[0]-5)) f_pval=stats.f.sf(f_val,y_head.shape[0]-5,y_tail.shape[0]-5) else: f_val=(RSS_tail/(y_tail.shape[0]-5))/(RSS_head/(y_head.shape[0]-5)) f_pval=stats.f.sf(f_val,y_tail.shape[0]-5,y_head.shape[0]-5) print("对于变量:{},其F值为:{:.3f},p值为:{:.3f}".format(col,f_val,f_pval)) 
from sklearn.preprocessing import PolynomialFeatures poly = PolynomialFeatures(degree = 2) X_all=poly.fit_transform(X.loc[:,[0,1,2,3,4]]) X_all=pd.DataFrame(X_all,columns=poly.get_feature_names()) y=err_abs2 White_m=sm.OLS(y,X_all) result=White_m.fit() print(result.summary()) 
4.3 修正

  这里只使用 1 / X i 1/X_{i} 1/Xi 1 / ∣ e i ∣ 1/|e_{i}| 1/ei来对模型进行加权修正。

#2 使用1/|e_i|为权进行修正 X1=X.copy() for col in X.columns: X1[col]=X[col]/err_abs['val'] y1=y['val']/err_abs['val'] model=sm.OLS(y1,X1) results=model.fit() print(results.summary()) 
# 使用1/X4为权进行修正 X2=X.copy() for col in X.columns: X2[col]=X[col]/X[4] y2=y['val']/X[4].values model=sm.OLS(y2,X2) results=model.fit() print(results.summary()) 

在这里插入图片描述

参考
  1. 《计量经济学》
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/224177.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午12:32
下一篇 2026年3月17日 下午12:32


相关推荐

  • 首发即支持!昇思MindSpore 0day 支持智谱开源GLM-4-0414全部6个模型

    首发即支持!昇思MindSpore 0day 支持智谱开源GLM-4-0414全部6个模型

    2026年3月12日
    2
  • 抓住每一次学习的机会

    抓住每一次学习的机会抓住每一次学习的机会

    2022年4月24日
    40
  • 理解G1收集器

    理解G1收集器G1这个名字是怎么来的collecttheregionswiththeleastlivedatafirst(GarbageFirst).G1适合什么情景多核多CPU而且大内存大内存要求低停顿G1如何实现-XX:MaxGCPauseMillis所设置的目标?首先这个目标是个软指标。对于新生代来说,过G1自动调整新生代的大小。对于老年代来说,每次MixedG…

    2022年5月18日
    42
  • 【java并发编程】底层原理——用户态和内核态的区别

    【java并发编程】底层原理——用户态和内核态的区别一、背景–线程状态切换的代价java的线程是映射到操作系统原生线程之上的,如果要阻塞或唤醒一个线程就需要操作系统介入,需要在户态与核心态之间切换,这种切换会消耗大量的系统资源,因为用户态与内核态都有各自专用的内存空间,专用的寄存器等,用户态切换至内核态需要传递给许多变量、参数给内核,内核也需要保护好用户态在切换时的一些寄存器值、变量等,以便内核态调用结束后切换回用户态继续工作。synch…

    2026年1月18日
    7
  • VMware无法关机 虚拟机繁忙(已解决)

    VMware无法关机 虚拟机繁忙(已解决)在使用 VMware 的时候 由于非正常关机或死机等原因导致虚拟机无法关闭 即使结束 VMware 进程或重启计算机也无法关闭解决方法 1 百度上很多说法包括说在任务管理器里结束掉 vmwareworkst exe 进程 如下图 就可以了 其实本人亲测后根本解决不了问题 2 因为在任务管理器里结束进程是无法停止 VMware 在 Windows 上提供的服

    2026年3月19日
    2
  • 腾讯收购冰川网络_冰河是谁

    腾讯收购冰川网络_冰河是谁应朋友的邀约,不久前去腾讯交流学习了。这次的收获还是蛮大的,今天,跟小伙伴们分享下这次去腾讯交流和学习的体会。

    2022年8月22日
    12

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号