2019年5月18日土曜日

ノイズの付加による見せかけの自己相関

カウントデータの末尾に一定の値(0)の系列が追加される事で独立(だと考えられる)な系列に自己相関が検出されるという事例に遭遇した。
そこでこの事例が一般的な事なのかを確認してみる。

ポアソン過程


まずポアソン分布に従う乱数の系列を考えてみる。このときこの乱数列は自己相関を持たない。
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 件のコメント:

コメントを投稿