本記事は、AR、MA、ARMA、ARIMA、SARIMA、ARIMAXモデル等の特徴について。
【目次】
計算式等
< 前提>
■ 弱定常性(Weakly stationary) 時系列の期待値、分散および自己共分散が常に一定である状態(時点 t および k に依存しない状態)。単に定常性と言ったらこちらを指す。
■ 強定常性(Strongly stationary)
任意の時点の集合 {t1, t2, ..., tm} と k に対する時系列の同時密度関数 f が一定の状態(同時分布が同一となる場合)。
■ ホワイトノイズ(White noise、白色雑音)
時系列の誤差項。正規分布であり、他の時点と自己相関がない。
■ ランダムウォーク(Random walk)
ホワイトノイズの累積和により得られる時系列。
<各モデル>
■ AR(p)モデル(AutoRegressive model、自己回帰モデル)
ラグpまでの過去時点(AR(p) 成分)を説明変数に投入して現時点を表すモデル。pは自己回帰の次数、Φは自己回帰係数。
※AR(1) の時:
■ MA(q)モデル(Moving Average model、移動平均モデル)
ラグqまでの過去のホワイトノイズ(MA(q) 成分)を説明変数に投入して現時点を表すモデル。qは移動平均の次数、θは移動平均係数。
※MA(1) の時:
■ ARMA(p, q)モデル(AutoRegressive Moving Average model、自己回帰移動平均モデル)
AR(p) 成分とMA(q) 成分の両方を説明変数に投入して現時点を表すモデル。
※ARMA(1,1) の時:
■ ARIMA(p, d, q)モデル(AutoRegressive Integrated Moving Average model、自己回帰和分移動平均モデル)
観測値の時系列に対して、近似的に定常な時系列が得られるまで d階の階差(和分プロセス)をとった後に、階差の時系列に対して、ARMA(p,q) モデルを当てはめるモデル。ARIMAモデルは前期と今期のラグ1の d階差をとる。
[ 1階差 ]
[ 2階差 ]
※ARIMA(p, 1, q) の時:
※ARIMA(1, 1, 1) の時:
※追記:SARIMAとARIMAXを加えます。
■ SARIMA(p, d, q)(P, D, Q)[m] モデル(Seasonal AutoRegressive Integrated Moving Average model、季節自己回帰和分移動平均モデル)
ARIMAモデルと同じ要領でラグ m の季節階差(D階差)をとった後にARMAを当てはめるモデル。ラグ演算子(Lm)を用いて表現する。ラグ演算子の上付き文字はラグを表す(Lm yt = yt-m)。
※SARIMA(1, 1, 1) (1, 1, 1) [12] の時(階差と12周期季節階差の2階差):
※季節の自己回帰係数
■ ARIMAXモデル(AutoRegressive Integrated Moving Average with eXogenous variables、外生変数付き自己回帰和分移動平均モデル)
ARIMAモデルに回帰成分 β x (外生変数、eXogenous vriables)を組み込んだモデル。例として閏日や祝日などのカレンダー効果、気温・降水量などの天候、災害や制度変更での水準変動を表す干渉シフト(一定期間フラグを立てる)などを導入する。
ノート
上に示した過程はARIMAモデルで表すことができる(SARIMA、ARIMAX除く)。
・ARIMA(0,0,0):ホワイトノイズ
・ARIMA(0,1,0):ランダムウォーク
・ARIMA(p,0,0):AR(p)モデル
・ARIMA(0,0,q):MA(q)モデル
・ARIMA(p,0,q):ARMA(p,q)モデル
・ARIMA(p,d,q):ARIMA(p,d,q)モデル
また、MA(q) モデルは時点 t に依存しないため常に定常だが、
AR(p) モデルは、次に示す特性方程式の解(複素解含む)の絶対値がすべて1未満であることが、定常性の必要十分条件と言われる。
AR(1) モデルなら 1 < |Φ1| の場合。つまり、Φ1 が1を超えると非定常になってしまう。
ここからは、自己回帰係数Φと平均移動係数θの違いによる振る舞いを見てみる。
次のように適当な定数項 c とホワイトノイズ( =NORM.INV(RAND(),0,0.5) )を準備し、n=150 の観測値の時系列を作成。
※Excelでの例示は雑なのでイメージ程度にとどめてほしい。また、ARモデルの初期値は0にしている。
この観測値の時系列に対して、AR(1) とMA(1) モデルを当てはめて、自己回帰係数Φと平均移動係数θによる変化を見てみる。
先ほどの AR(1) モデルの定常性条件(1 < |Φ1| )を頭に入れて見てみると、自己回帰係数Φの絶対値が1以上の Φ=1.1 と Φ=-1.1 で非定常になっていることが良く分かる(予測モデルとして使えない)。
また、MA(1) モデルは定数項 c 付近でバラつく定常な時系列であることが分かる。
次に、先ほどの観測値の時系列にトレンド(時点毎に 0.5 増える)を加えてみる。このトレンド付きの時系列について、ラグ1の1階差(d=1)をとったときの振る舞いを見てみる。
※こちらも例示は雑なのでイメージ程度にとどめてほしい。また、初期値は0にしている。
1階差をとった後、階差の時系列が定常になったことが分かる。
今回、AR(1) とMA(1) モデルでいくつかと1階差を1つ例示したが、ARIMA(p,d,q) でどのようなパラメタ設定が良いか(ベストモデルは何か)は、AICやRMSE等の評価指標を用いて判断する。
r では forecastパッケージでここらができるので次回記事にしたい。
SAS にも proc ARIMA があるので余裕があれば。
なお、ARIMA(p,d,q) に従う観測値の時系列は、r の stats::arima.sim関数で比較的簡単に作れるので備忘録がてらメモする。
stats::arima.sim(model=list(order=c(p,d,q), ar=c(x,...), ma=c(x,...), n=x))
AR(p)、MA(q) に従う観測値の時系列:
library(tidyverse) set.seed(1) ads1 <- data.frame() ads1 <- union_all(ads1, data.frame(x=1:200, AVAL=arima.sim(model=list(order=c(1,0,0), ar=c(0.3)), n=200), TYPE="01. AR(1) Φ1 = 0.3")) ads1 <- union_all(ads1, data.frame(x=1:200, AVAL=arima.sim(model=list(order=c(2,0,0), ar=c(0.3,0.5)), n=200), TYPE="02. AR(2) Φ1 = 0.3, Φ2 = 0.5")) ads1 <- union_all(ads1, data.frame(x=1:200, AVAL=arima.sim(model=list(order=c(3,0,0), ar=c(0.3,0.5,0.1)), n=200), TYPE="03. AR(3) Φ1 = 0.3, Φ2 = 0.5, Φ3 = 0.1")) ads1 <- union_all(ads1, data.frame(x=1:200, AVAL=arima.sim(model=list(order=c(0,0,1), ma=c(0.3)), n=200), TYPE="04. MA(1) θ1 = 0.3")) ads1 <- union_all(ads1, data.frame(x=1:200, AVAL=arima.sim(model=list(order=c(0,0,2), ma=c(0.3,0.5)), n=200), TYPE="05. MA(2) θ1 = 0.3, θ2 = 0.5")) ads1 <- union_all(ads1, data.frame(x=1:200, AVAL=arima.sim(model=list(order=c(0,0,3), ma=c(0.3,0.5,0.1)), n=200), TYPE="06. MA(3) θ1 = 0.3, θ2 = 0.5, θ3 = 0.1")) ggplot(ads1, aes(x=x, y=AVAL)) + geom_line() + facet_wrap(. ~ TYPE, ncol=3)
ARMA(p,q) に従う観測値の時系列:
set.seed(1) ads2 <- data.frame() ads2 <- union_all(ads2, data.frame(x=1:200, AVAL=arima.sim(model=list(order=c(1,0,1), ar=c(0.3), ma=c(0.3)), n=200), TYPE="01. ARIMA(1,0,1) \n Φ1 = 0.3 \n θ1 = 0.3")) ads2 <- union_all(ads2, data.frame(x=1:200, AVAL=arima.sim(model=list(order=c(2,0,2), ar=c(0.3,0.5), ma=c(0.3,0.5)), n=200), TYPE="02. ARIMA(2,0,2) \n Φ1 = 0.3, Φ2 = 0.5 \n θ1 = 0.3, θ2 = 0.5")) ads2 <- union_all(ads2, data.frame(x=1:200, AVAL=arima.sim(model=list(order=c(3,0,3), ar=c(0.3,0.5,0.1), ma=c(0.3,0.5,0.1)), n=200), TYPE="03. ARIMA(3,0,3) \n Φ1 = 0.3, Φ2 = 0.5, Φ3 = 0.1 \n θ1 = 0.3, θ2 = 0.5, θ3 = 0.1")) ggplot(ads2, aes(x=x, y=AVAL)) + geom_line() + facet_wrap(. ~ TYPE, ncol=3)
ARIMA(p,d,q) に従う観測値の時系列:
set.seed(1) ARIMA212 <- data.frame(y=arima.sim(model=list(order=c(2,1,2), ar=c(0.3,0.5), ma=c(0.3,0.5)), n=200), id=1:201) ggplot(data=ARIMA212, mapping=aes(x=id, y=y)) + geom_line() + labs(title="ARIMA(2,1,2)", subtitle="(AR: Φ1 = 0.3, Φ2 = 0.5, MA: θ1 = 0.3, θ2 = 0.5)" ,x="時点", y="", caption="🄫Cochineal19") + theme(plot.title=element_text(size=30) ,plot.subtitle=element_text(size=25) ,axis.title=element_text(size=25) ,axis.text=element_text(size=20)) set.seed(1) ARIMA222 <- data.frame(y=arima.sim(model=list(order=c(2,2,2), ar=c(0.3,0.5), ma=c(0.3,0.5)), n=200), id=1:202) ggplot(data=ARIMA222, mapping=aes(x=id, y=y)) + geom_line() + labs(title="ARIMA(2,2,2)", subtitle="(AR: Φ1 = 0.3, Φ2 = 0.5, MA: θ1 = 0.3, θ2 = 0.5)" ,x="時点", y="", caption="🄫Cochineal19") + theme(plot.title=element_text(size=30) ,plot.subtitle=element_text(size=25) ,axis.title=element_text(size=25) ,axis.text=element_text(size=20))
本日は時系列の特徴について。ここまで。
参考
統計学(出版:東京図書), 日本統計学会編
カルマンフィルタ Rを使った時系列予測と状態空間モデル(出版:共立出版), 野村俊一
http://elsur.jpn.org/202004MMM/chap5.pdf
http://yuchimatsuoka.github.io/seminar/timeseries1.pdf
3.3 Model structure | Fisheries Catch Forecasting
【ML Tech RPT. 】第17回 構造に関連する機械学習を学ぶ (3) ~時系列予測~ - Sansan Builders Blog