logo

RにおけるEACFを利用したARMAモデルの選択法 📂統計的分析

RにおけるEACFを利用したARMAモデルの選択法

実習 1

PACFは、AR(p)AR(p)の次数を決めるのに、ACFは、MA(q)MA(q)の次数を決めるのに大いに役立つ。

直接その例を見てみよう。ma1.2.sデータはMA(1)MA(1)モデルから、ar1.sデータはAR(1)AR(1)モデルから来たTSAパッケージのサンプルデータだ。TSAパッケージのacf()関数とpacf()関数を使うと、以下のように様々な時差kkに対してコレログラムcorrelogramを描いてくれる。

1.png

図だけを見て、青い線を超えるkkが多いからと言ってアルマモデルだと判断するのは危険だ。アルマモデルの可逆性のために、AR(p)AR(p)でもMA()MA(\infty)のように見えるかもしれないし、MA(q)MA(q)でもAR()AR(\infty)のように見えるかもしれないからだ。実際に、左上のAR(1)AR(1)のACFと右下のMA(1)MA(1)のPACFは、その大きさが徐々に減少するような変な傾向を呈示している。一方でAR(1)AR(1)のPACFとMA(1)MA(1)のACFは、k=1k=1以降にパッと落ちる。

問題は、実際のデータがAR(p)AR(p)なのかMA(q)MA(q)なのかあらかじめ知る方法がないことだ。 Yt:=0.6Yt1+et+0.3et1 \begin{align} Y_{t} := 0.6 Y_{t-1} + e_{t} + 0.3 e_{t-1} \end{align} 例えばarma11.sは、方程式(1)(1)で定義されたARMA(1,1)ARMA(1,1)モデルからのサンプルデータだが、そのACFとPACFを描いてみると、下のように現れる。

2.png

arma11.sは明らかにARMA(1,1)ARMA(1,1)に従うべきだが、上記の図だけを見ても明らかにAR(1)AR(1)モデルだ。これは逆に言うと、ACFとPACFだけでモデルを探していたら、ARMA(p,q)ARMA(p,q)モデルであるにもかかわらずAR(p)AR(p)モデルと判断していた可能性があるということだ。

20190729\_161724.png

通常、ACFとPACFでARMA(p,q)ARMA(p,q)モデルを調べると、通常、上の表のような傾向が現れると言われている。ARMA(p,q)ARMA(p,q)のPACFに「徐々に減少?」と疑問符が付いている理由は、まさにarma11.sのように、突然急激に減少するケースもあるからだ。時系列を説明するどの文献もこの表を参照しているわけではないが、絶対に必要十分ではない。ACFとPACFが徐々に減少するならARMA(p,q)ARMA(p,q)を疑うことができるが、ARMA(p,q)ARMA(p,q)でACFとPACFが両方とも徐々に減少するわけではない。

20190729\_162733.png

それに比べて、EACFARMA(1,1)ARMA(1,1)からサンプリングされたことを検出する。

別の例として、内蔵データlynxを見てみよう。lynxは、1821年から1934年までカナダで罠にかかったオオヤマネコの年間データだ。

3.png

ACFとPACFだけを見た場合、lynxは明らかにAR(2)AR(2)モデルに従うべきだが、実際には以下のようにARMA(2,2)ARMA(2,2)モデルに従う可能性がある。

20190729\_164314.png

20190729\_163610.png

実際に、auto.arima()関数を使って簡単に確認してみても、少なくともAR(2)AR(2)ではないことは明らかだ。このように、専門家と非専門家、ちゃんと勉強した人と適当に勉強した人の差は、分析そのものを出せるかどうかではなく、ACFPACFEACFを見て一目で違和感、問題点を素早く察知できるかどうかの差がある。図だけを見る知識があっても大いに役立ち、理論的にも理解していればなお良い。

コード

以下は例のコードだ。

library(TSA)
win.graph(6,6); par(mfrow=c(2,2))
data(ar1.s); acf(ar1.s, main="ACF of AR(1)"); pacf(ar1.s, main="PACF of AR(1)")
data(ma1.2.s); acf(ma1.2.s, main="ACF of MA(1)"); pacf(ma1.2.s, main="PACF of MA(1)")
 
win.graph(6,3); par(mfrow=c(1,2))
data(arma11.s); acf(arma11.s, main="ACF of ARMA(1,1)"); pacf(arma11.s, main="PACF of ARMA(1,1)")
eacf(arma11.s)
 
win.graph(6,3); par(mfrow=c(1,2))
data(lynx); acf(lynx, main="ACF of lynx"); pacf(lynx, main="PACF of lynx")
eacf(lynx)
library(forecast)
out<-auto.arima(lynx); summary(out)

併せて見る


  1. Cryer. (2008). Time Series Analysis: With Applications in R(2nd Edition): p117. ↩︎