这个时间序列是否静止?

时间:2018-03-27 06:28:20

标签: 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

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

更新

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

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

当预测时间序列时,ARIMA模型需要输入时间序列是静止的。 如果输入不是静止的,则应log()diff()以使其静止, 然后将其融入模型中。

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

2 个答案:

答案 0 :(得分:4)

结果不同,因为拟合的模型略有不同,因为模型的滞后顺序完全不同。蟒蛇测试包括一个恒定的漂移&#39; term(估计常数因此将时间序列定为零),但R检验包括常数和线性趋势项。这可以在python代码中使用参数regression = 'ct'指定。

r

中的默认滞后长度

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

python中的默认滞后长度

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

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

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

很难看出这是否与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

在python中:

In [6]: adfuller(ts, regression="ct")[1]
Out[6]: 0.58756464088883864

不完美,但非常接近。

注意:

python模型的实际Dickey-Fuller测试统计是

In [8]: adfuller(ts, regression="ct")[0]
Out[8]: -2.025340637385288

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

答案 1 :(得分:1)

Augmented Dickey-Fuller测试的p值对滞后顺序的选择相当敏感。例如,这里是R中具有更高滞后顺序的相同测试:

> adf.test(rd$Sales, k=9)

    Augmented Dickey-Fuller Test

data:  rd$Sales
Dickey-Fuller = -2.9186, Lag order = 9,
p-value = 0.2004
alternative hypothesis: stationary

adf.test的文档说它使用具有常量和线性趋势的回归。我们应该通过参数regression =&#39; ct&#39; adfuller使用相同的回归方法。

我目前在我的机器上遇到了一些statsmodel的问题,但我建议你尝试以下参数,看看你是否有更接近的信件:

adfuller(a, maxlag=9, autolag=None, regression='ct')

您要查找的是两者是否显示相同的检验统计量,因为两个包之间的p值确定不同。