そこでこの事例が一般的な事なのかを確認してみる。
ポアソン過程
まずポアソン分布に従う乱数の系列を考えてみる。このときこの乱数列は自己相関を持たない。
seq.pois <- rpois(100, 2) forecast::tsdisplay(seq.pois, main = "poisson process")
ポアソン過程 + 0 x10
上記データの末尾に 0 を 10 個追加。ちょっと変化してるっぽい。
c(seq.pois, rep(0, 10)) %>% forecast::tsdisplay(main = "poisson process")
Ljung-Box 検定でも自己相関は認められず。
c(seq.pois, rep(0, 10)) %>% Box.test(lag = 7, type = "Ljung-Box") Box-Ljung test data: . X-squared = 7.3861, df = 7, p-value = 0.3898
ポアソン過程 + 0 x30
さらに 20 個追加。一歩前進。
c(seq.pois, rep(0, 30)) %>% forecast::tsdisplay(main = "poisson process + 0x30")
検定では自己相関あり。
c(seq.pois, rep(0, 30)) %>% Box.test(lag = 7, type = "Ljung-Box") Box-Ljung test data: . X-squared = 44.469, df = 7, p-value = 1.734e-07
ポアソン過程 + 0 x50
さらに 20 個追加して 50 個。ACF プロットを見る限りガッツリ自己相関あり。
c(seq.pois, rep(0, 50)) %>% forecast::tsdisplay(main = "poisson process + 0x50")
もはや疑いようのないレベル
c(seq.pois, rep(0, 50)) %>% Box.test(lag = 7, type = "Ljung-Box") Box-Ljung test data: . X-squared = 96.077, df = 7, p-value < 2.2e-16
シミュレーション
上記のチェックでは偶然の可能性もあるので、何回も繰り返して検定で棄却される(自己相関が存在)確率を求めてみる。
# シミュレーション関数 pois_and_zeros <- function(k, lambda = 2) { purrr::map_dbl(1:1000, k = k, lambda = lambda, function(round, k, lambda) { seq.pois <- rpois(n = 100, lambda = lambda) c(seq.pois, rep(0, k)) %>% Box.test(lag = 7, type = "Ljung-Box") %>% .$p.value }) } mean(pois_and_zeros( 0) < 0.05) # 0.052 mean(pois_and_zeros(10) < 0.05) # 0.332 mean(pois_and_zeros(20) < 0.05) # 0.994 mean(pois_and_zeros(50) < 0.05) # 1 # 可視化 # 0 の付加を 0〜30 個の 1 刻みで算出 tibble( k = seq(0, 30, 1), ratio_signifficant = purrr::map_dbl(seq(0, 30, 1), ~ mean(pois_and_zeros(.) < 0.05)) ) %>% ggplot(aes(k, ratio_signifficant)) + geom_point() + geom_line() + scale_y_continuous(limits = c(0, 1), labels = scales::percent)
完全な乱数列であっても 5% ちょっとの確率で見せかけの自己相関が検出されてしまう。
また k (0 の付加個数)の増加に伴いだいたい k=20 辺りにおいてほぼ 100% の確率で自己相関が検出(Lag=7)されてしまう。
0 件のコメント:
コメントを投稿