統計ER

統計ソフトRの使い方を中心に、統計解析方法の解説をするブログ。ありそうでなかなか見つからないサンプルサイズ計算などニッチな方法について紹介しています。

割合の差の検定のサンプルサイズ計算

ブログランキングに参加しています。
まずはぽちぽちっとお願いします。
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
にほんブログ村 科学ブログ 数学へ

二群の割合を比較したいときは割合の差の検定を使う。割合の差の検定を使う場合のサンプルサイズ計算はどのようにすればいいか?

統計ソフトRでやってみるとどうなるか?

エクセルではできないか?

割合の差の検定のサンプルサイズ計算

統計ソフトRには、power.prop.test()という関数が用意されていて、簡単に計算できる。

第1群が50%(0.5)、第2群が75%(0.75)と想定された場合、有意水準αを5%(0.05)、検出力を80%(0.8)、とすると、必要なサンプルサイズは、一群58例と計算される。

> power.prop.test(p1=0.5, p2=0.75, power=0.8)

     Two-sample comparison of proportions power calculation 

              n = 57.67344
             p1 = 0.5
             p2 = 0.75
      sig.level = 0.05
          power = 0.8
    alternative = two.sided

NOTE: n is number in *each* group

検出力を90%(0.9)に上げると必要なサンプルサイズは大きくなり、一群77例となる。

> power.prop.test(p1=0.5, p2=0.75, power=0.9)

     Two-sample comparison of proportions power calculation 

              n = 76.70693
             p1 = 0.5
             p2 = 0.75
      sig.level = 0.05
          power = 0.9
    alternative = two.sided

NOTE: n is number in *each* group

割合の差の検定サンプルサイズ計算を power.prop.test() を使わずに

割合の差の検定のためのサンプルサイズ計算を power.prop.test() を使わずに行ってみる。

power.prop.test() のプログラムの一部を抜き出して、独自の関数 prop.test.sample.size() を作る。

prop.test.sample.size <- function (p1, p2, 
sig.level=0.05, power=0.8,
alternative=c("two.sided","one.sided"))
{
 alternative <- match.arg(alternative)
 tside <- switch(alternative, one.sided=1, two.sided=2)
 
 Za <- qnorm(sig.level/tside, lower.tail=FALSE)
 Zb <- qnorm(power)

 d <- abs(p1-p2)
 q1 <- 1-p1
 q2 <- 1-p2
 pbar <- (p1+p2)/2
 qbar <- 1-pbar
 v1 <- p1*q1
 v2 <- p2*q2
 vbar <- pbar*qbar
 
 n <- ((Za*sqrt(2*vbar)+Zb*sqrt(v1+v2))/d)^2

 NOTE <- "n is number in *each* group"
 METHOD <- "Two-sample comparison of proportions sample size"

 structure(list(n=n, p1=p1, p2=p2, 
 sig.level=sig.level, power=power, 
 alternative=alternative, note=NOTE,
 method=METHOD), class="power.htest")
}

第1群0.5、第2群0.75、有意水準0.05、検出力0.8での必要例数は、さきほどと同じく一群58例と計算される。

> prop.test.sample.size(p1=0.5, p2=0.75)

     Two-sample comparison of proportions sample size 

              n = 57.67344
             p1 = 0.5
             p2 = 0.75
      sig.level = 0.05
          power = 0.8
    alternative = two.sided

NOTE: n is number in *each* group

検出力を0.9に上げると、77例に必要例数が上昇するのも同じだ。適切に抜き出せている。

> prop.test.sample.size(p1=0.5, p2=0.75, power=0.9)

     Two-sample comparison of proportions sample size 

              n = 76.70693
             p1 = 0.5
             p2 = 0.75
      sig.level = 0.05
          power = 0.9
    alternative = two.sided

NOTE: n is number in *each* group

割合の差の検定(1:kの割り付け比の場合)

割合の差の検定は、同数の二群ではなく、割り付け比例えば 1:2 とか、1:3 とかで例数に差をつけたい場合がある。上記関数を少し改造して、そのような場合の関数を作った。

prop.test.sample.size.unequal <- function (p1, p2, 
sig.level=0.05, power=0.8,
alternative=c("two.sided","one.sided"),
ctrl.ratio=1)
{
 alternative <- match.arg(alternative)
 tside <- switch(alternative, one.sided=1, two.sided=2)
 
 Za <- qnorm(sig.level/tside, lower.tail=FALSE)
 Zb <- qnorm(power)
 k <- ctrl.ratio

 d <- abs(p1-p2)
 q1 <- 1-p1
 q2 <- 1-p2
 pbar <- (p1+p2)/2
 qbar <- 1-pbar
 v1 <- p1*q1
 v2 <- p2*q2
 vbar <- pbar*qbar
 
 n <- ((Za*sqrt(2*vbar)+Zb*sqrt(v1+v2))/d)^2

 nA <- 1/k*((Za*sqrt((k+1)*vbar)+Zb*sqrt(k*v1+v2))/d)^2

 nB <- k*nA
 
 NOTE <- "n is number in *each* group"
 METHOD <- "Two-sample comparison of proportions sample size"

 structure(list(n.equal=n, n.unequal.1=nA,
 n.unequal.2=nB, control.ratio=ctrl.ratio, 
 p1=p1, p2=p2, 
 sig.level=sig.level, power=power, 

 alternative=alternative, note=NOTE,
 method=METHOD), class="power.htest")
}

参考文書:比率の差の検定の例数設計

http://www012.upp.so-net.ne.jp/doi/sas/simulation/sample_size2/sample_size_prop.pdf

割り付け比 ctrl.ratio を1にすると(デフォルトなので指定不要)、改造前の結果と同一になる。

> prop.test.sample.size.unequal(p1=0.5, p2=0.75)

     Two-sample comparison of proportions sample size 

        n.equal = 57.67344
    n.unequal.1 = 57.67344
    n.unequal.2 = 57.67344
  control.ratio = 1
             p1 = 0.5
             p2 = 0.75
      sig.level = 0.05
          power = 0.8
    alternative = two.sided

NOTE: n is number in *each* group

割り付け比を2にすると、群2と群1の比が2になる。群1の例数は少なくて済むようになるが、合計必要例数は116例から132例に増加する。

> prop.test.sample.size.unequal(p1=0.5, p2=0.75, ctrl.ratio=2)

     Two-sample comparison of proportions sample size 

        n.equal = 57.67344
    n.unequal.1 = 43.85406
    n.unequal.2 = 87.70811
  control.ratio = 2
             p1 = 0.5
             p2 = 0.75
      sig.level = 0.05
          power = 0.8
    alternative = two.sided

NOTE: n is number in *each* group

割り付け比を3にすると、合計必要例数はさらに大きくなり158例になる。

> prop.test.sample.size.unequal(p1=0.5, p2=0.75, ctrl.ratio=3)

     Two-sample comparison of proportions sample size 

        n.equal = 57.67344
    n.unequal.1 = 39.2444
    n.unequal.2 = 117.7332
  control.ratio = 3
             p1 = 0.5
             p2 = 0.75
      sig.level = 0.05
          power = 0.8
    alternative = two.sided

NOTE: n is number in *each* group

エクセルでサンプルサイズ計算

エクセルシートでサンプルサイズ計算ができるように、エクセルファイルを作成した。よければどうぞ。

https://happyhappygk.base.ec/items/28527806

まとめ

割合の差の検定を行うためのサンプルサイズ計算を統計ソフトRでやってみた。

割り付け比を考慮したサンプルサイズ計算もできるようにした。1:1 以外は、検出力が下がるため、必要な全体例数が大きくなる。割り付けは、可能な限り1:1が望ましい。

また、エクセルファイルでも実施できるようにした。