読者です 読者をやめる 読者になる 読者になる

jnobuyukiのブログ

JavaScriptとR言語を中心に研究活動に役立つwebアプリケーション技術について考えていきます。twitter ID: @j_nobuyuki

t検定の検出力:2群のサンプルサイズが異なる場合

R言語 R

今回は、t検定の検出力について簡単なシミュレーションの結果を紹介します。検出力とは、帰無仮説を棄却することが真である状況で、正しく帰無仮説を棄却できる確率のことです。*1
今回紹介するt検定の場合、二群が同じ母集団を持つことを帰無仮説とします。異なる母集団を持つのであれば、これを高確率で検出したいわけです。

t検定の検出力

一般に、二群の平均値の差や分散を固定すると、二群のサンプルサイズを大きくするほど検出力が高まります。R言語では、power.t.testという便利な関数があって、検出力を計算できます。例えば、二群の差が1で、分散がそれぞれ1.5の場合の検出力を求めるには以下のように書きます。

#サンプルサイズ N=10の場合
power.t.test(10, delta = 1, sd = 1.5, type = "two.sample")

#サンプルサイズ N=50で対応のあるt検定の場合
power.t.test(50, delta = 1, sd = 1.5, type = "paired")

例えば上記のN=10の場合は以下のような結果が得られました。
Two-sample t test power calculation

n = 10
delta = 1
sd = 1.5
sig.level = 0.05
power = 0.2917418
alternative = two.sided

NOTE: n is number in *each* group
powerの値が検出力です。0.29ということは、正しく帰無仮説を棄却できる確率が29%という意味です。対応のないt検定で、サンプルサイズを変えていくと以下のようになります。

f:id:jnobuyuki:20150127014918j:plain

赤線が一般的な高い検出力の基準となるレベル(0.8)です。つまり、この条件を比較する時に高い検出力を得るには、40以上のサンプルサイズが求められます。

サンプルサイズが2群で異なる場合

上記の関数は、Nの大きさについて使用が限られています。つまりどちらも同じサンプルサイズのときのみ計算できます。
サンプルサイズに偏りがあるとどうなるのか?可能性がいくつか考えられます。

1. サンプルサイズの大きい群のサンプルサイズで決まる。
2. サンプルサイズの小さい群のサンプルサイズで決まる。
3. 二群のサンプルサイズの合計で決まる。
4. 上記1から3以外

これを検証するため、実際に簡単なシミュレーションのコードを書いてみました。

シミュレーションの設定
  • 検定の種類:対応のないt検定
  • サンプルの分布: 平均値が0もしくは1、標準偏差が1.5のガウス分布を仮定
  • サンプルサイズ:各群10から100まで10刻みに設定。二群の組み合わせで合計100通り
  • 計算回数: 二群のサンプルサイズの組み合わせごとに1000回
  • 指標:t検定の結果の有意確率を見て、5%以下なら帰無仮説を棄却と判定。
Rのコード
#サンプルサイズ
sizeSample1 <- seq(10,100, by = 10)
sizeSample2 <- seq(10, 100, by = 10)

#二群の平均と標準偏差
meanSample1 = 0
meanSample2 = 1
sdSample1 = 1.5
sdSample2 = 1.5

#計算回数
numberSimulation <- 1000

#結果表示用マトリックス
resultMatrix <- matrix(rep(0,100),nrow = 10, ncol = 10)

#ここから計算
for (i in 1:10){
  curSizeSample1 <- sizeSample1[i]
  
  for (j in 1:10){
    curSizeSample2 <- sizeSample2[j]
    
  #カウンターをリセット
    counter = 0
    
    #サンプル1の生成(計算回数分だけ列を増やす)
    Sample1 = rep(0, curSizeSample1 * numberSimulation)
    for (l in 1:length(Sample1)){
      Sample1[l] = rnorm(1,meanSample1,sdSample1)
    }
    matrixSample1 = matrix(Sample1, nrow = curSizeSample1, ncol = numberSimulation)
    
  #サンプル2の生成(計算回数分だけ列を増やす)
    Sample2 = rep(0, curSizeSample2 * numberSimulation)
    for (m in 1:length(Sample2)){
      Sample2[m] = rnorm(1, meanSample2, sdSample2)
    }
    matrixSample2 = matrix(Sample2, nrow = curSizeSample2, ncol = numberSimulation)
    
  #対応のないt検定
    for (k in 1:numberSimulation){
      res = t.test(matrixSample1[,k], matrixSample2[,k], var.equal = TRUE, paired = FALSE)
      
   #p値が5%以下ならカウンターの値を1増やす
   if (res$p.value <= 0.05){
        counter = counter + 1
      }
    }
    #カウンターの値を記録
    resultMatrix[i,j] = counter
    
    
    
  }
}
結果は以下のグラフのようになりました。

f:id:jnobuyuki:20150127020041j:plain

おおよそpower.t.testで計算した結果と同じで、サンプルサイズを大きくすると検出力があがります。しかし、一つの群のサンプルサイズが小さい場合、もう一方の群のサイズを大きくしてもそれほど検出力に変化が見られないことがわかります。
では先ほどの可能性を検証してみましょう。

1. サンプルサイズの大きい群のサンプルサイズで決まる?
一つの群のサンプルサイズを80に固定してみると、もう一方の群のサンプルサイズによって、検出力が変動します。
N=10では0.54、N=20では0.78、N=40では0.93でした。

2. サンプルサイズの小さい群のサンプルサイズで決まる。
一つの群のサンプルサイズを20に固定してみると、もう一方の群のサンプルサイズによって、検出力が変動します。
N=10では0.39、N=20では0.52、N=40では0.69でした。

3. 二群のサンプルサイズの合計で決まる。
試みに二群のサンプルサイズの合計が60の場合を見てみると組み合わせによって、検出力が変動しています。
N=10と50では0.46、N=20,40では0.69、N=30,30では、0.72でした。他の場合を見ても、二群のサンプルサイズが等しいときに検出力がもっとも高い傾向が一貫して見られました。

というわけで、1~3のどれも当てはまらないという結果になりました。

まとめ:二群のサンプルサイズはなるべくそろえよう。

今回のシミュレーションの結果、サンプルサイズが大きいほうが検出力が高いことだけでなく、サンプルサイズは二群でそろえたほうが検出力が高いことが示されました。サンプルサイズに偏りがあると検出力が低下していることを覚えておきたいと思います。

*1:また、帰無仮説を棄却することが偽である状況で、誤って帰無仮説を棄却す確率を危険率と呼びます。