t検定の際の等分散かどうかの扱いについて

アイキャッチ。t検定とウェルチ検定どっちを使う?というイラスト。 R

Rというか、統計の個人的な備忘録です。

t検定を行う際の多重検定問題について

けっこういろんなところで見る話題ですが、統計の教科書に書かれている対応の無いt検定を行う際の等分散かどうかの確認が不要ではないか説に関して検証してみました、という記事です。

まず、統計の教科書なんかには対応のないt検定を行う場合、まずf検定というものを行って分散が等しいかどうかを確認し、分散が等しい場合には等分散を仮定したt検定分散が等しくない場合はウェルチの検定を行うべきであると書かれています。

しかし、実はこのf検定で等分散か否かを確認するのは不要で、最初からウェルチの検定を使った方が良いのだそうです。

実際、この2つの検定でどの程度結果に違いが出るのかよくわからなかったので、Rで実験してみました。

実験①2つの検定におけるp値の違い

とりあえず、aとbという2つの標本を用意します。

Rだとrnorm関数を使って正規分布する乱数を用意できるので、これを使います。

aの方は平均値を10で固定しておき、bの方は平均が10からスタートして0.01ずつ増加していくように設定してみました。

(各平均値ごとに50回検定してp値の平均を出しています。)

こうすると、2つの標本でt検定を行った際に少しずつp値が小さい値になっていくはずです。

ちなみに、分散はa,b共に5で固定です。

結果はこんな感じ。

まあ、予想通りというか、どちらの検定もほぼ同等の結果です。分散が等しいからと言って、ウェルチのt検定が不正確になることはなさそうです。

恥ずかしいですが、一応、以下にコードを書いておきます。

mu.seq <- seq(10,12,0.01)

result1 <- numeric()
m50.1 <- numeric()
#等分散を仮定しないt検定(ウェルチの検定)
for(x in 1:length(mu.seq)){
  for(i in 1:50){
    a <- rnorm(200,10,5)
    b <- rnorm(200,mu.seq[x],5)
    result1[i] <- t.test(a,b)$p.value
  }
  m50.1[x] <- mean(result1)
}


result2 <- numeric()
m50.2 <- numeric()
#等分散を仮定するt検定
for(x in 1:length(mu.seq)){
  for(i in 1:50){
    a <- rnorm(200,10,5)
    b <- rnorm(200,mu.seq[x],5)
    result2[i] <- t.test(a,b,var.equal=T)$p.value
  }
  m50.2[x] <- mean(result2)
}


#作図
plot(mu.seq,m50.1,ylim=c(0,1),axes=F,ylab="",xlab="")
par(new=T)
plot(mu.seq,m50.2,ylim=c(0,1),col="tomato",pch=18,ylab="t検定を50回行ったときのp値の平均",xlab="平均値10の標本aに対する、標本bの平均値")
legend("topright",legend=c("ウェルチのt検定","等分散を仮定するt検定"),col=c("black","tomato"),pch=c(1,18))

ちょっとずつ平均をずらしながら、20000回くらい検定をかけさせるのでやや重いです。実行する際にはご注意を。

実験②2標本の分散を少しずつずらしていったら…

それでは次に、平均を固定して分散をずらしていってみます。

aは平均値を10、分散を1として固定。bは平均値を11に固定し、分散を1から0.2ずつずらしていきます。

結果はこんな感じ。

なんとこちらも同じ。

この結果をみると、正直「どっちでもいいんじゃないの?」と思ってしまいます。

こちらもコードを置いておきます。重いのでご注意を。

var.seq <- seq(1,40,0.2)

result3 <- numeric()
v50.1 <- numeric()
#等分散を仮定しないt検定(ウェルチの検定)
for(x in 1:length(var.seq)){
  for(i in 1:50){
    a <- rnorm(200,10,1)
    b <- rnorm(200,11,var.seq[x])
    result3[i] <- t.test(a,b)$p.value
  }
  v50.1[x] <- mean(result3)
}


result4 <- numeric()
v50.2 <- numeric()
#等分散を仮定するt検定
for(x in 1:length(var.seq)){
  for(i in 1:50){
    a <- rnorm(200,10,1)
    b <- rnorm(200,11,var.seq[x])
    result4[i] <- t.test(a,b,var.equal=T)$p.value
  }
  v50.2[x] <- mean(result4)
}


#作図
plot(var.seq,v50.1,ylim=c(0,1),axes=F,ylab="",xlab="")
par(new=T)
plot(var.seq,v50.2,ylim=c(0,1),col="tomato",pch=18,ylab="t検定を50回行ったときのp値の平均",xlab="平均値10標準偏差1の標本aに対する、平均値11の標本bにおける標準偏差")
legend("topright",legend=c("ウェルチのt検定","等分散を仮定するt検定"),col=c("black","tomato"),pch=c(1,18))

実験③

こうしてみると、どちらも同等なp値をはきだすので、使い分ける必要すらなさそうな印象です。

ところが、実験②の条件を少し変えると2つの検定の挙動の違いが見えてきます。

今までは2つの標本a、bのサンプルサイズはいずれも200でしたが、今度はaのサンプルサイズを変更してみます。

少し小さくて見にくいかもしれませんが、2つの標本のサンプルサイズの差が大きくなると等分散を仮定するt検定の方はp値が大きく変動します。

一方で、ウェルチの検定はあまり関係ないように見えます。

もちろん、2つの標本のサンプルサイズが両方大きくなっていった場合にはウェルチの検定のp値も小さくなっていきます。

それにしても、for文を使うと重たいですねぇ。

まとめ

というわけで、結論としては

  • 2つの標本のサンプルサイズが同等の場合は、2つの検定でどちらを使っても(p値に関しては)あまり変わらない。
  • サンプルサイズの差が大きくなると、等分散を仮定するt検定ではp値が暴れる。
  • サンプルサイズを大きくすると、いずれの検定もp値が小さくなりやすい。

といったところです。

これだけだと、どちらが検定として正確なのかはよく分かりませんが、分散が等しいかどうかで検定を選択するのは何か違う気がしてくるのは確かです。

ただ、私は統計の専門家でも何でもないので、上記の内容がまるごと間違っている可能性もあります。

マジで個人的なメモに過ぎないので、その点はご容赦ください。

コメント

タイトルとURLをコピーしました