Auto.arima with daily data:季節性/周期性をキャプチャする方法?


21

毎日の時系列にARIMAモデルを当てはめています。データは2010年2月1日から2011年7月30日まで毎日収集され、新聞販売に関するものです。週ごとの販売パターンを見つけることができるので(販売されたコピーの1日の平均量は月曜日から金曜日まで通常同じで、土曜日と日曜日に増加します)、この「季節」を捉えようとしています。売上データ「データ」を指定して、次のように時系列を作成します。

salests<-ts(data,start=c(2010,1),frequency=365)

そして、auto.arima(。)関数を使用して、AIC基準を介して最適なARIMAモデルを選択します。結果は常に非季節ARIMAモデルですが、例として次の構文でいくつかのSARIMAモデルを試してみると:

sarima1<-arima(salests, order = c(2,1,2), seasonal = list(order = c(1, 0, 1), period = 7))

より良い結果を得ることができます。tsコマンド/ arimaの仕様に何か問題はありますか?毎週のパターンは非常に強いので、キャプチャするのにそれほど多くの困難はないと思います。任意のヘルプは非常に便利です。ありがとう、ジュリア・デッピエーリ

更新:

すでにいくつかの引数を変更しました。より正確には、プロシージャはを設定するとARIMA(4,1,3)を最良のモデルとして選択しますがD=7、AICおよびその他の適合指数および予測もまったく改善されません。季節性と周期性の混同によるいくつかの間違いがあると思います。

Auto.arima呼び出しが使用され、取得された出力:

modArima<-auto.arima(salests,D=7,max.P = 5, max.Q = 5)



 ARIMA(2,1,2) with drift         : 1e+20
 ARIMA(0,1,0) with drift         : 5265.543
 ARIMA(1,1,0) with drift         : 5182.772
 ARIMA(0,1,1) with drift         : 1e+20
 ARIMA(2,1,0) with drift         : 5137.279
 ARIMA(2,1,1) with drift         : 1e+20
 ARIMA(3,1,1) with drift         : 1e+20
 ARIMA(2,1,0)                    : 5135.382
 ARIMA(1,1,0)                    : 5180.817
 ARIMA(3,1,0)                    : 5117.714
 ARIMA(3,1,1)                    : 1e+20
 ARIMA(4,1,1)                    : 5045.236
 ARIMA(4,1,1) with drift         : 5040.53
 ARIMA(5,1,1) with drift         : 1e+20
 ARIMA(4,1,0) with drift         : 5112.614
 ARIMA(4,1,2) with drift         : 4953.417
 ARIMA(5,1,3) with drift         : 1e+20
 ARIMA(4,1,2)                    : 4960.516
 ARIMA(3,1,2) with drift         : 1e+20
 ARIMA(5,1,2) with drift         : 1e+20
 ARIMA(4,1,3) with drift         : 4868.669
 ARIMA(5,1,4) with drift         : 1e+20
 ARIMA(4,1,3)                    : 4870.92
 ARIMA(3,1,3) with drift         : 1e+20
 ARIMA(4,1,4) with drift         : 4874.095

 Best model: ARIMA(4,1,3) with drift        

だから私はarima関数が次のように使用されるべきだと仮定します

bestOrder <- cbind(modArima$arma[1],modArima$arma[5],modArima$arma[2])
sarima1<-arima(salests, order = c(4,1,3))

季節成分パラメータと期間指定なし。データと探索的分析によると、2010年8月(売上の一貫した増加が登録されている場合)を除き、毎週同じパターンを週ごとに近似的に考慮することができます。残念ながら、時系列モデリングの専門知識はまったくありません。実際、これらの問題のあるデータに適合させようとした他のパラメトリックモデルとノンパラメトリックモデルの代替ソリューションを見つけるために、このアプローチを試しています。また、私は多くの従属数値変数を持っていますが、応答変数の説明には低消費電力を示しています。間違いなく、モデル化するのが最も難しい部分は時間コンポーネントです。さらに、月と平日を表すダミー変数の構築は、堅牢なソリューションではないことが判明しました。

回答:


27

週ごとの季節性がある場合、季節期間を7に設定します。

salests <- ts(data,start=2010,frequency=7) 
modArima <- auto.arima(salests)

季節的な差異の選択はauto.arima()ごく最近まであまり良くなかったことに注意してください。forecastパッケージのv2.xxを使用している場合D=1、呼び出しでを設定して、auto.arima()季節ごとの差分を強制します。forecastパッケージのv3.xxを使用している場合、自動選択のD方がはるかに優れています(CHテストの代わりにOCSBテストを使用)。

異なるレベルの差分を持つモデルのAICを比較しようとしないでください。それらは直接比較できません。AICは、同じ次数の差分を持つモデルとのみ確実に比較できます。

を呼び出しauto.arima()た後、モデルを再適合させる必要はありません。arima()選択したモデルの順序で呼び出した場合と同様に、Arimaオブジェクトが返されます。


愚かな間違いを指摘してくれてありがとう。回答を撤回します。
mpiktas

1
非常に役立つ提案をありがとうございます。予測パッケージの2.19バージョンを使用しているので、アドバイスに従って、auto.arima()呼び出しでDパラメーターを1に設定します。これで、salestsシリーズに選択された最適なモデルは、平均がゼロ以外のARIMA(1,0,0)です。返される最良のモデルの季節性部分の仕様は、P、D、Q、または少なくともDの値を意味するのでしょうか?
ジュリア

2
データに1以外の頻度がある限り、季節ARIMAモデルが考慮されます。非季節モデルが返される場合、季節性は非常に弱く、一方またはデータは、周波数> 1とTSオブジェクトに含まれていない
ロブHyndman

14

季節のARIMAを日次データに適合させる際の問題は、「季節成分」が週末または平日のみで動作する可能性があるため、全体的に有意ではない「季節成分」があることです。今、あなたがしなければならないのは、曜日を表す6つのダミーと、おそらく年間の効果を表す月次指標でデータセットを増やすことです。ここで、休日などのイベントを組み込むことを検討し、これらの既知の変数に先導、同時または遅延の影響を含めます。データに異常な値(パルス)やレベルシフト、現地時間の傾向はありません。さらに、曜日の影響は時間の経過とともに変化した可能性があります。たとえば、最初の20週間は土曜日の影響はなく、最後の50週間は土曜日の影響でした。


その場合(IrishStat)、それはARIMAではなく混合モデリングテクニックではありません。ラグは、Box Jlungテストを除き、ARIMAのどこでも取得されません。Auto.arima(最近)は、データのスケーリング、季節変動を含むすべてを修正します(だからこそ、最高のp、d、qパラメーターを見つけました)。
-wackyanil

これは伝達関数と呼ばれ、スライド42から始まるautobox.com/pdfs/capable.pdを参照してください。Auto.arimaは単純な場合には機能するかもしれませんが、私の意見では十分ではありません。データセットを念頭に置いている場合は、新しい質問を作成してそれを含めてください。
IrishStat

@IrishStatは介入を伴うARIMAを意味しましたか?曜日はダミー変数ですか?および休日の同様のダミー変数?
愛好家

はい
..それ

0

ts(3年間の毎日のデータ)の季節性の順序を決定するために、Matlabでこのコードを使用しました。

s = 0; min = 1e + 07; n = length(x); for i = 1:400 diff = x(i + 1:n)-x(1:ni); s(i)= sum(abs(diff)); if(s(i)

論理的な365が得られます。


1
サイトへようこそ。これが元の質問にどのように答えるかは私には明らかではなく、あなたが投稿したコードがそれを見るだけで何をするかは私には明らかではありません。たぶん、答えを少し広げることができますか?
einar

1
ソリューションは、固定された曜日の効果、固定されたその日の効果、その週の効果、その日の効果、休日のリードおよびラグ効果にどのように対処しますか、月曜日から金曜日の休日、月曜日の休日の前の金曜日、月ごとの影響、週ごとの影響、時間の経過に伴う休日の影響の変化、パルス、レベル/ステップシフト
IrishStat

Matlabコードs = 0; min = 1e + 07; n = length(x); for i = 1:400 diff = x(i + 1:n)-x(1:ni); s(i)= sum(abs(diff)); if(s(i)<min)min = s(i); i end end
nkabouche
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.