序列相关性(Serial Correlation)是指在时间序列或截面数据的回归模型中,误差项之间存在相关性。这种现象意味着当前误差项的值会受到前期误差项的影响,误差项之间并不是独立的。这与经典线性回归模型假设的误差项是独立同分布的(i.i.d.)违背了高斯-马尔可夫定理(Gauss-Markov Theorem)中的条件。在时间序列数据中,序列相关性常见于相邻时点之间的自相关现象。通常,第一阶自相关是最为常见的,即当前期的误差项与上期的误差项之间存在线性关系。在一些长期经济数据或者金融数据中,序列相关性的问题尤为突出。
一、序列相关性的描述
如果所取样本是独立随机抽取的(多元回归模型基本假设 MLR.2),则从理论上保证了模型的随机干扰项相互独立,不存在序列相关。如果模型的随机干扰项违背了相互独立的基本假设,则称为存在序列相关问题。鉴于时间序列数据不可重复观测,因此以时间序列数据为样本,一般会破坏随机抽样的假定。根据实证分析的一般经验,时间序列数据也会同时伴随着异方差问题,即违背了基本假定 MLR.5。随机干扰项的方差-协方差矩阵 \(\text{Var}(\boldsymbol{u})\) 可以表示为:
\[\text{Var}(\boldsymbol{u}) = \text{E}(\boldsymbol{u} \boldsymbol{u}^\prime) = \begin{bmatrix} \sigma^2 & \sigma_{12} & \cdots & \sigma_{1T} \\ \sigma_{21} & \sigma^2 & \cdots & \sigma_{2T} \\ \vdots & \vdots & \ddots & \vdots \\ \sigma_{T1} & \sigma_{T2} & \cdots & \sigma^2 \end{bmatrix} = \sigma^2 \begin{bmatrix} 1 & \rho_{12} & \cdots & \rho_{1T} \\ \rho_{21} & 1 & \cdots & \rho_{2T} \\ \vdots & \vdots & \ddots & \vdots \\ \rho_{T1} & \rho_{T2} & \cdots & 1 \end{bmatrix}=\sigma^2 \Sigma \]1.1 序列相关性的产生原因
序列相关性的产生原因是多方面的,主要包括以下几种常见情况。
模型设定不正确:如果模型没有正确地捕捉数据生成过程,或者遗漏了重要的变量,那么误差项中可能包含一些未解释的规律性,从而导致序列相关性。例如,当时间序列数据中存在趋势但模型没有包含相关的趋势变量时,就可能出现序列相关性。
数据特性:序列数据本身可能具有趋势或季节性,这些特性可能没有被模型所捕捉。例如经济指标通常随时间变化而波动,这种波动如果没有在模型中反映出来,误差项就可能呈现出序列相关性。
惯性效应:在一些领域,特别是宏观经济和金融数据中,当前的经济活动或市场行为往往会受到之前事件的影响,表现出惯性效应。这些惯性效应如果没有被模型捕捉到,就可能导致误差项之间的相关性。
动态关系:当模型中没有正确包含动态的结构关系时,例如滞后效应等,这也可能导致序列相关性。若模型缺少必要的滞后项,则会在误差项中引入序列相关性。
1.2 序列相关性的后果
估计不再是最优的。根据高斯-马尔可夫定理,在经典线性回归模型假设成立的情况下,普通最小二乘法(OLS)估计具有无偏性、有效性和一致性。然而,在序列相关性存在时,虽然OLS估计仍然是无偏的,但不再是最有效的(即不再具有最小方差),这意味着其他估计方法可以提供更优的估计。
标准误差估计失效。序列相关性会导致估计参数的标准误差失真,使得假设检验和置信区间失效。例如,在存在正的序列相关性时,估计的标准误差通常会被低估,导致假设检验中的t统计量过大,进而可能错误地拒绝了原假设,增加了I类错误的概率。
假设检验失效。序列相关性会影响F检验和t检验的有效性,导致这些检验在序列相关性存在时的假设检验结果不再可信,可能会使得研究者对回归结果得出错误的结论。
预测准确性下降。序列相关性影响模型的预测能力。如果模型中存在未捕捉的序列相关性,预测的结果可能会失真,难以反映真实的数据生成过程,进而影响预测的准确性和可靠性。
二、序列相关性的检验方法
在回归分析中,序列相关性是一种常见问题,尤其是在时间序列数据中。为了解决和识别序列相关性,研究者通常会采用一系列检验方法,包括图示法、杜宾-沃森检验、Ljung-Box检验和布里什-戈弗雷检验。下面对这些方法进行详细描述和整合。
图示法检验。自相关函数(ACF)图和偏自相关函数(PACF)图是序列相关性检测中常用的可视化工具。
A> CF图:展示了不同滞后期的残差自相关系数。如果所有的自相关系数都接近零,且在零线附近随机波动,表明不存在序列相关性;反之,若滞后期的自相关系数显著偏离零,则可能存在序列相关性。
PACF图:显示每个滞后期上的纯粹自相关系数,排除了其他滞后期的影响。如果图中某些滞后期上的偏自相关系数显著,则表明这些滞后期之间存在显著的直接相关性。
通过结合观察ACF图和PACF图,研究者可以初步判断残差项中的序列相关性。例如,若ACF图表现出递减趋势,而PACF图在某个特定滞后期显示显著偏离零,则可能存在一阶自相关性。图示法检验的优势在于直观性,适合初步分析数据特性,但需结合定量检验工具进行深入分析。
杜宾-沃森检验(Durbin-Watson Test)。杜宾-沃森检验是最常用的一阶序列相关性检验方法,专门用于线性回归模型中残差的自相关性检验。杜宾-沃森统计量(DW)的取值范围在0到4之间。
当DW接近2时,表明残差没有显著的一阶自相关性;
当DW接近0时,表示存在正的序列相关性;
当DW接近4时,表示存在负的序列相关性。
杜宾-沃森检验主要用于检测一阶自相关性,但其局限性在于不能有效检测更高阶的自相关性或复杂的自相关结构。因此,当怀疑存在高阶自相关时,研究者通常会采用其他检验方法。
Ljung-Box检验。Ljung-Box检验是一种通用的序列相关性检验方法,能够检测回归模型中残差的高阶自相关性。
该检验基于多个滞后期的残差自相关函数来进行检验,适合检验多个滞后阶数的序列相关性,而不仅仅是针对一阶自相关性。Ljung-Box检验特别适用于时间序列数据中可能存在复杂自相关结构的情况。
Ljung-Box检验的一个优势在于它能够全面检测残差在多个滞后期上的相关性,适用于更复杂的序列数据。与杜宾-沃森检验相比,Ljung-Box检验的应用范围更广,但也要求更大的样本数据量。
布里什-戈弗雷检验(Breusch-Godfrey Test)。
布里什-戈弗雷检验是一种更加灵活的检验方法,专门用于检测高阶序列相关性。与杜宾-沃森检验不同,布里什-戈弗雷检验能够检测模型中更高阶的自相关性。这种检验方法基于回归残差的滞后值,适用于更复杂的自相关结构。
布里什-戈弗雷检验的主要优势在于其广泛适用性,能够检测一阶和多阶的自相关性。因此,当怀疑存在更复杂的高阶序列相关性时,布里什-戈弗雷检验是一种更为强大的工具。
方法的整合与比较。不同的序列相关性检验方法适用于不同的情境:
杜宾-沃森检验适用于检测线性回归中的一阶自相关性,是最常用的基础检验方法。
Ljung-Box检验可以检测更高阶的序列相关性,适合复杂的时间序列分析。
布里什-戈弗雷检验灵活性较强,适合高阶序列相关性的检验,特别是在滞后效应显著的情况下。
图示法提供了直观的判断工具,适合初步分析残差的自相关模式,但通常需要与其他定量检验方法配合使用,以确保准确性。
通过结合这些方法,研究者能够更全面地检测并修正模型中的序列相关性问题,从而提高模型的估计效率和预测精度。
三、序列相关性的修正措施
序列相关性是指模型中误差项之间存在时间上的相互依赖性,特别是在时间序列数据中,这种依赖性可能导致估计结果出现偏差,影响回归模型的有效性。为了解决这一问题,常用的修正措施包括广义最小二乘法(GLS)、可行广义最小二乘法(FGLS)、杜宾两步法、差分法以及增加滞后项等。这里我们将重点介绍可行广义最小二乘法(FGLS),并提供相关模型和公式。
3.1 广义最小二乘法(GLS)
广义最小二乘法(GLS)是一种用于修正序列相关性和异方差性的方法。它通过对回归模型中的误差项进行加权处理,使得加权后的误差项满足“独立同分布”(i.i.d.)的假设,从而提高参数估计的效率。
在典型的回归模型中:
\[\boldsymbol{y} = \boldsymbol{X} \boldsymbol{\beta} + \boldsymbol{u} \]其中,\(\boldsymbol{y}\) 是因变量,\(\boldsymbol{X}\) 是解释变量矩阵,\(\boldsymbol{\beta}\) 是回归系数,\(\boldsymbol{u}\) 是误差项。若误差项 \(\boldsymbol{u}\) 存在序列相关性,即 \(\text{Var}(\boldsymbol{u}) = \boldsymbol{\Omega}\),则普通最小二乘法(OLS)的估计量不再是最佳线性无偏估计(BLUE)。
为了解决这一问题,GLS通过对模型进行加权,使得误差项不再相关,协方差矩阵变为对角矩阵,从而提高估计的有效性。然而,GLS需要已知误差项的协方差矩阵 \(\boldsymbol{\Omega}\)。在实际应用中,协方差矩阵通常是未知的,因此需要可行广义最小二乘法(FGLS)。
3.2 可行广义最小二乘法(FGLS)
当误差项的协方差结构未知时,广义最小二乘法(GLS)无法直接应用。此时,可行广义最小二乘法(FGLS)成为一种有效的替代方法。FGLS首先估计误差项的协方差矩阵 \(\boldsymbol{\Omega}\),然后基于该估计结果进行加权最小二乘估计。
FGLS 的过程通常包含以下步骤:
- 初始估计:首先使用普通最小二乘法(OLS)对模型进行估计,得到初始残差 \(\hat{\boldsymbol{u}}\)。OLS模型为:
- 估计协方差结构:基于OLS残差 \(\hat{\boldsymbol{u}}\),估计误差项的协方差矩阵 \(\hat{\boldsymbol{\Omega}}\)。例如,在一阶自相关(AR(1))的情况下,假设误差项的相关结构为:$$ u_t = \rho u_{t-1} + \epsilon_t $$
其中,\(\rho\) 是自相关系数,\(\epsilon_t\) 是白噪声误差。利用残差 \(\hat{u}_t\),可以估计 \(\rho\),其估计公式为:
- 变换数据:根据估计的自相关系数 \(\hat{\rho}\),对原始数据进行变换,使得变换后的误差项无自相关性。具体变换如下:
- 对因变量 \(\boldsymbol{y}\) 进行变换:$$ y_t^* = y_t - \hat{\rho} y_{t-1} $$
- 对解释变量 \(\boldsymbol{X}\) 进行同样的变换:$$ X_t^* = X_t - \hat{\rho} X_{t-1} $$
- 加权最小二乘法:在变换后的模型上应用普通最小二乘法,进行回归估计,得到FGLS的估计量 \(\hat{\boldsymbol{\beta}}_{\text{FGLS}}\)。变换后的回归模型为:
其中,\(\boldsymbol{y}^*\) 和 \(\boldsymbol{X}^*\) 是经过自相关修正后的变量,\(\boldsymbol{u}^*\) 是变换后的误差项。
FGLS 的优势与局限:
- 优势:FGLS能够在未知误差协方差结构的情况下,有效修正序列相关性问题。相比于简单的差分法或杜宾两步法,FGLS适用于更加复杂的自相关结构,并且在大样本情况下,FGLS的估计结果具有较好的渐近效率。
- 局限:FGLS的有效性依赖于协方差矩阵的准确估计。若误差项的协方差结构非常复杂或估计不准确,FGLS的结果可能会偏离。此外,FGLS的计算过程相对复杂,尤其在高维数据或大规模时间序列数据中,计算量较大。
3.3 差分法与滞后项方法
除了FGLS,差分法和滞后项方法也是常用的序列相关性修正措施:
- 差分法:通过对时间序列数据进行差分处理,消除原始数据中的趋势性或非平稳性。例如,广义差分法(GD)通过建模序列数据的变化量,修正序列相关性,特别适用于存在趋势或非平稳性的时间序列。
- 滞后项方法:在回归模型中加入合适的滞后变量,能够捕捉到误差项之间的动态依赖关系,从而减轻序列相关性问题。例如,在经济模型中加入滞后期的经济指标,可以提高模型对未来趋势的预测能力。
在处理序列相关性问题时,FGLS是一种有效的修正方法,能够在误差项的协方差结构未知时,先通过估计协方差矩阵再进行加权回归,解决序列相关性问题。相比于简单的OLS方法,FGLS能够提供更加准确的估计结果。然而,FGLS也有其计算复杂性,需要在应用时谨慎处理。差分法和滞后项方法也是处理序列相关性问题的重要工具,研究者可以根据数据的特点和模型需求,选择合适的修正方法。
四、案例分析
消费模型是研究居民消费行为的重要工具,帮助经济学家和市场分析师理解消费者如何在商品和服务上分配收入。模型通常考虑多种因素,如收入水平、财富、预期收入、税率、价格以及心理和社会因素。通过数学模型,研究者能够预测消费模式随经济条件变化的趋势,这对于政策制定、经济刺激措施的设计以及经济周期的预测至关重要。下表是1985-2003年农村居民人均收入和消费性支出数据,试建立该问题的消费模型。
年份 | 全年人均纯收入(现价) | 全年人均消费性支出(现价) | 消费价格指数(1985年为100) | 人均实际纯收入(1985年可比价) |
---|---|---|---|---|
1985 | 397.6 | 317.42 | 100 | 397.6 |
1986 | 423.8 | 357 | 106.1 | 399.4 |
1987 | 462.6 | 398.3 | 112.7 | 410.4 |
1988 | 544.9 | 476.7 | 132.4 | 411.5 |
1989 | 601.5 | 535.4 | 157.9 | 380.9 |
1990 | 686.3 | 584.63 | 165.1 | 441.6 |
1991 | 708.6 | 619.8 | 168.9 | 458.5 |
1992 | 784 | 659.8 | 176.8 | 492.3 |
1993 | 921.6 | 769.7 | 201 | 541.4 |
1994 | 1221 | 1016.81 | 214.3 | 611.6 |
1995 | 1577.7 | 1310.36 | 222.3 | 648.5 |
1996 | 1923.1 | 1572.1 | 219.1 | 677.5 |
1997 | 2090.1 | 1617.15 | 314.3 | 704.5 |
1998 | 2162 | 1590.33 | 314.3 | 415.6 |
1999 | 2214.3 | 1577.42 | 316.5 | 747.6 |
2000 | 2253.4 | 1670 | 315.2 | 785.4 |
2001 | 2366.4 | 1741 | 320.2 | 818.8 |
2002 | 2475.6 | 1834 | - | - |
2003 | 2622.24 | 1943.3 | - | - |
注意:2002年和2003年的消费价格指数和人均实际纯收入数据缺失。
4.1 缺失数据处理
查找中国统计年鉴1985-2005全国各种物价总指数(上年=100)见下表。
年份 | 2005 | 2004 | 2003 | 2002 | 2001 | 2000 | 1999 | 1998 | 1997 | 1996 | 1995 | 1994 | 1993 | 1992 | 1991 | 1990 | 1989 | 1988 | 1987 | 1986 | 1985 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
居民消费价格指数 | 101.8 | 103.9 | 101.2 | 99.2 | 100.7 | 100.4 | 98.6 | 99.2 | 102.8 | 108.3 | 117.1 | 124.1 | 114.7 | 106.4 | 103.4 | 103.1 | 118.0 | 118.8 | 107.3 | 106.5 | 109.3 |
补充2002年和2003年消费价格指数(1985年为100),将上面2002或2003的价格指数连乘到1986年,就得2002和2003的价格指数分别为330.78,334.75。
cpi = {
1985: 109.3, 1986: 106.5, 1987: 107.3, 1988: 118.8, 1989: 118.0,
1990: 103.1, 1991: 103.4, 1992: 106.4, 1993: 114.7, 1994: 124.1,
1995: 117.1, 1996: 108.3, 1997: 102.8, 1998: 99.2, 1999: 98.6,
2000: 100.4, 2001: 100.7, 2002: 99.2, 2003: 101.2, 2004: 103.9, 2005: 101.8
}
# 以1985年为基准,计算2002年和2003年的累积居民消费价格指数
base_cpi = 100
cpi_2002 = base_cpi
cpi_2003 = base_cpi
# 连乘从1985年到2002年的CPI
for year in range(1986, 2002+1):
cpi_2002 *= cpi[year] / 100
# 连乘从1985年到2003年的CPI
for year in range(1986, 2003+1):
cpi_2003 *= cpi[year] / 100
# 输出结果
print(f"2002年的居民消费价格指数(以1985年为基准):{cpi_2002:.2f}")
print(f"2003年的居民消费价格指数(以1985年为基准):{cpi_2003:.2f}")
将两个价格指数补入原始数据表,计算人均实际纯收入(1985年可比价)和全年人均消费性支出(1985年可比价),汇总填入下表中。
年份 | 全年人均纯收入(现价) | 全年人均消费性支出(现价) | 消费价格指数(1985年为100) | 人均实际纯收入X(1985年可比价) | 人均消费性支出Y(1985年可比价) |
---|---|---|---|---|---|
1985 | 397.6 | 317.42 | 100 | 397.60 | 317.42 |
1986 | 423.8 | 357 | 106.1 | 399.43 | 336.48 |
1987 | 462.6 | 398.3 | 112.7 | 410.47 | 353.42 |
1988 | 544.9 | 476.7 | 132.4 | 411.56 | 360.05 |
1989 | 601.5 | 535.4 | 157.9 | 380.94 | 339.08 |
1990 | 686.3 | 584.63 | 165.1 | 415.69 | 354.11 |
1991 | 708.6 | 619.8 | 168.9 | 419.54 | 366.96 |
1992 | 784 | 659.8 | 176.8 | 443.44 | 373.19 |
1993 | 921.6 | 769.7 | 201 | 458.51 | 382.94 |
1994 | 1221 | 1016.81 | 214.3 | 569.76 | 474.48 |
1995 | 1577.7 | 1310.36 | 222.3 | 709.72 | 589.46 |
1996 | 1923.1 | 1572.1 | 219.1 | 877.73 | 717.53 |
1997 | 2090.1 | 1617.15 | 314.3 | 665.00 | 514.52 |
1998 | 2162 | 1590.33 | 314.3 | 687.88 | 505.99 |
1999 | 2214.3 | 1577.42 | 316.5 | 699.62 | 498.39 |
2000 | 2253.4 | 1670 | 315.2 | 714.91 | 529.82 |
2001 | 2366.4 | 1741 | 320.2 | 739.04 | 543.72 |
2002 | 2475.6 | 1834 | 330.78 | 748.41 | 554.45 |
2003 | 2622.24 | 1943.3 | 334.75 | 783.34 | 580.52 |
4.2 理论模型——一元线性回归
设被解释变量——人均消费支出\(Y\),解释变量——居民纯收入\(X\),二者之间满足线性约束,理论模型为:
\[Y_i = \beta_1 + \beta_2 X_i + u_i \]import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
# 支持中文显示
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文字体为SimHei(黑体)
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
# 数据输入:年份、X(人均实际纯收入)和Y(人均消费性支出)
data = {
'年份': [1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003],
'X': [397.60, 399.43, 410.47, 411.56, 380.94, 415.69, 419.54, 443.44,
458.51, 569.76, 709.72, 877.73, 665.00, 687.88, 699.62, 714.91,
739.04, 748.41, 783.34], # 人均实际纯收入
'Y': [317.42, 336.48, 353.42, 360.05, 339.08, 354.11, 366.96, 373.19,
382.94, 474.48, 589.46, 717.53, 514.52, 505.99, 498.39, 529.82,
543.72, 554.45, 580.52] # 人均消费性支出
}
# 将数据转换为DataFrame
df = pd.DataFrame(data)
# 定义自变量X和因变量Y
X = df['X'] # 自变量(人均实际纯收入)
Y = df['Y'] # 因变量(人均消费性支出)
# 添加常数项
X = sm.add_constant(X)
# 建立线性回归模型
model = sm.OLS(Y, X)
results = model.fit()
# 输出回归结果(类似EViews格式)
print(results.summary())
# 可视化数据点和回归线
plt.figure(figsize=(10, 6))
# 1. 绘制回归线图
plt.subplot(2, 1, 1)
plt.scatter(df['X'], Y, color='blue', label='实际数据')
plt.plot(df['X'], results.fittedvalues, color='red', label='回归线')
plt.xlabel('人均实际纯收入 (X)')
plt.ylabel('人均消费性支出 (Y)')
plt.title('人均消费性支出与人均实际纯收入的一元回归分析')
plt.legend()
# 2. 绘制残差曲线图(按年份)
plt.subplot(2, 1, 2)
residuals = results.resid # 获取残差
plt.plot(df['年份'], residuals, color='green', marker='o', linestyle='-', label='残差曲线')
plt.axhline(y=0, color='red', linestyle='--', label='零线') # 绘制零线
plt.xlabel('年份')
plt.ylabel('残差')
plt.title('残差曲线图(按年份)')
plt.legend()
# 显示图形
plt.tight_layout()
plt.show()
OLS Regression Results
==============================================================================
Dep. Variable: Y R-squared: 0.954
Model: OLS Adj. R-squared: 0.951
Method: Least Squares F-statistic: 350.8
Date: Tue, 15 Oct 2024 Prob (F-statistic): 8.71e-13
Time: 11:40:39 Log-Likelihood: -87.065
No. Observations: 19 AIC: 178.1
Df Residuals: 17 BIC: 180.0
Df Model: 1
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 76.5210 21.133 3.621 0.002 31.933 121.109
X 0.6621 0.035 18.731 0.000 0.588 0.737
==============================================================================
Omnibus: 3.548 Durbin-Watson: 0.655
Prob(Omnibus): 0.170 Jarque-Bera (JB): 1.813
Skew: 0.718 Prob(JB): 0.404
Kurtosis: 3.477 Cond. No. 2.20e+03
==============================================================================
回归方程为\(Y_i=76.5210+0.6621X_i\),Durbin-Watson检验值为0.655,说明残差之间存在自相关。
4.3 用广义差分回归对时间序列修正
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
from statsmodels.stats.diagnostic import het_breuschpagan
from statsmodels.stats.stattools import durbin_watson
# 支持中文显示
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文字体为SimHei(黑体)
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
# 数据输入:年份、X(人均实际纯收入)和Y(人均消费性支出)
data = {
'年份': [1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003],
'X': [397.60, 399.43, 410.47, 411.56, 380.94, 415.69, 419.54, 443.44,
458.51, 569.76, 709.72, 877.73, 665.00, 687.88, 699.62, 714.91,
739.04, 748.41, 783.34], # 人均实际纯收入
'Y': [317.42, 336.48, 353.42, 360.05, 339.08, 354.11, 366.96, 373.19,
382.94, 474.48, 589.46, 717.53, 514.52, 505.99, 498.39, 529.82,
543.72, 554.45, 580.52] # 人均消费性支出
}
# 将数据转换为DataFrame
df = pd.DataFrame(data)
# 对时间序列数据进行差分操作,消除趋势
df['dX'] = df['X'].diff().dropna() # 差分后的X(人均实际纯收入)
df['dY'] = df['Y'].diff().dropna() # 差分后的Y(人均消费性支出)
# 删除NA值后的数据
df_diff = df.dropna()
# 定义自变量dX和因变量dY
dX = df_diff['dX']
dY = df_diff['dY']
# 添加常数项
dX = sm.add_constant(dX)
# 建立一元线性回归模型(差分回归)
model_diff = sm.OLS(dY, dX)
results_diff = model_diff.fit()
# 输出回归结果表
print("广义差分回归结果:")
print(results_diff.summary())
# 可视化调整后的时间序列
plt.figure(figsize=(10, 6))
# 1. 绘制原始差分后的数据与回归线
plt.subplot(2, 1, 1)
plt.scatter(df_diff['dX'], dY, color='blue', label='差分后的实际数据')
plt.plot(df_diff['dX'], results_diff.fittedvalues, color='red', label='差分回归线')
plt.xlabel('差分后的实际纯收入 (dX)')
plt.ylabel('差分后的消费性支出 (dY)')
plt.title('差分后的消费性支出与实际纯收入的回归分析')
plt.legend()
# 2. 绘制残差曲线图
plt.subplot(2, 1, 2)
residuals_diff = results_diff.resid # 获取差分残差
plt.plot(df_diff['年份'], residuals_diff, color='green', marker='o', linestyle='-', label='差分残差曲线')
plt.axhline(y=0, color='red', linestyle='--', label='零线') # 绘制零线
plt.xlabel('年份')
plt.ylabel('差分残差')
plt.title('差分残差曲线图(按年份)')
plt.legend()
# 显示图形
plt.tight_layout()
plt.show()
# 计算杜宾-沃森统计量
dw_diff = durbin_watson(results_diff.resid)
print(f'杜宾-沃森统计量 (差分回归): {dw_diff}')
OLS Regression Results
==============================================================================
Dep. Variable: dY R-squared: 0.963
Model: OLS Adj. R-squared: 0.961
Method: Least Squares F-statistic: 417.8
Date: Tue, 15 Oct 2024 Prob (F-statistic): 6.84e-13
Time: 12:15:24 Log-Likelihood: -71.338
No. Observations: 18 AIC: 146.7
Df Residuals: 16 BIC: 148.5
Df Model: 1
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const -3.8131 3.309 -1.152 0.266 -10.827 3.201
dX 0.8600 0.042 20.440 0.000 0.771 0.949
==============================================================================
Omnibus: 0.439 Durbin-Watson: 1.431
Prob(Omnibus): 0.803 Jarque-Bera (JB): 0.529
Skew: 0.004 Prob(JB): 0.768
Kurtosis: 2.160 Cond. No. 81.7
==============================================================================
总结
序列相关性在经济和金融数据的建模中是一个常见的问题。序列相关性如果不加以修正,不仅会影响模型参数的估计效率,还会导致假设检验失效以及预测不准确。因此,在建模时需要对数据的特性进行充分的检验,一旦发现序列相关性存在,应及时采用适当的修正措施。广义最小二乘法、可行广义最小二乘法、差分法以及杜宾两步法等都是有效的修正序列相关性的方法,它们在不同的数据特性下提供了灵活的解决方案。