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을 그려준다.
그림만 봤을 때 파란 선을 넘어가는 $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를 그려보면 다음과 같이 나타난다.
arma11.s
는 분명히 $ARMA(1,1)$ 를 따라야하지만 위의 그림만 보아서는 영락없는 $AR(1)$ 모형이다. 이는 반대로 말해서 ACF와 PACF만으로 모형을 찾고 있었다면 $ARMA(p,q)$ 모형이었는데도 $AR(p)$ 모형으로 판단했을 가능성이 있다는 것이다.
보통 ACF와 PACF로 $ARMA(p,q)$ 모형을 검사해보면 보통 위의 표와 같은 추이가 나타난다고 한다. $ARMA(p,q)$ 의 PACF에 ‘점점 감소?‘라고 물음표가 붙은 이유는 바로 위의 arma11.s
처럼 바로 급감하는 경우도 왕왕 있기 때문이다. 시계열에 대해 설명하는 그 어떤 문서든 저 표를 참고하지만, 반드시 필요충분인 것은 아니다. ACF와 PACF가 점점 감소한다면 $ARMA(p,q)$ 를 의심해볼 수 있지만 $ARMA(p,q)$ 라고 ACF와 PACF가 둘 다 점점 감소하는 것은 아니다.
그에 비해 EACF는 $ARMA(1,1)$ 에서 샘플링되었음을 디텍트해낸다.
다른 예제로써 내장데이터 lynx
를 살펴보자. lynx
는 1821년부터 1934년까지 캐나다에서 스라소니가 덫에 잡힌 수에 대한 연간 데이터다.
ACF와 PACF만 보았을 때 lynx
는 영락없는 $AR(2)$ 모형을 따라야하지만, 실제로는 다음과 같이 $ARMA(2,2)$ 모형을 따를 수 있다.
실제로 auto.arima()
함수를 통해 간단하게 확인해봐도 일단 $AR(2)$ 가 아닌 것은 확실하게 장담할 수 있다. 이렇듯 전공자와 비전공자의 차이, 제대로 공부한 사람과 대충 공부한 사람의 차이는 분석 자체를 내놓을 수 있느냐 없느냐가 아니라 ACF, PACF, EACF를 볼 수 있어서 분석을 한 눈에 보았을 때 위화감, 문제점을 빠르게 눈치채느냐 못채느냐의 차이가 있다. 그림만 볼 줄 알아도 큰 도움이 되고, 이론적으로도 이해하고 있다면 더할나위 없다.
코드
아래는 예제코드다.
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)
같이보기
Cryer. (2008). Time Series Analysis: With Applications in R(2nd Edition): p117. ↩︎