サンプルサイズとp値
よくある質問として、例えば2群の平均値の差の検定を行う際に
ということです。
これを数学的に説明するのは難しいことですし、それを理解するのも大変です。そこでRを使って簡単なシュミレーションをしてみれば、サンプルサイズによってp値がどのように変化するのかがよく分かります。
まずは以下のような関数を定義します。これは等分散を仮定しない場合の2群の平均値の差の検定をk回行い、そのp値を返すという関数です。つまり、この関数を実行するとk個のp値が得られるというわけです。ちなみに、xの母集団は平均50、標準偏差15の正規分布で、yの母集団は平均55、標準偏差15の正規分布と仮定しています。
#引数xn,yn,kはそれぞれxnのサンプルサイズ,ynのサンプルサイズ,検定の回数です my.prog <- function(xn, yn, k){ p.vec <- c() for(i in 1:k){ x <- rnorm(xn, mean=50, sd=15) y <- rnorm(yn, mean=55, sd=15) out <- t.test(x, y, var.equal=F) p <- out$p.value p.vec[i] <- p } p.vec } #使用例 > dat <- my.prog(10, 10, 10) #xのサンプルサイズ10,yのサンプルサイズ10,検定回数10 > dat #10個のp値が表示される [1] 0.51729508 0.57782010 0.10362691 0.01806422 0.58323418 0.90149330 [7] 0.87332652 0.37346864 0.46209518 0.42263867
■ シュミレーション手順
両群のサンプルサイズの比が同じでサンプルサイズが異なる場合として、
を比較してみる。また、両群のサンプルサイズの比が異なる場合として、
を比較してみる。
なお、検定回数はいずれの場合も100回とした。
以下にその結果をグラフで示す(横軸が検定回数で縦軸がp値)。
ご覧の通り、サンプルサイズが大きくなるにつれてp値はドンドン小さくなっていきます。同じ分布から採ってきたデータであっても、サンプルサイズが違うだけでこれほど結果が異なってくるのです。つまり、サンプルサイズさえ大きくすれば、実際には大した差があるわけでもないのに有意差が認められてしまうということが在り得るのです(サンプルサイズが大きくなるほど検出力も大きくなる)。
こちらはサンプルサイズの比が異なる場合ですが、グラフを見比べてみると[xn:10 yn:50]のときも[xn:10 yn:1000]のときもそれほど違いが分かるほどではありません。だから、よくある「A群とB群とでサンプルの大きさが異なるのですが、このデータを検定してしまっても大丈夫ですか?」という問いへの答えは「検定しても問題ない」ということになります。
しかし、そうはいっても、「n群のデータを比較する場合においては各郡のサンプルサイズは等しくなるようにデータを採取する」という原則は守るべきであることはいうまでもありませんよね。
+-----+-----+-----+
グラフを描くときのヒント
exper1 <- my.prog(10,10,100) exper2 <- my.prog(50,50,100) exper3 <- my.prog(100,100,100) exper4 <- my.prog(200,200,100) exper5 <- my.prog(300,300,100) #1つのグラフデバイスに書く場合 plot(exper1, type="l" , lwd=2, ylim=c(0,2), col="red") abline(h=c(0, 0.5, 1), col="gray") x.jiku <- 1:100 points(x.jiku, exper2, type="l", lwd=2, col="green") points(x.jiku, exper3, type="l", lwd=2, col="blue") points(x.jiku, exper4, type="l", lwd=2, col="cyan") legend( -2, 2, c( "xn=10 yn=10", "xn=50 yn=50", "xn=100 yn=100", "xn=500 yn=500" ), lwd=2, col=c("red", "green", "blue", "cyan") ) #1つずつ書く場合 windows() plot(exper1, type="l" , lwd=2, ylim=c(0,3), col="red", xlab="検定回数", ylab="p値", main="xn:10 yn:10") abline(h=c(0, 0.5, 1), col="gray")