Rで 単位根検定と6つの検定統計量 を確認します。
1. 単位根検定と6つの検定統計量の解説
単位根とは?
時系列データが単位根(Unit Root)を持つとは、そのデータが非定常過程であり、過去のショック(誤差)の影響が永続的に残る性質を持つことを意味します。代表的な単位根過程はランダムウォーク (y_t = y_{t-1} + ε_t
) です。単位根を持つデータに対して通常の回帰分析を行うと、変数間に本当は関係がないのに、見かけ上は有意な関係があるように見えてしまう「見せかけの回帰」という問題が発生します。
そのため、回帰分析の前にデータが定常過程か、それとも単位根過程かを確認する必要があります。そのための統計的検定が単位根検定であり、多くの場合で利用されるのがDickey-Fuller (DF)検定およびその拡張版である拡張Dickey-Fuller (ADF)検定です。
Dickey-Fuller検定の3つのモデル
DF検定では、データがどのような非定常性を持つかに応じて、以下の3つの回帰モデルを使い分けます。
- モデル1: 定数項なし、トレンドなし (None)
Δy_t = γ * y_{t-1} + ε_t
- 純粋なランダムウォークを想定したモデルです。
- モデル2: 定数項あり、トレンドなし (Drift)
Δy_t = μ + γ * y_{t-1} + ε_t
- ドリフト付きランダムウォーク(一定の方向に流れていく傾向)を想定したモデルです。
- モデル3: 定数項あり、トレンドあり (Trend)
Δy_t = μ + β*t + γ * y_{t-1} + ε_t
- 時間トレンドの周りをランダムウォークする過程を想定したモデルです。
これらのモデルにおいて、検定の核心は係数 γ
が0であるかどうかを調べることです。
- 帰無仮説 H₀:
γ = 0
→ 単位根が存在する(非定常) - 対立仮説 H₁:
γ < 0
→ 単位根は存在しない(定常またはトレンド定常)
6つの検定統計量
これらのモデルと帰無仮説の組み合わせから、以下の6つの主要な検定統計量が導出されます。これらの統計量の分布は、一般的なt分布やF分布とは異なるDickey-Fuller分布に従うため、専用の臨界値を用いて検定を行います。
検定モデル | 回帰式 | 検定統計量 | 帰無仮説 (H₀) | 対立仮説 (H₁) | R(urca )でのType |
---|---|---|---|---|---|
モデル1 | Δy_t = γ * y_{t-1} + ε_t | tau1 (τ₁) | γ = 0 (単位根あり) | γ < 0 (定常) | none |
モデル2 | Δy_t = μ + γ * y_{t-1} + ε_t | tau2 (τ₂) | γ = 0 (単位根あり) | γ < 0 (定常) | drift |
phi1 (Φ₁) | γ = 0 and μ = 0 (ドリフトなし単位根) | H₀でない | drift | ||
モデル3 | Δy_t = μ + β*t + γ * y_{t-1} + ε_t | tau3 (τ₃) | γ = 0 (単位根あり) | γ < 0 (トレンド定常) | trend |
phi2 (Φ₂) | γ = 0 and μ=0 and β = 0 (純粋なランダムウォーク) | H₀でない | trend | ||
phi3 (Φ₃) | γ = 0 and β = 0 (トレンドなし単位根) | H₀でない | trend |
- tau (τ) 統計量:
γ
の係数が0であるという仮説を検定するための、t検定統計量に似た統計量です。 - phi (Φ) 統計量:
γ
や定数項μ
、トレンド項β
の係数が同時に0であるという複合仮説を検定するための、F検定統計量に似た統計量です。
2. Rによるシミュレーション
それでは、実際にRを用いてシミュレーションを行い、これらの統計量がどのような分布を示すかを確認します。
2.1. 準備
まず、シミュレーションと可視化に必要なライブラリを読み込みます。
# ライブラリの読み込み
library(urca)
library(ggplot2)
library(dplyr)
library(tidyr)
<- "D:/result_output" result_output
2.2. サンプルデータの作成と可視化
単位根過程(ランダムウォーク)と定常過程(AR(1)モデル)のデータを生成し、その違いを視覚的に確認します。
<- 20250703
seed set.seed(seed)
<- 150
n_obs
# 単位根過程 (ランダムウォーク)
<- cumsum(rnorm(n_obs))
random_walk
# 定常過程 (AR(1)モデル, ρ=0.7)
<- arima.sim(model = list(ar = 0.7), n = n_obs)
stationary_ar1
# データフレームに整形
<- data.frame(
df_sample time = 1:n_obs,
`単位根過程 (Random Walk)` = random_walk,
`定常過程 (Stationary AR(1))` = stationary_ar1, check.names = F
%>%
) pivot_longer(cols = -time, names_to = "process_type", values_to = "value")
# ggplotでプロット
ggplot(df_sample, aes(x = time, y = value, color = process_type)) +
geom_line(linewidth = 1) +
labs(
title = "単位根過程と定常過程の比較",
x = "時間",
y = "値",
color = "過程の種類"
+
) theme_minimal(base_size = 14) +
theme(legend.position = "top")
プロットから、定常過程は平均値の周りを変動しているのに対し、単位根過程は特定の平均値に戻る傾向がなく、不規則に変動し続ける様子がわかります。
2.3. シミュレーションの実行
帰無仮説(データが単位根過程である)が真の場合、6つの検定統計量がどのような分布になるかをシミュレーションで確認します。ランダムウォークデータを多数生成し、それぞれに対してDF検定を実行して統計量を収集します。
set.seed(seed)
# シミュレーションの設定
<- 2000 # シミュレーション回数
n_sim <- 100 # 各時系列の長さ
n_obs
# 結果を格納するデータフレームを初期化
<- tibble(
results sim_id = 1:n_sim,
tau1 = numeric(n_sim),
tau2 = numeric(n_sim),
phi1 = numeric(n_sim),
tau3 = numeric(n_sim),
phi2 = numeric(n_sim),
phi3 = numeric(n_sim)
)
# シミュレーションループ
for (i in 1:n_sim) {
# 帰無仮説が真となるデータ (ランダムウォーク) を生成
<- cumsum(rnorm(n_obs))
y
# type = "none" の検定 (tau1)
<- ur.df(y, type = "none", lags = 0)
res_none $tau1[i] <- res_none@teststat[1, 1]
results
# type = "drift" の検定 (tau2, phi1)
<- ur.df(y, type = "drift", lags = 0)
res_drift $tau2[i] <- res_drift@teststat[1, 1]
results$phi1[i] <- res_drift@teststat[1, 2]
results
# type = "trend" の検定 (tau3, phi2, phi3)
<- ur.df(y, type = "trend", lags = 0)
res_trend $tau3[i] <- res_trend@teststat[1, 1]
results$phi2[i] <- res_trend@teststat[1, 2]
results$phi3[i] <- res_trend@teststat[1, 3]
results
}
# tbl オブジェクトの保存
setwd(result_output)
saveRDS(object = results, file = "unit_root.rds")
2.4. シミュレーション結果の可視化と考察
シミュレーションで得られた2000個の検定統計量の分布をヒストグラムで可視化します。また、urca
パッケージから取得できる5%水準の臨界値(Critical Value)を破線で追加し、棄却域との関係を見ます。
set.seed(seed)
# tbl オブジェクトの読み込み
setwd(result_output)
<- readRDS("unit_root.rds")
results
# 臨界値を取得 (urcaパッケージのsummaryオブジェクトから)
<- cumsum(rnorm(100)) # 臨界値取得用のダミーデータ
y_dummy <- summary(ur.df(y_dummy, type = "none", lags = 0))
summary_none <- summary(ur.df(y_dummy, type = "drift", lags = 0))
summary_drift <- summary(ur.df(y_dummy, type = "trend", lags = 0))
summary_trend
<- tibble(
cvals_df statistic = factor(c("tau1", "tau2", "phi1", "tau3", "phi2", "phi3"),
levels = c("tau1", "tau2", "tau3", "phi1", "phi2", "phi3")
),critical_value = c(
@cval[1, "5pct"], # tau1
summary_none@cval["tau2", "5pct"], # tau2
summary_drift@cval["phi1", "5pct"], # phi1
summary_drift@cval["tau3", "5pct"], # tau3
summary_trend@cval["phi2", "5pct"], # phi2
summary_trend@cval["phi3", "5pct"] # phi3
summary_trend
)
)
# プロット用にデータを整形
<- results %>%
results_long select(-sim_id) %>%
pivot_longer(everything(), names_to = "statistic", values_to = "value") %>%
mutate(statistic = factor(statistic, levels = c("tau1", "tau2", "tau3", "phi1", "phi2", "phi3")))
# ggplotで分布をプロット
ggplot(results_long, aes(x = value)) +
geom_histogram(aes(y = ..density..), bins = 50, fill = "skyblue", color = "black", alpha = 0.7) +
geom_density(color = "red", linewidth = 1) +
# 臨界値を垂線として追加
geom_vline(
data = cvals_df, aes(xintercept = critical_value),
color = "blue", linetype = "dashed", linewidth = 1.2
+
) facet_wrap(~statistic, scales = "free", ncol = 3) +
labs(
title = "単位根過程における各検定統計量の分布(シミュレーション結果)",
subtitle = "青い破線は5%棄却臨界値。検定統計量がこの線より左(tau)または右(phi)にあれば帰無仮説は棄却される。",
x = "検定統計量の値",
y = "密度"
+
) theme_bw(base_size = 12)
考察
- tau (τ) 統計量 (τ₁, τ₂, τ₃):
- これらの分布は0より左側に偏っています。
- 検定は片側検定で行われ、検定統計量が臨界値(青い破線)よりも左側にあれば、単位根の帰無仮説は棄却されます。
- 今回のシミュレーションでは帰無仮説が真(単位根を持つ)のデータを生成したため、ほとんどの統計量は臨界値よりも右側に分布しており、正しく「帰無仮説を棄却できない」と判断されることがわかります。5%水準の検定なので、約5%の試行では誤って棄却されます(第一種の過誤)。
- phi (Φ) 統計量 (Φ₁, Φ₂, Φ₃):
- これらの分布は正規分布やt分布とは明らかに異なり、右に裾の長い形状をしています。
- 検定はF検定のように、検定統計量が臨界値よりも右側にあれば帰無仮説を棄却します。
- こちらも、ほとんどの統計量は臨界値より左側にあり、複合仮説(例:
γ=0
かつβ=0
)が棄却されないことがわかります。
3. まとめ
本シミュレーションを通じて、以下の点が明らかになりました。
- 単位根検定の統計量は特殊な分布に従う: DF検定の統計量は、標準的な分布に従わないため、専用の臨界値が必要です。
- モデル選択の重要性: データが従う過程(定数項やトレンドの有無)に応じて、適切な検定モデル(
none
,drift
,trend
)を選択し、対応する検定統計量(tau1
,tau2
,tau3
など)を解釈する必要があります。
以上です。