auto_arima()以(0,0,0)返回(p,d,q)的最佳值

问题描述 投票:-1回答:1

我有一个每日频率时间序列数据集。

数据集:

           Births
Date    
1959-01-01  35
1959-01-02  32
1959-01-03  30
1959-01-04  31
1959-01-05  44
1959-01-06  29
1959-01-07  45
1959-01-08  43
1959-01-09  38
1959-01-10  27
1959-01-11  38
1959-01-12  33
1959-01-13  55
1959-01-14  47
1959-01-15  45
1959-01-16  37
1959-01-17  50
1959-01-18  43
1959-01-19  41
1959-01-20  52
1959-01-21  34
1959-01-22  53
1959-01-23  39
1959-01-24  32
1959-01-25  37
1959-01-26  43
1959-01-27  39
1959-01-28  35
1959-01-29  44
1959-01-30  38
1959-01-31  24
1959-02-01  23
1959-02-02  31
1959-02-03  44
1959-02-04  38
1959-02-05  50
1959-02-06  38
1959-02-07  51
1959-02-08  31
1959-02-09  31
1959-02-10  51
1959-02-11  36
1959-02-12  45
1959-02-13  51
1959-02-14  34
1959-02-15  52
1959-02-16  47
1959-02-17  45
1959-02-18  46
1959-02-19  39
1959-02-20  48
1959-02-21  37
1959-02-22  35
1959-02-23  52
1959-02-24  42
1959-02-25  45
1959-02-26  39
1959-02-27  37
1959-02-28  30
1959-03-01  35

对于平稳性,我使用增强的Dickey-fuller测试进行了检查,结果证明是平稳的。

我想在其上应用ARMA模型,因为我的季节性要素不存在并且数据是固定的。为了获得(p,q)的最佳值,我使用了:

from pmdarima import auto_arima
auto_arima(df1['Births'],start_p=1,max_p=6, start_q=1, max_q=6, seasonal=False, trace = True).summary()

它还给我:

Fit ARIMA: (0, 0, 0)x(0, 0, 0, 0) (constant=True); AIC=419.527, BIC=423.716, Time=0.032 seconds
Fit ARIMA: (0, 0, 1)x(0, 0, 0, 0) (constant=True); AIC=421.238, BIC=427.521, Time=0.082 seconds
Fit ARIMA: (0, 0, 2)x(0, 0, 0, 0) (constant=True); AIC=421.309, BIC=429.687, Time=0.095 seconds
Fit ARIMA: (0, 0, 3)x(0, 0, 0, 0) (constant=True); AIC=422.696, BIC=433.168, Time=0.135 seconds
Fit ARIMA: (0, 0, 4)x(0, 0, 0, 0) (constant=True); AIC=424.376, BIC=436.942, Time=0.185 seconds
Fit ARIMA: (0, 0, 5)x(0, 0, 0, 0) (constant=True); AIC=426.365, BIC=441.026, Time=0.258 seconds
Fit ARIMA: (1, 0, 0)x(0, 0, 0, 0) (constant=True); AIC=421.148, BIC=427.431, Time=0.016 seconds
Fit ARIMA: (1, 0, 1)x(0, 0, 0, 0) (constant=True); AIC=422.261, BIC=430.639, Time=0.244 seconds
Fit ARIMA: (1, 0, 2)x(0, 0, 0, 0) (constant=True); AIC=423.047, BIC=433.519, Time=0.282 seconds
Fit ARIMA: (1, 0, 3)x(0, 0, 0, 0) (constant=True); AIC=424.396, BIC=436.962, Time=0.427 seconds
Fit ARIMA: (1, 0, 4)x(0, 0, 0, 0) (constant=True); AIC=426.380, BIC=441.041, Time=0.228 seconds
Fit ARIMA: (2, 0, 0)x(0, 0, 0, 0) (constant=True); AIC=421.586, BIC=429.963, Time=0.144 seconds
Fit ARIMA: (2, 0, 1)x(0, 0, 0, 0) (constant=True); AIC=423.493, BIC=433.965, Time=0.226 seconds
Fit ARIMA: (2, 0, 2)x(0, 0, 0, 0) (constant=True); AIC=422.342, BIC=434.908, Time=0.469 seconds
Fit ARIMA: (2, 0, 3)x(0, 0, 0, 0) (constant=True); AIC=422.484, BIC=437.144, Time=0.517 seconds
Fit ARIMA: (3, 0, 0)x(0, 0, 0, 0) (constant=True); AIC=423.349, BIC=433.821, Time=0.232 seconds
Fit ARIMA: (3, 0, 1)x(0, 0, 0, 0) (constant=True); AIC=424.792, BIC=437.358, Time=0.438 seconds
Fit ARIMA: (3, 0, 2)x(0, 0, 0, 0) (constant=True); AIC=422.814, BIC=437.475, Time=0.518 seconds
Fit ARIMA: (4, 0, 0)x(0, 0, 0, 0) (constant=True); AIC=424.320, BIC=436.886, Time=0.356 seconds
Fit ARIMA: (4, 0, 1)x(0, 0, 0, 0) (constant=True); AIC=426.278, BIC=440.938, Time=0.347 seconds
Fit ARIMA: (5, 0, 0)x(0, 0, 0, 0) (constant=True); AIC=426.249, BIC=440.909, Time=0.574 seconds
Total fit time: 5.839 seconds

SARIMAX Results
Dep. Variable:  y   No. Observations:   60
Model:  SARIMAX     Log Likelihood  -207.764
Date:   Wed, 19 Feb 2020    AIC 419.527
Time:   12:06:46            BIC 423.716
Sample: 0                   HQIC 421.166
        - 60        
Covariance Type:    opg     
              coef  std err    z    P>|z|   [0.025  0.975]
intercept   39.9333 0.997   40.068  0.000   37.980  41.887
sigma2      59.5956 13.897  4.288   0.000   32.358  86.833
Ljung-Box(Q):51.46              Jarque-Bera (JB):   1.50
Prob(Q):    0.11                Prob(JB):   0.47
Heteroskedasticity (H): 0.80    Skew:   -0.01
Prob(H) (two-sided):    0.63    Kurtosis:   2.23

AIC得分最低的结果是SARIMAX(0,0,0)。

d = 0,可以理解,不需要区分。但是,p,q也为0,这在技术上意味着什么?将p和q设为0可以吗?如果有任何不清楚的地方,请告诉我。

python python-3.x time-series arima
1个回答
0
投票

tldr;

您的时间序列数据类似于(均值漂移的)白噪声;数据不支持任何潜在的自回归(AR)或移动平均(MA)过程的证据。因此,ARIMA(0,0,0)模型(均值非零)与您的数据一致。


数据可视化

在拟合(S)ARIMA模型之前,查看数据总是很有帮助的。

import matplotlib.pyplot as plt
import matplotlib.dates as dates

fig = plt.figure()
ax = fig.add_subplot(1,1,1)
plt.plot(data.Date, data.Births)
ax.xaxis.set_major_locator(dates.DayLocator(interval = 10))
ax.xaxis.set_major_formatter(dates.DateFormatter('%d/%m'))
ax.set_xlabel('DD/MM in 1959')
ax.set_ylabel("Births")
plt.show()

enter image description here

已经在这里我们看到数据或多或少类似于白噪声。

自相关和部分自相关功能

我们可以通过绘制ACF和PACF进行进一步的研究

from statsmodels.graphics.tsaplots import plot_acf
from statsmodels.graphics.tsaplots import plot_pacf
plt.figure()
plt.subplot(211)
plot_acf(data["Births"], ax = plt.gca())
plt.subplot(212)
plot_pacf(data["Births"], ax = plt.gca())
plt.show()

enter image description here

滞后<10时没有显着(部分)自相关; PACF中较高滞后的几个明显峰值可能是预期的(因为我们正在绘制95%CI),或者可能是由于其他一些时间序列“异常”所致。 IMO,鉴于数据的稀疏性,没有足够的信息来说明更多。

自动ARIMA

让我们重新运行auto_arima

from pmdarima import auto_arima
auto_arima(
    data["Births"], 
    start_p = 1, max_p = 6, 
    start_q = 1, max_q = 6, 
    seasonal = False, trace = True).summary()
#Performing stepwise search to minimize aic
#/Users/maurits/miniconda3/lib/python3.5/site-packages/statsmodels/base/model.py:568: ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals
#  "Check mle_retvals", ConvergenceWarning)
#Fit ARIMA: (1, 0, 1)x(0, 0, 0, 0) (constant=True); AIC=422.260, BIC=430.637, Time=0.255 seconds
#Fit ARIMA: (0, 0, 0)x(0, 0, 0, 0) (constant=True); AIC=419.527, BIC=423.716, Time=0.010 seconds
#Fit ARIMA: (1, 0, 0)x(0, 0, 0, 0) (constant=True); AIC=421.148, BIC=427.431, Time=0.040 seconds
#Fit ARIMA: (0, 0, 1)x(0, 0, 0, 0) (constant=True); AIC=421.238, BIC=427.521, Time=0.058 seconds
#Fit ARIMA: (0, 0, 0)x(0, 0, 0, 0) (constant=False); AIC=616.939, BIC=619.034, Time=0.010 seconds
#Total fit time: 0.383 seconds
#<class 'statsmodels.iolib.summary.Summary'>
#"""
#                               SARIMAX Results
#==============================================================================
#Dep. Variable:                      y   No. Observations:                   60
#Model:                        SARIMAX   Log Likelihood                -207.764
#Date:                Wed, 19 Feb 2020   AIC                            419.527
#Time:                        20:20:11   BIC                            423.716
#Sample:                             0   HQIC                           421.166
#                                 - 60
#Covariance Type:                  opg
#==============================================================================
#                 coef    std err          z      P>|z|      [0.025      0.975]
#------------------------------------------------------------------------------
#intercept     39.9333      0.997     40.068      0.000      37.980      41.887
#sigma2        59.5956     13.897      4.288      0.000      32.358      86.833
#===================================================================================
#Ljung-Box (Q):                       51.46   Jarque-Bera (JB):                 1.50
#Prob(Q):                              0.11   Prob(JB):                         0.47
#Heteroskedasticity (H):               0.80   Skew:                            -0.01
#Prob(H) (two-sided):                  0.63   Kurtosis:                         2.23
#===================================================================================
#
#Warnings:
#[1] Covariance matrix calculated using the outer product of gradients (complex-step).
#"""

[最佳模型是均值漂移的白噪声模型(均值的漂移由intercept参数给定)。


样本数据

import pandas as pd

data = pd.DataFrame({
    "Date": ["1959-01-01", "1959-01-02", "1959-01-03",
"1959-01-04", "1959-01-05", "1959-01-06", "1959-01-07", "1959-01-08",
"1959-01-09", "1959-01-10", "1959-01-11", "1959-01-12", "1959-01-13",
"1959-01-14", "1959-01-15", "1959-01-16", "1959-01-17", "1959-01-18",
"1959-01-19", "1959-01-20", "1959-01-21", "1959-01-22", "1959-01-23",
"1959-01-24", "1959-01-25", "1959-01-26", "1959-01-27", "1959-01-28",
"1959-01-29", "1959-01-30", "1959-01-31", "1959-02-01", "1959-02-02",
"1959-02-03", "1959-02-04", "1959-02-05", "1959-02-06", "1959-02-07",
"1959-02-08", "1959-02-09", "1959-02-10", "1959-02-11", "1959-02-12",
"1959-02-13", "1959-02-14", "1959-02-15", "1959-02-16", "1959-02-17",
"1959-02-18", "1959-02-19", "1959-02-20", "1959-02-21", "1959-02-22",
"1959-02-23", "1959-02-24", "1959-02-25", "1959-02-26", "1959-02-27",
"1959-02-28", "1959-03-01"],
    "Births": [35, 32, 30, 31, 44, 29, 45, 43, 38, 27, 38, 33, 55, 47, 45,
37, 50, 43, 41, 52, 34, 53, 39, 32, 37, 43, 39, 35, 44, 38, 24,
23, 31, 44, 38, 50, 38, 51, 31, 31, 51, 36, 45, 51, 34, 52, 47,
45, 46, 39, 48, 37, 35, 52, 42, 45, 39, 37, 30, 35]
})
data["Date"] = pd.to_datetime(data["Date"])
© www.soinside.com 2019 - 2024. All rights reserved.