Rで単位根検定と6つの検定統計量

Rで 単位根検定と6つの検定統計量 を確認します。

1. 単位根検定と6つの検定統計量の解説

単位根とは?

時系列データが単位根(Unit Root)を持つとは、そのデータが非定常過程であり、過去のショック(誤差)の影響が永続的に残る性質を持つことを意味します。代表的な単位根過程はランダムウォーク (y_t = y_{t-1} + ε_t) です。単位根を持つデータに対して通常の回帰分析を行うと、変数間に本当は関係がないのに、見かけ上は有意な関係があるように見えてしまう「見せかけの回帰」という問題が発生します。

そのため、回帰分析の前にデータが定常過程か、それとも単位根過程かを確認する必要があります。そのための統計的検定が単位根検定であり、多くの場合で利用されるのがDickey-Fuller (DF)検定およびその拡張版である拡張Dickey-Fuller (ADF)検定です。

Dickey-Fuller検定の3つのモデル

DF検定では、データがどのような非定常性を持つかに応じて、以下の3つの回帰モデルを使い分けます。

  1. モデル1: 定数項なし、トレンドなし (None)

    • Δy_t = γ * y_{t-1} + ε_t
    • 純粋なランダムウォークを想定したモデルです。
  2. モデル2: 定数項あり、トレンドなし (Drift)

    • Δy_t = μ + γ * y_{t-1} + ε_t
    • ドリフト付きランダムウォーク(一定の方向に流れていく傾向)を想定したモデルです。
  3. モデル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)

result_output <- "D:/result_output"

2.2. サンプルデータの作成と可視化

単位根過程(ランダムウォーク)と定常過程(AR(1)モデル)のデータを生成し、その違いを視覚的に確認します。

seed <- 20250703
set.seed(seed)
n_obs <- 150

# 単位根過程 (ランダムウォーク)
random_walk <- cumsum(rnorm(n_obs))

# 定常過程 (AR(1)モデル, ρ=0.7)
stationary_ar1 <- arima.sim(model = list(ar = 0.7), n = n_obs)

# データフレームに整形
df_sample <- data.frame(
  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")
Figure 1

プロットから、定常過程は平均値の周りを変動しているのに対し、単位根過程は特定の平均値に戻る傾向がなく、不規則に変動し続ける様子がわかります。

2.3. シミュレーションの実行

帰無仮説(データが単位根過程である)が真の場合、6つの検定統計量がどのような分布になるかをシミュレーションで確認します。ランダムウォークデータを多数生成し、それぞれに対してDF検定を実行して統計量を収集します。

set.seed(seed)

# シミュレーションの設定
n_sim <- 2000 # シミュレーション回数
n_obs <- 100 # 各時系列の長さ

# 結果を格納するデータフレームを初期化
results <- tibble(
  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) {
  # 帰無仮説が真となるデータ (ランダムウォーク) を生成
  y <- cumsum(rnorm(n_obs))

  # type = "none" の検定 (tau1)
  res_none <- ur.df(y, type = "none", lags = 0)
  results$tau1[i] <- res_none@teststat[1, 1]

  # type = "drift" の検定 (tau2, phi1)
  res_drift <- ur.df(y, type = "drift", lags = 0)
  results$tau2[i] <- res_drift@teststat[1, 1]
  results$phi1[i] <- res_drift@teststat[1, 2]

  # type = "trend" の検定 (tau3, phi2, phi3)
  res_trend <- ur.df(y, type = "trend", lags = 0)
  results$tau3[i] <- res_trend@teststat[1, 1]
  results$phi2[i] <- res_trend@teststat[1, 2]
  results$phi3[i] <- res_trend@teststat[1, 3]
}


# 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)
results <- readRDS("unit_root.rds")


# 臨界値を取得 (urcaパッケージのsummaryオブジェクトから)
y_dummy <- cumsum(rnorm(100)) # 臨界値取得用のダミーデータ
summary_none <- summary(ur.df(y_dummy, type = "none", lags = 0))
summary_drift <- summary(ur.df(y_dummy, type = "drift", lags = 0))
summary_trend <- summary(ur.df(y_dummy, type = "trend", lags = 0))

cvals_df <- tibble(
  statistic = factor(c("tau1", "tau2", "phi1", "tau3", "phi2", "phi3"),
    levels = c("tau1", "tau2", "tau3", "phi1", "phi2", "phi3")
  ),
  critical_value = c(
    summary_none@cval[1, "5pct"], # tau1
    summary_drift@cval["tau2", "5pct"], # tau2
    summary_drift@cval["phi1", "5pct"], # phi1
    summary_trend@cval["tau3", "5pct"], # tau3
    summary_trend@cval["phi2", "5pct"], # phi2
    summary_trend@cval["phi3", "5pct"] # phi3
  )
)

# プロット用にデータを整形
results_long <- results %>%
  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)
Figure 2

考察

  • tau (τ) 統計量 (τ₁, τ₂, τ₃):

    • これらの分布は0より左側に偏っています。
    • 検定は片側検定で行われ、検定統計量が臨界値(青い破線)よりも左側にあれば、単位根の帰無仮説は棄却されます。
    • 今回のシミュレーションでは帰無仮説が真(単位根を持つ)のデータを生成したため、ほとんどの統計量は臨界値よりも右側に分布しており、正しく「帰無仮説を棄却できない」と判断されることがわかります。5%水準の検定なので、約5%の試行では誤って棄却されます(第一種の過誤)。
  • phi (Φ) 統計量 (Φ₁, Φ₂, Φ₃):

    • これらの分布は正規分布やt分布とは明らかに異なり、右に裾の長い形状をしています。
    • 検定はF検定のように、検定統計量が臨界値よりも右側にあれば帰無仮説を棄却します。
    • こちらも、ほとんどの統計量は臨界値より左側にあり、複合仮説(例:γ=0かつβ=0)が棄却されないことがわかります。

3. まとめ

本シミュレーションを通じて、以下の点が明らかになりました。

  1. 単位根検定の統計量は特殊な分布に従う: DF検定の統計量は、標準的な分布に従わないため、専用の臨界値が必要です。
  2. モデル選択の重要性: データが従う過程(定数項やトレンドの有無)に応じて、適切な検定モデル(none, drift, trend)を選択し、対応する検定統計量(tau1, tau2, tau3など)を解釈する必要があります。

以上です。