logo

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

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

実習 1

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

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

1.png

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

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

2.png

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

20190729\_161724.png

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

20190729\_162733.png

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

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

3.png

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

20190729\_164314.png

20190729\_163610.png

実際に、auto.arima()関数を使って簡単に確認してみても、少なくとも$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. ↩︎