时间序列分析中的Dickey-Fuller测试完整指南

1,926 阅读4分钟

在时间序列分析中,当我们为预测目的做一个模型时,我们需要一个静止的时间序列,以便更好地预测。所以建立模型工作的第一步是使时间序列静止。检验静止性是自回归建模中经常使用的一项活动。我们可以进行各种测试,如KPSS,Phillips-Perron,和Augmented Dickey-Fuller。这篇文章更侧重于Dickey-Fuller检验。文章将看到该测试背后的数学原理,以及我们如何在时间序列中实现它。

ADF(Augmented Dickey-Fuller)检验是一种统计学意义上的检验,这意味着该检验将在假设检验中给出无效假设和备选假设的结果。因此,我们将有一个P值,从中我们需要对时间序列进行推断,看它是否是静止的。

在进行ADF检验之前,我们必须了解单位根检验,因为ADF检验属于单位根检验。

单位根检验

单位根检验是检验一个时间序列是否不是静止的,在时间序列分析中包含单位根。时间序列中单位根的存在定义了无效假设,而替代假设定义了时间序列是静止的。

在数学上,单位根检验可以表示为

其中

  • Dt是决定性的成分。
  • zt是随机分量。
  • ɛt是静止的误差过程。

单位根检验的基本概念是确定zt(随机成分)是否由单位根组成。

有各种测试,其中包括单位根测试:

  • 扩增的Dickey-Fuller检验
  • 菲利普斯-佩伦检验
  • KPSS检验
  • ADF-GLS测试
  • Breusch-godfrey检验
  • Ljung-Box 检验
  • Durbin-watson检验

让我们进入我们的动机,也就是Dickey-Fuller检验。

Dickey-Fuller检验的解释。

一个简单的AR模型可以表示为:

其中

  • yt是在时间t上感兴趣的变量
  • ρ是定义单位根的系数
  • ut 是噪音,也可以看作是误差项。

如果ρ=1,单位根存在于时间序列中,时间序列是非平稳的。

如果一个回归模型可以表示为

其中

  • Δ是一个差分算子。
  • ẟ = ρ-1

因此,在这里,如果ρ=1,这意味着我们将得到差分作为误差项,如果系数有一些小于1或大于1的值,我们将看到根据过去的观察的变化。

检验可以有三个版本:

  • 单位根测试

  • 带常数的单位根测试

  • 带有常数和确定的时间趋势的单位根的测试

因此,如果一个时间序列是非稳态的,它将倾向于返回一个误差项或一个随时间值变化的确定趋势。如果该序列是静止的,那么它将倾向于只返回一个误差项或确定的趋势。在一个静止的时间序列中,一个大值之后往往会有一个小值,而一个小值之后往往会有一个大值。而在一个非平稳的时间序列中,大值和小值将以不取决于时间序列当前值的概率累积起来。

增强的Dickey-Fuller检验是Dickey-Fuller检验的延伸,它从序列中去除自相关,然后进行类似于Dickey-Fuller检验的程序。

增强的Dickey Fuller检验的工作原理是统计量,它给出了一个负数,对假设的拒绝取决于这个负数;这个负数的大小代表了对时间序列中某个水平的单位根存在的信心。

我们在一个模型上应用ADF,它在数学上可以表示为

其中

  • ɑ是一个常数
  • 𝛽是时间的系数。
  • p是自回归过程的滞后阶数。

这里在ADF的数学表示中,我们加入了差分项,使ADF和Dickey-Fuller检验之间发生了变化。

单位根检验是在无效假设𝛾=0和替代假设𝛾<0的情况下进行的。

它就可以与迪克-富勒检验的相关临界值进行比较。该检验有一个特定的分布,简单地说就是临界值的Dickey-Fuller表

这里要记住的一个关键点是。由于无效假设假设存在单位根,测试得到的p值应该小于显著性水平(例如0.05),以拒绝无效假设。因此,可以推断出该序列是静止的。

ADF检验的实施

为了在任何时间序列包中进行ADF检验,statsmodel提供了执行函数adfuller()。

函数adfuller()提供了以下信息:

  • p值
  • 检验统计量的值
  • 用于测试考虑的滞后期数量
  • 临界值

接下来,我们将用非平稳的航空公司乘客数据和平稳的温度数据进行ADF检验。

导入库:

from statsmodels.tsa.stattools import adfuller
import pandas as pd
import numpy as np

读取航空公司乘客的数据

path = '/content/drive/MyDrive/Yugesh/deseasonalizing time series/AirPassengers.csv'
data = pd.read_csv(path, index_col='Month')

检查数据的某些值:

data.head()

输出:

绘制数据:

data.plot(figsize=(14,8), title='alcohol data series')

输出:

在这里我们可以看到,我们所使用的数据是非平稳的,因为乘客的数量是随着时间的推移而正向整合。

现在我们有了所有我们需要的东西,我们可以对时间序列进行测试了。

将乘客人数作为一个序列取出:

series = data['Passengers'].values
series

输出:

对该序列进行ADF检验:



# ADF Test
result = adfuller(series, autolag='AIC')

从结果中提取数值:

print('ADF Statistic: %f' % result[0])

print('p-value: %f' % result[1])

print('Critical Values:')

for key, value in result[4].items():
    print('\t%s: %.3f' % (key, value))
if result[0] < result[4]["5%"]:
    print ("Reject Ho - Time Series is Stationary")
else:
    print ("Failed to Reject Ho - Time Series is Non-Stationary")

输出:

在这里的结果中,我们可以看到时间序列的p值大于0.05,我们可以说我们未能拒绝无效假设,时间序列是非平稳的。

现在,让我们检查一下静止数据的测试。

加载数据:

path = '/content/drive/MyDrive/Yugesh/LSTM Univarient Single Step Style/temprature.xlsx'
data = pd.read_excel(path, index_col='Date')

检查数据的一些头部值:

data.head()

输出:

这里我们可以看到,数据中有每天的平均温度值:

绘制数据:

data.plot(figsize=(14,8), title='temperature data series')

输出:

这里我们可以看到,在数据中,较大的数值在整个时间序列中跟随下一个较小的数值,所以我们可以说这个时间序列是静止的,并用ADF检验来检查它。

提取系列中的温度:

series = data['Temp'].values
series

输出:

进行ADF检验:

result = adfuller(series, autolag='AIC')

检查结果:

print('ADF Statistic: %f' % result[0])

print('p-value: %f' % result[1])

print('Critical Values:')

for key, value in result[4].items():
    print('\t%s: %.3f' % (key, value))
if result[0] > result[4]["5%"]:
    print ("Reject Ho - Time Series is Stationary")
else:
    print ("Failed to Reject Ho - Time Series is Stationary")

输出:

在结果中,我们可以看到测试得到的p值小于0.05,所以我们要拒绝 "时间序列是静止的 "这一无效假设,这意味着时间序列是非静止的。

在文章中,我们已经看到了为什么我们需要进行ADF检验,以及ADF和dickey-fuller检验所遵循的算法,以对任何时间序列进行推断。Statsmodel是一个软件包,它允许我们进行许多种关于时间序列分析的测试和分析。

参考资料