在时间序列分析中,当我们为预测目的做一个模型时,我们需要一个静止的时间序列,以便更好地预测。所以建立模型工作的第一步是使时间序列静止。检验静止性是自回归建模中经常使用的一项活动。我们可以进行各种测试,如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是一个软件包,它允许我们进行许多种关于时间序列分析的测试和分析。