ウェルチ多重検定と2群の分散分析 t検定,Rのpairwise.t.test

井口豊(生物科学研究所,長野県岡谷市)
最終更新:2017年10月1日

フリーの統計解析ソフト R には,パラメトリック多重検定を行なうのに便利な関数として pairwise.t.test がある。 pairwise という名称の通り,2群ずつ対にして多重検定を行なうのだが, pairwise.t.test が,等分散を仮定した t 検定なのか,ウェルチ(Welch)検定なのか,意外と知られていないし,ウェブ解説もほとんどない。

それを知るには,実際に調べてみれば良い。ここでは,単純なモデルとして 2 群の分散分析(ANOVA)を考え,ボンフェローニ(Bonferroni)法で検定してみる。

ここで注意したいのは,分散分析は 2 群以上の平均値の差の検定であり,2 群の分散分析は t 検定そのもの,ということである。この背景には,自由度 n の t 分布に従う統計量 t の2乗は,自由度(1, n)のF分布に従う,という統計学上の定理がある。論文などで,F(1,n)と書かれている場合は,t 検定をやっているのと同じなのである。

もちろん 2 群だけを用いた対比較(paired comparison)に, pairwise.t.test 関数を使うことも可能であり,これまた 3 群以上の場合だと誤解しないでほしい。

次のような2群 x1,x2 を考える。

x1<- c(2, 2, 3)
x2<- c(4, 8, 11)

この場合,2 標本検定(two-sample test)なのでサンプル数(number of samples)は 2 である。一方で,標本の大きさ,つまり,サンプルサイズ(sample size)は共に 3 である。このサンプル数とサンプルサイズについても,混同する人が非常に多い。これに関しては,私の研究室ブログを参照してほしい。

それでは,実際に検定を進めてみよう。まず, pairwise.t.test を使い,ボンフェローニ法で計算する。特に, p 値に注目する。

dat<- c(x1, x2)
grp<- rep(c(1, 2), c(3, 3))
pairwise.t.test(dat, grp, p.adj = "bonf")$p.value

結果,
t tests with pooled SD
p = 0.06033057

次に,このデータで, t 検定を行なう。

t.test(x1, x2)$p.value

結果は,
Welch Two Sample t-test
p = 0.1155964

これは,不等分散のオプションを指定して,次のようにしても同じである。

t.test(x1, x2, var.equal=F)$p.value

つまり, R では,デフォルトの t 検定は, Welch 検定なのである。これは, t 検定の種類を決める際に,等分散検定の結果で判断することは,理論的にも,結果的にも望ましくないからである。それに関しては,以下のページ参照。

一方で,等分散を仮定した t 検定を行なうと

t.test(x1, x2, var.equal=T)$p.value

結果は,
p = 0.06033057
である。

前述のとおり,この t 検定の結果は,2群の分散分析としても得られる。その場合は, oneway.test 関数を使うと良い。

# 等分散仮定の分散分析
oneway.test(dat~grp, var=T)$p.value

# Welchの分散分析
oneway.test(dat~grp, var=F)$p.value

p 値は,それぞれ, t 検定の場合と一致する。

これらの t 検定の p 値を, pairwise.t.test の p 値と見比べてみると分かるが, pairwise.t.test は,デフォルトで等分散 t 検定を行なっているのである。それが出力結果の説明にもあった pooled sd (プールされた標準偏差)の意味でもある。

もし, pairwise.t.test 多重検定で, Welch 検定を利用したければ,標準偏差をプールしなければ良いので,オプション pool.sd を F とすれば良い。

pairwise.t.test(dat, grp, p.adj = "bonf", pool.sd=F)$p.value

結果は
p = 0.1155964
前述の t.test 関数による Welch 検定の結果と同じになる。

なお, pairwise.t.test のヘルプを読むと,オプション pool.sd を True とするのは,小さな標本(サイズが小さい標本)が存在する場合に役立つと書かれている。