线性回归:自相关检测及其处理方法

article/2025/8/15 4:18:23
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在其他经典假定不变的条件下,若 C o v ( u i , u j ) = E ( u i u j ) ≠ 0 ( i ≠ j ) Cov(u_{i},u_{j})=E(u_{i}u_{j})\neq0 \quad (i\neq j) Cov(ui,uj)=E(uiuj)=0(i=j)则称为自相关或序列相关。如果仅存在 C o v ( u t , u t + 1 ) ≠ 0 ( t = 1 , 2 , … , n ) Cov(u_{t},u_{t+1})\neq 0\quad(t=1,2,\dots,n) Cov(ut,ut+1)=0(t=1,2,,n)则称为一阶自相关。
  一阶自相关通常可以写成如下形式: u t = ρ u t − 1 + v t ( − 1 < ρ < 1 ) A R ( 1 ) u_{t}=\rho u_{t-1}+v_{t} \quad (-1<\rho<1) \quad AR(1) ut=ρut1+vt(1<ρ<1)AR(1)其中 ρ \rho ρ为一阶自相关系数, v t v_{t} vt为满足经典假定的随机误差项,即 E ( v t ) = 0 E(v_{t})=0 E(vt)=0 V a r ( v t ) = σ 2 Var(v_{t})=\sigma^{2} Var(vt)=σ2 C o v ( v t , v t + i ) = 0 Cov(v_{t},v_{t+i})=0 Cov(vt,vt+i)=0
  一般地,如果 u t = ρ 1 u t − 1 + ρ 2 u t − 2 + ⋯ + ρ m u t − m + v t A R ( m ) u_{t}=\rho_{1}u_{t-1}+\rho_{2}u_{t-2}+\dots+\rho_{m}u_{t-m}+v_{t}\quad AR(m) ut=ρ1ut1+ρ2ut2++ρmutm+vtAR(m其中 v t v_{t} vt是满足经典假定的误差项, ρ m \rho_{m} ρm m m m阶自相关系数。称该式为 m m m阶自回归形式。
  一般情况下,自相关产生的后果与异方差类似,这里不再赘述。

1.2 产生原因

  一般时间序列数据更容易出现自相关。这是因为经济变量的滞后效应、时间序列非平稳性等原因都可能引发自相关问题。一般地,产生自相关的原因主要有以下几个方面:

  • 模型设定偏误:模型设定偏误一般有自变量选择偏误和模型函数形式片偏误两种;
  • 经济变量的滞后效应:大量经济时间数据会表现出时间的前后关联性,这往往是由经济变量的滞后效用造成的;
  • 蛛网现象:一般某种商品的供给量受前一期价格影响而表现出来的某种规律性,即呈蛛网状收敛或发散于供需的均衡点。
  • 数据处理造成的自相关。
2 自相关的检测

  依据自相关的定义,自相关的检验就是寻找能够判断随机误差项与其自身一阶或多阶滞后项是否相关的方法。这里仍然采用OLS估计模型所得到的残差 e t e_{t} et作为随机干扰项的近似估计量,通过分析OLS所得到的残差与其自身滞后项的相关性来判断随机干扰项是否存在自相关性。几种常用的检测方法如下:

2.1 图示法

  图示法通过图形来表现残差 e t e_{t} et的自相关情况,该方法简单直接但精度较低,只能作为粗略判断之用。通常可以采用以下两种方式表现残差的自相关情况:

  • 绘制残差 e t e_{t} et e t − 1 e_{t-1} et1之间的散点图来表现两者的相关性;
  • 直接绘制 e t e_{t} et随时间变化的图形,通过图形特征来判断是否存在自相关性;如果 e t e_{t} et随着时间 t t t变化逐次有规律的变化,呈现锯齿形或循环形状的变化,就可认为 e t e_{t} et存在自相关。如果 e t e_{t} et频繁不断地改变符号,那么存在的负自相关;如果 e t e_{t} et符号改变次数较少,那么存在正的自相关。具体如下图:
    在这里插入图片描述
2.2 DW检验

  DW检验师一种适用于小样本的检验方法,并且该检验方法只能检验随机误差项具有一阶自回归形式的自相关问题。该检验构造的DW统计量为: D W ≈ 2 ( 1 − ρ ^ ) DW\approx2(1-\hat \rho) DW2(1ρ^)其中 ρ ^ \hat \rho ρ^ e t e_{t} et e t − 1 e_{t-1} et1的相关系数,用该值作为 u t u_{t} ut u t − 1 u_{t-1} ut1相关系数 ρ \rho ρ的估值。当 ρ ^ = 0 \hat \rho=0 ρ^=0时,即 D W ≈ 2 DW\approx 2 DW2时, e t e_{t} et e t − 1 e_{t-1} et1不相关;当 ρ ^ = − 1 \hat \rho=-1 ρ^=1时,即 D W ≈ 4 DW\approx 4 DW4时, e t e_{t} et e t − 1 e_{t-1} et1完全负相关; ρ ^ = 1 \hat \rho=1 ρ^=1时,即 D W ≈ 0 DW\approx 0 DW0时, e t e_{t} et e t − 1 e_{t-1} et1完全正相关。目前只需根据DW值落入临界值所界定的范围,就可以判断随机干扰项的自相关情况。具体判断情况如下:
在这里插入图片描述
其中, d U d_{U} dU d L d_{L} dL为DW统计量的上界和下界的临界值,这两个值可以通过查表得到。DW检验的缺点和局限性如下:

  • DW检验有两个不能确定的区域,一旦DW值落在这两个区域,就无法判断。这时只能增大样本容量或选取其他样本;
  • DW统计量的上下界要求 n ≥ 15 n\geq15 n15;
  • DW检验不适用随机误差项具有高阶序列相关的检验;
  • 只适用于有常数项的回归模型,且解释变量中不能含有滞后的被解释变量,并且要求解释变量为非随机的和数据序列无缺失项;
2.3 拉格朗日检验

  拉格朗日检验又被称为Breusch-Godfrey检验。拉格朗日乘数检验克服了DW检验的缺陷,适用于高阶自相关以及模型中存在滞后被解释变量的模型。LM检验的步骤如下:

  • 首先获得残差项 e t e_{t} et
  • e t e_{t} et对模型中的所有的解释变量 X X X以及第一步估计得到的残差滞后值 e t − 1 e_{t-1} et1 … \dots e t − p e_{t-p} etp做回归(p的确定可以用赤池和施瓦茨信息准则来选择),具体如下: e t = α 1 + α 2 X 2 t + ⋯ + α k X k t + ρ ^ 1 e t − 1 + ρ ^ 2 e t − 2 + ⋯ + ρ ^ p e t − p + ϵ t e_{t}=\alpha_{1}+\alpha_{2}X_{2t}+\dots+\alpha_{k}X_{kt}+\hat \rho_{1}e_{t-1}+\hat \rho_{2}e_{t-2}+\dots+\hat \rho_{p}e_{t-p}+\epsilon_{t} et=α1+α2X2t++αkXkt+ρ^1et1+ρ^2et2++ρ^petp+ϵt并得到该辅助回归的判定系数 R 2 R^{2} R2
  • 若样本容量很大,则有 ( n − p ) R 2 ∼ χ 2 ( p ) (n-p)R^{2}\sim \chi^{2}(p) (np)R2χ2(p),在给定显著性水平下,若 ( n − p ) R 2 > χ 2 ( p ) (n-p)R^{2}>\chi^{2}(p) (np)R2>χ2(p)则拒绝原假设,此时至少有一个 ρ \rho ρ不为0,说明存在自相关。
3 自相关的修正
3.1 随机误差项相关系数的估计

  在对自相关问题进行修正之前,必须先知道不同样本之间随机误差项的相关系数 ρ 1 , ρ 2 , … , ρ p \rho_{1},\rho_{2},\dots,\rho_{p} ρ1,ρ2,,ρp。但在实际上,我们并不知道这些参数的具体数值,所以必须先对他们进行估计。常用的估计方法是科克伦奥科特迭代方法。

3.2 广义差分法

  广义差分法是一种广泛使用的克服自相关的有效方法。广义差分法将原模型变化为满足普通最小二乘法的差分模型,再进行普通最小二乘法估计。假设原模型为
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 t = Y t − β 0 − β 1 X 1 t − ⋯ − β n X n t u t − 1 = Y t − 1 − β 0 − β 1 X 1 , t − 1 − ⋯ − β n X n , t − 1 u t − 2 = Y t − 2 − β 0 − β 1 X 1 , t − 2 − ⋯ − β n X n , t − 2 ⋯ u t − p = Y t − p − β 0 − β 1 X 1 , t − p − ⋯ − β n X n , t − p (1) \begin{aligned}\tag{1}u_{t}&=Y_{t}-\beta_{0}-\beta_{1}X_{1t}-\dots-\beta_{n}X_{nt}\\u_{t-1}&=Y_{t-1}-\beta_{0}-\beta_{1}X_{1,t-1}-\dots-\beta_{n}X_{n,t-1}\\u_{t-2}&=Y_{t-2}-\beta_{0}-\beta_{1}X_{1,t-2}-\dots-\beta_{n}X_{n,t-2}\\\cdots\\u_{t-p}&=Y_{t-p}-\beta_{0}-\beta_{1}X_{1,t-p}-\dots-\beta_{n}X_{n,t-p}\end{aligned} utut1ut2utp=Ytβ0β1X1tβnXnt=Yt1β0β1X1,t1βnXn,t1=Yt2β0β1X1,t2βnXn,t2=Ytpβ0β1X1,tpβnXn,tp(1)如果该模型除存在自相关之外,满足其他所有经典假定,并且其随机误差项满足如下自回归模型: u t = ρ 1 u t − 1 + ρ 2 u t − 2 + ⋯ + ρ p u t − p + v t u_{t}=\rho_{1}u_{t-1}+\rho_{2}u_{t-2}+\dots+\rho_{p}u_{t-p}+v_{t} ut=ρ1ut1+ρ2ut2++ρputp+vt结合以上可以得到如下公式 Y t = β 0 + β 1 X 1 t + β 2 X 2 t + ⋯ + β n X n t + ρ 1 u t − 1 + ρ 2 u t − 2 + ⋯ + ρ p u t − p + v t Y_{t}=\beta_{0}+\beta_{1}X_{1t}+\beta_{2}X_{2t}+\dots+\beta_{n}X_{nt}+\rho_{1}u_{t-1}+\rho_{2}u_{t-2}+\dots+\rho_{p}u_{t-p}+v_{t} Yt=β0+β1X1t+β2X2t++βnXnt+ρ1ut1+ρ2ut2++ρputp+vt将公式(1)代入到上式中即可得到:
Y t − ρ 1 Y t − 1 − ρ 2 Y t − 2 − ⋯ − ρ p Y t − p = β 0 ( 1 − ρ 1 − ρ 2 − ⋯ − ρ p ) + β 1 ( X 1 t − ρ 1 X 1 , t − 1 − ρ 2 X 1 , t − 2 ⋯ − ρ p X 1 , t − p ) + … + β n ( X n t − ρ 1 X n , t − 1 − ρ 2 X n , t − 2 − ⋯ − ρ p X n , t − p ) + v t \begin{aligned}&Y_{t}-\rho_{1}Y_{t-1}-\rho_{2}Y_{t-2}-\dots-\rho_{p}Y_{t-p}\\&=\beta_{0}(1-\rho_{1}-\rho_{2}-\dots-\rho_{p})\\&+\beta_{1}(X_{1t}-\rho_{1}X_{1,t-1}-\rho_{2}X_{1,t-2}\dots-\rho_{p}X_{1,t-p})+\dots\\ &+\beta_{n}(X_{nt}-\rho_{1}X_{n,t-1}-\rho_{2}X_{n,t-2}-\dots-\rho_{p}X_{n,t-p})+v_{t} \end{aligned} Ytρ1Yt1ρ2Yt2ρpYtp=β0(1ρ1ρ2ρp)+β1(X1tρ1X1,t1ρ2X1,t2ρpX1,tp)++βn(Xntρ1Xn,t1ρ2Xn,t2ρpXn,tp)+vt采用最小二乘法估计模型得到的参数估计量,即为原模型参数的无偏、有效估计量。

4 实验
4.1 数据

  实验中用到的数据为1995-2014年中国进口总额和国内生产总值数据,具体如下:
在这里插入图片描述

4.2 自相关检测

DW检验
  Python中statsmodels.api中的OLS模型中已经集成了DW检验,所以的这里就直接使用OLS模型来做自相关检验。具体如下:

import numpy as np
import statsmodels.api as sm
import pandas as pddata=[[61129.8,11048.1],[71572.3,11557.4],[79429.5,11806.5],[84883.7,11626.1],[90187.7,13736.4],[99776.3,18638.8],[110270.4,20159.2],[121002.0,24430.3],[136564.6,34195.6],[160714.4,46435.8],[185895.8,54273.7],[217656.6,63376.9],[268019.4,73300.1],[316751.7,79526.5],[345629.2,68618.4],[408903.0,94699.3],[484123.5,113161.4],[534123.0,114801.0],[588018.8,121037.5],[636138.7,120358.0]]data=np.array(data)
X,y=data[:,0],data[:,1]
X=pd.DataFrame(X,columns=['X1'])
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())

其结果如下:
在这里插入图片描述
通过查表,可以知道 d L = 1.20 , d U = 1.41 d_{L}=1.20,d_{U}=1.41 dL=1.20dU=1.41,目前 D W = 0.526 < d L DW=0.526<d_{L} DW=0.526<dL,所以随机误差项存在自相关。
图示法

import matplotlib.pyplot as plt
err=y_pred-y
plt.scatter(err.values[:-1],err.values[1:])

其结果如下:
在这里插入图片描述

4.3 确定自相关阶数及相关系数

  这里确定阶数的方法来源于时间序列模型。具体如下:

#1.确定阶数
import warnings
warnings.filterwarnings('ignore')
AR=sm.tsa.stattools.arma_order_select_ic(err_abs)['bic_min_order'][0]
print(AR) #结果为1
#2.确定系数
y_1=err.values[1:]
x_1=err.values[:-1]
model=sm.OLS(y_1,x_1)
result=model.fit()
print(result.summary())

具体结果如下:
在这里插入图片描述
从这个结果中可以近似得到: e t = 0.780 ∗ e t − 1 e_{t}=0.780*e_{t-1} et=0.780et1

4.4 自相关修正

  这里使用广义差分法对自相关模型进行修正。具体如下:

#广义差分法
X_new=X['X1']-0.780*X['X1'].shift(periods=1)
y_new=y['val']-0.780*y['val'].shift(periods=1)
X_new=X_new.dropna()
y_new=y_new.dropna()
X_new=sm.add_constant(X_new)
X_new['const']=(1-0.780)*X_new['const']
model=sm.OLS(y_new,X_new)
result=model.fit()
print(result.summary())

具体结果如下:
在这里插入图片描述

参考
  1. 《计量经济学》
  2. https://blog.csdn.net/mfsdmlove/article/details/124769371

http://chatgpt.dhexx.cn/article/ItekHvrA.shtml

相关文章

相同数相乘

#include <stdio.h> int main() { long term0,sum0; int a,i,n; printf("input a,n:"); scanf("%d,%d",&a,&n); for(i1;i<n;i) { termterm*10a; sumsumterm; } printf("sum%1d\n",sum); }

实现两个矩阵相乘

题目&#xff1a;实现两个矩阵相乘。 想法&#xff1a; 通过分析矩阵相乘可假设变量i,j,k控制下标&#xff0c; 则有以下公式&#xff1a; c[i][j]a[i][k]*b[k][j]&#xff08;三个变量循环次数&#xff1a;i>j>k&#xff09; 所以可以使用三次循环解出相乘的每个数…

c++两个特别大的数之间相乘怎么计算?

两个数特别大&#xff0c;相乘起来超过了long int型的范围&#xff1f;怎么计算&#xff1f; 比如&#xff1a;要计算123456789987654321 * 987654321123456的值&#xff0c;怎么写程序&#xff1f; /* large_num_operation.cpp */ #include <iostream> #include <cst…

两个整数相乘的java实现

package 乘法; /* 求 345*7893 4 5X7 8 9———————————————————————— */ public class Chengfa { public static void main(String[] args) {//乘数1 将两个乘数分别出入两个数组中&#xff0c;//数组中的元素对应的位置分别是个位 十位 百位 数组[…

在Java中实现两数相乘

要实现两数相乘算总额&#xff1a;input1.value() * input2.value() 如果直接获取到两个input值相乘&#xff0c;那么结果就有一点点小偏差&#xff0c;是因为精度缺失 $("#totalSum").val(input1.value() * input2.value()); Js代码&#xff1a; //期初库存 按钮…

两整数相乘算法

算法需求 求两个整数相乘的算法 算法分析 将前一个数的每一位和后一个数的每一位相乘&#xff0c;因计算过程中涉及到满十进位的问题&#xff0c;所以可以通过判断相乘数的位数进行补零操作来简化这个问题&#xff0c;如下图所示&#xff1a; 例如计算&#xff1a;84 * 13…

C++实现——两个大数相乘

#include <iostream> #include <vector> #include <string> using namespace std; //大数相乘 /** *num1 乘数1 *num2 乘数2 *return 结果字符串 */ string BigMutiple(string num1, string num2){string res"";//两个数的位数int m num1.size(),…

两两相乘求和

给定 n 个整数 a_1, a_2, , a_na1​,a2​,⋅⋅⋅,an​ &#xff0c;求它们两两相乘再相加的和&#xff0c;即&#xff1a; 输入格式 输入的第一行包含一个整数 n。 第二行包含 n 个整数。 输出格式 输出一个整数 S&#xff0c;表示所求的和。请使用合适的数据类型进行运…

php 订单自动售货 实现,PHP自动售货发卡网源码 集成多种支付接口

支付接口已集成 支付宝当面付 支付宝PC支付 支付宝手机支付 payjs微信扫码. Paysapi(支付宝/微信). 码支付(QQ/支付宝/微信) 微信企业扫码支付 全网易支付支持(针对彩虹版) 基本环境要求 (PHP PHPCLI) version > 7.0 Nginx version > 1.16 MYSQL version > 5.6 Redis…

php如何做7天后自动售货店,PHP自动售货发卡网源码集成多种支付接口

PHP自动售货发卡网源码 集成多种支付接口 支付接口已集成 支付宝当面付 支付宝PC支付 支付宝手机支付 payjs微信扫码. Paysapi(支付宝/微信). 码支付(QQ/支付宝/微信) 微信企业扫码支付 全网易支付支持(针对彩虹版)基本环境要求 (PHP PHPCLI) version > 7.0 Nginx version …

独角数卡PHP自动化售货发卡网源码下载

源码下载&#xff1a;独角数卡PHP自动化售货发卡网源码-小程序文档类资源-CSDN下载 独角数卡PHP自动化售货发卡网源码 支付接口已集成 支付宝当面付 支付宝PC支付 支付宝手机支付 payjs微信扫码. Paysapi(支付宝/微信). 码支付(QQ/支付宝/微信) 微信企业扫码支付 全网易支付支…

php电商实现自动售货,2020PHP自动售货发卡网程序开源源码 集成多个支付接口

支付接口已集成 支付宝当面付 支付宝PC支付 支付宝手机支付 payjs微信扫码. Paysapi(支付宝/微信). 码支付(QQ/支付宝/微信) 微信企业扫码支付 全网易支付支持(针对彩虹版) 基本环境要求 (PHP PHPCLI) version > 7.0 Nginx version > 1.16 MYSQL version > 5.6 Redis …

个人开发者只要一行代码接入微信支付和支付宝支付

接入支付功能 对于个人开发者来说&#xff0c;我们很希望我们开发的App被广泛使用&#xff0c;同时可以获得一些额外收入&#xff0c;那就更好了。但是在微信开放平台或者支付宝开放平台申请支付功能&#xff0c;需要是企业才可以接入&#xff0c;对于我们个人开发者来说&#…

php皮肤程序,2020修复升级版PHP全新皮肤界面点赞任务系统平台源码运营版,仿众人帮蚂蚁帮扶牛帮...

【温馨提示】源码包解压密码&#xff1a;www.youhutong.com 资源描述 2020修复升级版PHP全新皮肤界面点赞任务系统平台源码运营版,仿众人帮蚂蚁帮扶牛帮 测试环境&#xff1a; php5.6apache2.4mysq5.6 源码介绍&#xff1a; 优化前台UI 及任务功能 前台用户可发布任务【老款只能…

个人支付方案(免签约)-支付宝当面付

背景 作者作为个人开发者&#xff0c;想接入支付功能&#xff0c;所以了解了下目前支付相关的方案&#xff0c;发现大体有以下几种&#xff08;参见xpay&#xff09;&#xff1a; 支付宝和微信官方支付接口&#xff1a;基本都需要企业资格才能开通&#xff0c;最起码也要是个…

支付宝当面付方案(个人免签方案)

作者作为个人开发者&#xff0c;想接入支付功能&#xff0c;所以了解了下目前支付相关的方案&#xff0c;发现大体有以下几种&#xff08;参见xpay&#xff09;&#xff1a; 支付宝和微信官方支付接口&#xff1a;基本都需要企业资格才能开通&#xff0c;最起码也要是个体工商…

个人支付收款接口现状剖析

前言 在国内环境&#xff0c;广大的个人站点及应用&#xff0c;因为业务发展需求&#xff0c;往往需要以个人资质申请对接微信和支付宝的支付渠道。然而现在无论是微信还是支付宝&#xff0c;仅支持具有企业资质的主体申请接口对接&#xff0c;对个人开发者而言&#xff0c;路已…

课程管理

课程管理 121.课程管理-发布课程界面和模型完成122.课程管理-视频云存储讲解123.课程管理-发布课程功能完成124.课程管理-视频加密播放实现125.购买课程-课程订单页面完成126.购买课程-支付宝和微信支付功能准备工作127.购买课程-生成课程订单128.购买课程-配置pycharm同步代码…

视频的上传及购买播放

一、上传视频 1&#xff1a;使用百度云&#xff1a; 登录百度云&#xff1a;https://cloud.baidu.com/ 进入管理控制台&#xff1b;开通 “视频点播VOD” 服务&#xff1b;在后台管理系统 --> 右上角“安全认证” --> 获取 “AccessKey”&#xff1b;在 “视频点播VOD” …