这个时间序列是否静止?

Cha*_*had 7 python r time-series statsmodels arima

我想检查TS.csv中保存的时间序列数据的静止.

但是,R tseries::adf.test()和Python的statsmodels.tsa.stattools.adfuller() 结果完全不同.

adf.test()显示它是静止的(p <0.05),同时adfuller()显示它是非静止的(p> 0.05).

以下代码有什么问题吗?

在R和Python中测试固定时间序列的正确过程是什么?

谢谢.

R代码:

> rd <- read.table('Data/TS.csv', sep = ',', header = TRUE)
> inp <- ts(rd$Sales, frequency = 12, start = c(1965, 1))
> inp
     Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
1965 154  96  73  49  36  59  95 169 210 278 298 245
1966 200 118  90  79  78  91 167 169 289 347 375 203
1967 223 104 107  85  75  99 135 211 335 460 488 326
1968 346 261 224 141 148 145 223 272 445 560 612 467
1969 518 404 300 210 196 186 247 343 464 680 711 610
1970 613 392 273 322 189 257 324 404 677 858 895 664
1971 628 308 324 248 272
> library(tseries)
> adf.test(inp)

    Augmented Dickey-Fuller Test

data:  inp
Dickey-Fuller = -7.2564, Lag order = 4, p-value = 0.01
alternative hypothesis: stationary
Run Code Online (Sandbox Code Playgroud)

Python代码(来自Time_Series.ipynb):

import pandas as pd
from statsmodels.tsa.stattools import adfuller
df = pd.read_csv('Data/TS.csv')
ts = pd.Series(list(df['Sales']), index=pd.to_datetime(df['Month'],format='%Y-%m'))
s_test = adfuller(ts, autolag='AIC')
print("p value > 0.05 means data is non-stationary: ", s_test[1])
# output: p value > 0.05 means data is non-stationary:  0.988889420517
Run Code Online (Sandbox Code Playgroud)

更新

@gfgm提供了很好的解释,为什么R和Python的结果不同,以及如何通过更改参数使它们相同.

对于上面的第二个问题:"在R和Python中测试时间序列的固定的正确过程是什么?".我想提供一些细节:

在预测时间序列时,ARIMA模型需要输入时间序列是静止的.如果输入不是静止的,则应对其进行log()编辑或diff()编辑以使其静止,然后将其装入模型中.

所以问题是:我应该认为输入是静止的(使用R的默认参数)并将其直接拟合到ARIMA模型中,或者认为它是非静态的(使用Python的默认参数),并使其具有额外功能(如log()diff()) ?

gfg*_*fgm 5

结果不同是因为拟合的模型略有不同,而且模型的滞后顺序完全不同。python 测试包括常数“漂移”项(估计常数,因此将时间序列集中在零),但 R 测试包括常数和线性趋势项。这可以在带有参数的 python 代码中指定regression = 'ct'

r 中的默认滞后长度

nlag = trunc((length(x)-1)^(1/3))

python中的默认滞后长度

12*(nobs/100)^(1/4)

当您运行 python 代码时,您告诉函数根据 AIC 标准选择最佳滞后长度。如果我们告诉 python 运行一个居中和去趋势的模型,并告诉它使用 R 滞后长度标准,我们得到:

In [5]: adfuller(ts, regression="ct", maxlag = 4)[1]
Out[5]: 3.6892966741832268e-09
Run Code Online (Sandbox Code Playgroud)

很难看出这是否与 R 结果相同,因为 R 将其 p 值四舍五入为 .01,但我们可以告诉 R 使用 python 的滞后长度,并告诉 python 使用 R 的模型(我不能用这个改变 R 中的模型功能)。我们得到:

adf.test(inp, k = ceiling(12*(length(inp)/100)^(1/4)))

    Augmented Dickey-Fuller Test

data:  inp
Dickey-Fuller = -2.0253, Lag order = 12, p-value = 0.5652
alternative hypothesis: stationary
Run Code Online (Sandbox Code Playgroud)

在 python 中:

In [6]: adfuller(ts, regression="ct")[1]
Out[6]: 0.58756464088883864
Run Code Online (Sandbox Code Playgroud)

不完美,但非常接近。

笔记:

python 模型的实际 Dickey-Fuller 检验统计量是

In [8]: adfuller(ts, regression="ct")[0]
Out[8]: -2.025340637385288
Run Code Online (Sandbox Code Playgroud)

这与 R 结果相同。测试可能使用不同的方法从统计数据计算 p 值。