2020/05/28

R - 実践編 3 時系列の単位根検定

R で実際に時系列データの単位根検定をしてみましょう。Phillips-Perron 検定と Augmented Dickey-Fuller 検定が使用できます。

ランダムウォークと単位根

ランダムウォークと単位根については、詳しくはこちらの記事を見ていただければと思います。簡単に触れておくと、時系列データを$y_t = ay_{t-1} + \epsilon_t, \epsilon_t \sim iid(0, \sigma^2)$とモデル化できるとした場合、$|a| = 1$であれば、この$y_t$はランダムウォークと呼ばれます。また同時に、この時系列は「単位根を持つ」と言われます。
ランダムウォークは非定常過程ですが、単位根を持つ場合、1階の階差を取ると$iid$過程になるため、弱定常過程に変化します。

単位根検定

時系列がランダムウォークであるかどうか (すなわち単位根を持つかどうか) を調べることを単位根検定と言います。単位根検定とは、「$|a| = 1$である」という帰無仮説を置いた帰無仮説検定です。
R を使って時系列の単位根検定を行ってみましょう。以下のような時系列 TS を題材にします。
> class(TS)
[1] "xts" "zoo"
> names(TS)
[1] "X"
> summary(TS)
     Index                           X           
 Min.   :****-**-** **:**:**   Min.   :-77287.0  
 1st Qu.:****-**-** **:**:**   1st Qu.:  -927.0  
 Median :****-**-** **:**:**   Median :  -348.0  
 Mean   :****-**-** **:**:**   Mean   :  -355.2  
 3rd Qu.:****-**-** **:**:**   3rd Qu.:   366.0  
 Max.   :****-**-** **:**:**   Max.   : 70648.0  
> length(TS)
[1] 85497
> sqrt(var(TS))
        X
X 1481.54

TS は xts クラスの時系列データで、X という列1つだけが含まれています。X の分布は summary(TS) の結果として表示されている通りです。件数は85,497件、標準偏差は1481.54となっています。たかだか85,497件しかないのに、$-52.17\sigma\sim47.69\sigma$の範囲に幅広く分布しています。なかなか恐ろしいデータです。

Phillips-Perron 検定

R では、単位根検定の一種である、Phillips-Perron 検定を行う関数として、PP.test() が用意されています。stats パッケージに入っています。実行してみましょう。
> PP.test(TS)

 Phillips-Perron Unit Root Test

data:  TS
Dickey-Fuller = -117.1077999999999974534, Truncation lag parameter =
21, p-value = 0.01

p-value = 0.01 なので、「単位根がある」という帰無仮説は棄却されたことになります。つまり、TS には単位根は無いであろう、という結果です。

Augmented Dickey-Fuller 検定

tseries パッケージには、Augmented Dickey-Fuller 検定を行う adf.test() 関数があります。帰無仮説は「単位根を持つ」で、対立仮説は「$|a| < 1$ (stationary)」か「$|a| > 1$ (explosive)」を選ぶことができます。実行してみましょう。
> adf.test(TS)

 Augmented Dickey-Fuller Test

data:  TS
Dickey-Fuller = 210.4179000000000030468, Lag order = 44, p-value = 0.99
alternative hypothesis: stationary

 警告メッセージ:
In adf.test(TS) : p-value greater than printed p-value

デフォルトでは対立仮説は stationary になっています。こちらでは、p-value = 0.99 ですので、帰無仮説が棄却されませんでした。対立仮説を explosive に変えてみましょう。
> adf.test(TS, alternative="explosive")

 Augmented Dickey-Fuller Test

data:  TS
Dickey-Fuller = 210.4179000000000030468, Lag order = 44, p-value = 0.01
alternative hypothesis: explosive

 警告メッセージ:
In adf.test(TS, alternative = "explosive") :
  p-value greater than printed p-value

今度は p-value = 0.01 で帰無仮説は棄却されました。併せて考えると、「単位根は無い」ということになり、PP.test() と同じ結論になりました。