ねこすたっと

ねこの気持ちと統計について悩む筆者の備忘録的ページ。

サンプルサイズ計算:2群の2値アウトカムを比較する(割合の差) [R]

自分用のリファレンスとして、サンプルサイズ計算に関する記事をシリーズで書いています。 なるべく体裁を統一するために、以下のように決めています。

  • 群を示す添字について:
    • c, C = 対照群
    • t, T = 介入群*1
    • e, E = 要因群
    • 添字なし = 全体
  • 使用する記号:
    • p = 反応割合
    • μ = 平均値
    • σ = 標準偏差
    • Φ = 割り付け比 Nt/Nc(デフォルトは1)
    • α = αエラー(デフォルトは0.05)
    • β = βエラー(デフォルトは0.2)
    • z = 標準正規分布の累積分布関数

想定シナリオ

疾患Dに対する治療として、従来薬Cと新規薬Tのどちらが優れているだろうか?
ランダム化比較試験で患者を1:1に割り付けて、治療の奏功割合を比較したいと考えている。
これまでの知見から、従来薬Cにおける奏効割合は30%、新規薬Tにおける奏効割合は50%と見込まれる。
両側有意水準 5%, 検出力 80%として、必要なサンプルサイズはどれくらいだろうか?

このシナリオでサンプルサイズを計算するのに必要な条件を整理してみると、以下のようになる。

  • 帰無仮説  H_0: p_T = p_C
  • 対立仮説  H_A: p_T \neq p_C
  • 有意水準:α = 0.05
  • 検出力:1-β = 0.80
  • 割り付け比:φ =  N_T / N_C = 1
  • 従来薬Cの奏効割合(想定値): \hat{p}_C = 0.3
  • 新規薬Tの奏効割合(想定値): \hat{p}_T = 0.5

方法0:手入力

 
\begin{aligned}
N &= \frac{1+\phi}{\phi}\frac{[ z_{1-\alpha/2} \sqrt{(1+\phi)\bar{p}(1-\bar{p})} + z_{1-\beta} \sqrt{\phi p_C (1-p_C) + p_T (1-p_T)} ]^2}{\phi (p_T - p_C)^2} \\
\bar{p} &= \frac{p_C + \phi p_T}{1+\phi}
\end{aligned}

上の式に、

  •  z_{1-\alpha/2} = 1.96
  •  z_{ 1 - \beta} = 0.8416
  • φ = 1
  •  p_C = 0.3
  •  p_T = 0.5

を代入すると、N = 185.9...となるので、サンプルサイズは両群で186例(1群で93例)必要なことが分かる。

方法1:pwr.2p.test( )を使って計算する

まずはpwrパッケージの関数を使ってみる。
この関数では2つの割合ではなく、効果サイズ(h)を指定しなくてはいけない。
効果サイズhは逆三角関数arcsinを使って、以下のように定める。

 h = 2 \arcsin (\sqrt{p_T}) - 2 \arcsin (\sqrt{p_S})

これはasin( )を使って実際に計算しなくてはいけないのが面倒。

pwr.2p.test( )の引数は他に、

  • sig.level:有意水準 α
  • power:検出力 1-β
  • alternative:対立仮説。"two.sided"(両側=デフォルト), "greater", "less"から選ぶ。

を指定する。両側検定ならhの符号は気にしなくていい。

library(pwr)
h = 2*asin(sqrt(0.5))-2*asin(sqrt(0.3))
pwr.2p.test(h = h, 
            sig.level = 0.05, 
            power = 0.8, 
            alternative = "two.sided")
     Difference of proportion power calculation for binomial distribution (arcsine transformation) 

              h = 0.4115168
              n = 92.69608
      sig.level = 0.05
          power = 0.8
    alternative = two.sided

NOTE: same sample sizes

1群あたり93例、両群で186例必要という結果。

方法2:TwoSampleProportion.Equality( )を使って計算する

次にTrialSizeパッケージの関数を使ってみる。
この関数では対立仮説(alternative hypothesis)は関数名に含まれているので、引数として指定する必要はない。*2

指定する引数は、以下のとおり。

  • alpha:αエラー
  • beta:βエラー
  • p1:試験群の反応割合
  • p2:対照群の反応割合
  • k:割り付け比
library(TrialSize)
TwoSampleProportion.Equality(alpha = 0.05, 
                             beta = 0.2, 
                             p1 = 0.5, 
                             p2 = 0.3,
                             k = 1)
[1] 90.26212

1群あたり91例、両群で182例必要という結果。方法1との微妙な違いは許容範囲か。

方法3:power.prop.test( )を使って計算する

このシナリオなら基本関数を使っても計算できる。
サンプルサイズ計算のときに指定する主な引数は以下のとおり。

  • p1
  • p2
  • sig.level:αエラー
  • power:1-βエラー
  • alternative:対立仮説。"one.sided"(片側)か"two.sided"(両側)を指定。

両側検定なのでp1p2はどちらでもよい。

power.prop.test(p1 = 0.5,
                p2 = 0.3,
                sig.level = 0.05,
                power = 0.8,
                alternative = "two.sided")
     Two-sample comparison of proportions power calculation 

              n = 92.99884
             p1 = 0.5
             p2 = 0.3
      sig.level = 0.05
          power = 0.8
    alternative = two.sided

NOTE: n is number in *each* group

1群あたり93例、両群で186例必要という結果。

おわりに

  • シーズン4に突入しました。シーズン4は何話続くのか私にもわかりません。
  • 夏は汗をかくからという理由で、ついついウェットタイプのエサを与えてしまう甘やかせ飼い主です。

参考資料

  • すごい!サンプルサイズ計算の本なのにあまり眠くならない!手計算はこの本を参考にしました。

*1:interventionのIを使うと1と区別しにくいのでtrial

*2:"equality"は"equivalent"(同等性)と混同しやすいので注意。この研究の仮説は「優越性(superiority)」なんだけど、このパッケージで"superiority"は非劣性試験と対応させた「十分な優越性(substantially superiority)」の意味で使われているので、これも注意。