[英]How to find the p,d,q values selected in auto_arima() Python?
[英]auto_arima() returning best value of (p,d,q) as (0,0,0)
我有一个每日频率时间序列数据集。
数据集:
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
对于平稳性,我使用 Augmented 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 可以吗? 如果有任何不清楚的地方,请告诉我。
您的时间序列数据类似于(均值偏移)白噪声; 数据不支持任何潜在自回归 (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()
我们已经在这里看到数据或多或少类似于白噪声。
我们可以通过绘制 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()
在滞后 < 10 处没有显着的(部分)自相关; PACF 中较高滞后的少数显着峰值可能如预期的那样(因为我们绘制了 95% 的 CI),或者可能是由于其他一些时间序列“异常”。 IMO,鉴于数据的稀疏性,没有足够的信息来说明更多。
让我们重新运行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"])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.