본문 바로가기
통계/시계열 분석

[시계열 분석] KPSS 검정 with R

by 근수짜세 2022. 8. 19.

 

 단위근 검정을 통해 모형이 단위근(확률적 추세)을 가지는지 판별할 수 있다. 같은 말로 모형이 정상성을 가지는지 또한 단위근 검정을 통해 확인할 수 있다. 대표적인 단위근 검정으로는 ADF검정과 KPSS검정이 있는데 이 둘은 가설이 반대로 설정된다.

  $H_{0}$ $H_{1}$
ADF 검정 $ \gamma=0 $ (Has unit root) $ \gamma <0 $ (Stationary)
KPSS 검정 $\sigma_{v}^{2}=0$ (Stationary) $\sigma_{v}^{2}>0$ (Has unit root)

 

 어떤 검정이 더 좋고 나쁘고는 차이가 없다고 한다. 다만 통계학개론에서 배웠듯이 어떤 오류를 통제하고 싶은지에 따라 입맛대로 선택하면 될 듯 하다. 즉 Stationary라고 판단했을 때 생기는 오류를 조절하고 싶으면 ADF검정을, 단위근을 가진다고 판단했을 때 생기는 오류를 조절하고 싶으면 KPSS검정을 선택하면 된다.

 

KPSS 검정

 위의 표와 같은 가설 설정은 어떤 모형을 기초로 만들어졌는지 아이디어만 캐치해보자. 다음과 같은 확률적 추세를 포함한 시계열 $y_{t}$를 가정하자. 


  • 결정적 추세를 포함하지 않은 모형

$$y_{t} = \xi _{t} + e_{t} \tag{1} $$

  • 결정적 추세를 포함한 모형

$$y_{t} =\beta t + \xi _{t} + e_{t} \tag{2} $$

  • 여기서 $\xi_{t}$는 Random Walk

$$\xi_{t} = \xi_{t-1} + v_{t} \; , \quad v_{t} \sim WN(0, \sigma_{v}^{2}) $$


모형을 둘로 나눈 이유는 모형에 따라 검정통계량의 근사 분포(Asymptotic Distribution)가 달라지기 때문이다. $e_{t}$는 정상시계열을 따르고, $\xi_{t}$는 Random walk모형이다. 만약 Random Walk의 분산이 0이라면 즉, $\sigma_{v}^{2} = 0$이면 $\xi_{t} = \xi_{0} = \mu$이고 $y_{t}$는 정상시계열이 된다. 따라서 $y_{t}$에 대한 가설은 다음과 같이 설정된다.


$$H_{0} : \sigma_{v}^{2} = 0 \qquad H_{1} : \sigma_{v}^{2} > 0 $$


검정통계량은 다음과 같다.


$$KPSS = T^{-2} (\Sigma_{t=1}^{T}\hat{S_{t}}^2)/\hat{\sigma}_{\infty}^{2} $$


여기서 $\hat{S_{t}}^2 = \Sigma_{j=1}^{t} \hat{e}_{s}$이다. 즉, 적합된 회귀 모형의 잔차 $ \hat{e}_{t}= \hat{y}_{t} - \hat{\mu}$의 부분합이다. $\hat{\sigma}_{\infty}^{2}$는 $Var(e_{t})$에 대한 HAC estimator이다. HAC estimator는 Heteroskedasticity Autocorrelated Consistent estimator의 약자로 말 그대로 $e_{t}$가 이분산성, 자기상관을 가질 때 사용되는 $Var(e_{t})$에 대한 일치 추정치이다. OLS 방법으로 계산된 SE는 오차가 이분산성, 자기상관을 가질 때 $Var(e_{t})$에 대한 일치성(consistency)을 만족하지 못한다고 하니 참고만 해두자. 검정통계량 KPSS에 대한 근사 분포는 시뮬레이션을 통해 얻어질 수 있다고 한다.

 

 분포에 대한 기각치를 알고 있을 필요는 없지만, KPSS 근사 분포가 두 종류라는 사실과 오른쪽 꼬리 값에 대한 단측검정이라는 사실을 한눈에 받아들일 수 있어서 들고 왔다. 윗 줄이 결정적 추세를 포함하지 않은 기각치이고 아래가 결정적 추세를 포함한 기각치다.

 

 R에서 tseries 패키지의 kpss.test() 함수를 사용하면 KPSS 검정을 수행할 수 있다. 임의의 White Noise에 대해 kpss를 수행해보자.

WN <- runif(100, min = -0.5, max = 0.5)
WN.ts <- ts(data=WN, start=c(1,1),frequency = 1)
tseries::kpss.test(WN.ts, null = "Level")
# 
# 	KPSS Test for Level Stationarity
# 
# data:  WN.ts
# KPSS Level = 0.2051, Truncation lag parameter = 4, p-value =
# 0.1

  결정적 추세를 고려하고 싶으면, null = 'Trend' 를 쓰면 된다.

 

 참고문헌 - (1) (2)

댓글