備忘ログ

チラシの裏的備忘録&メモ

タイがなければやっぱりwilcox.testとwilcox.exactのp値は一致する

indenkun.hatenablog.com

の続き(おまけ)。

Rでウィルコクソンの順位和検定を行うときに、Rに標準でインストールされるstatsのwilcox.test()を使いますが、タイがあると正確な計算ができないことからexactRankTestsのwilcox.exact()を使用したほうがいいといわれます。

ではデータにタイがなければ両者は同じ値がでるのかランダムなデータを作って、p値をみてみました。

検証用自作関数

wilcox.stats.exact2 <- function(n = 10, times = 100, paired = C(F,T)){
  p.wilcox.test <- NULL
  p.exact.wilcox.test <- NULL
  paired.wilcox <- paired
  for(i in 1:times){
    z <- sample(1:n^2, n*2, replace = F)
    x <- z[c(1:n)]
    y <- z[-c(1:n)]
    p.wilcox.test[i] <- wilcox.test(x, y, paired = paired.wilcox)$p.value
    p.exact.wilcox.test[i] <- wilcox.exact(x, y, paired = paired.wilcox)$p.value
  }
  data.frame(p.wilcox.test, p.exact.wilcox.test)
}
library(magrittr)
wilcox.stats.exact2(paired = F) %>% plot()
abline(0,1)

f:id:indenkun:20200316194744p:plain
fig.1

で微妙なズレは丸めの問題だと思うけど、基本的にはp値が一致。

p値が一致するというということはその他諸々も一致している(はず)。

ウィルコクソンの符号順位和検定だと2変量の差で、タイがあればデータを捨てて作り直す作業が必要になる(あるいはwilcox.test()の返す警告を見てその分計算回数を増やす)ので、自分の設計能力だと無限ループの可能性が出てきてしまう……