そこでこの事例が一般的な事なのかを確認してみる。
ポアソン過程
まずポアソン分布に従う乱数の系列を考えてみる。このときこの乱数列は自己相関を持たない。
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 件のコメント:
コメントを投稿