R (3.3.1) の予測パッケージ (7.3) と Python (3.5.2) の統計モデル (0.8) の間で SARIMAX フィッティング結果を比較しています。
Rコードは次のとおりです。
library(forecast)
data("AirPassengers")
Arima(AirPassengers, order=c(2,1,1), seasonal=list(order=c(0,1,0),
period=12))$aic
[1] 1017.848
Python コードは次のとおりです。
from statsmodels.tsa.statespace import sarimax
import pandas as pd
AirlinePassengers =
pd.Series([112,118,132,129,121,135,148,148,136,119,104,118,115,126,
141,135,125,149,170,170,158,133,114,140,145,150,178,163,
172,178,199,199,184,162,146,166,171,180,193,181,183,218,
230,242,209,191,172,194,196,196,236,235,229,243,264,272,
237,211,180,201,204,188,235,227,234,264,302,293,259,229,
203,229,242,233,267,269,270,315,364,347,312,274,237,278,
284,277,317,313,318,374,413,405,355,306,271,306,315,301,
356,348,355,422,465,467,404,347,305,336,340,318,362,348,
363,435,491,505,404,359,310,337,360,342,406,396,420,472,
548,559,463,407,362,405,417,391,419,461,472,535,622,606,
508,461,390,432])
AirlinePassengers.index = pd.DatetimeIndex(end='1960-12-31',
periods=len(AirlinePassengers), freq='1M')
print(sarimax.SARIMAX(AirlinePassengers,order=(2,1,1),
seasonal_order=(0,1,0,12)).fit().aic)
次のエラーがスローされます: ValueError: Non-stationary starting autoregressive parameters found with enforce_stationarity
set to True.
enforce_stationarity (およびこれも必要な enforce_invertibility) を False に設定すると、モデルの適合は機能しますが、AIC は非常に貧弱です (>1400)。
ARIMA(0,1,1)(0,0,1)[12] など、同じデータに他のモデル パラメーターを使用すると、Python で定常性と可逆性のチェックを有効にして、R と Python から同じ結果を得ることができます。
私の主な質問は次のとおりです: 一部のモデル パラメーターの動作の違いは何によって説明されますか? statsmodels の可逆性チェックは、予測の Arima とは異なり、他の方法は「より正確」ですか?
また、statsmodels の可逆性計算バグの修正に関連するプル リクエストを見つけました: https://github.com/statsmodels/statsmodels/pull/3506
Github の最新のソース コードを使用して statsmodels を再インストールした後も、上記のコードで同じエラーが発生しますが、enforce_stationarity=False および enforce_invertibility=False を設定すると、R の場合よりも低い約 1010 の aic が得られます。しかし、モデルのパラメーターも大きく異なります。