統計ER

R, EZR, SPSS, KH Coder を使ったデータ分析方法を紹介するブログ。ニッチな内容が多め

クロスオーバー試験のサンプルサイズ計算

クロスオーバー試験のサンプルサイズ計算を R で行う方法

>>もう統計で悩むのを終わりにしませんか?


↑1万人以上の医療従事者が購読中

クロスオーバー試験とは

クロスオーバー試験とは、二群どちらにも二つの介入を受けてもらう試験。

従来の薬と新薬とか、方法Aと方法Bとか、二つの方法を順番を変えて受けてもらう。

利点は、小さいサンプルサイズで、信頼性の高いデータが取れること。

ただし、一個目の影響がなくなるまでのウォッシュアウト期間をどうするか?という問題が付きまとう

クロスオーバー試験の前に並行群間比較試験のサンプルサイズ計算は?

クロスオーバー試験の前に、まず並行群間比較試験の場合。

R で計算してみる。

deltaを10/25=0.4, 検出力を80%とすると、一群100例必要と計算される。

delta(またはd=標準化された差)はどう決めればいいか?は以下参照。

toukeier.hatenablog.com

> power.t.test(delta=10/25, power=.8)

     Two-sample t test power calculation 

              n = 99.08057
          delta = 0.4
             sd = 1
      sig.level = 0.05
          power = 0.8
    alternative = two.sided

NOTE: n is number in *each* group

自作関数だと、以下のようになる。

t.test.samplesize <- function(sig.level=0.05, power=0.8, 
delta, sd=1, 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)
 n <- 2*((Za+Zb)/(delta/sd))^2

 NOTE <- "n is number in *each* group"
 METHOD <- "t-test sample size"
 structure(list(n=n,delta=delta, sd=sd, 
 sig.level=sig.level, power=power, 
 alternative=alternative, note=NOTE, method=METHOD),
 class="power.htest")
}

R の関数のように非心t分布を使っていないために、必要サンプルサイズが若干小さい。

と言っても100例が99例になっただけなので、大きなインパクトではない。

> t.test.samplesize(delta=10/25)

     t-test sample size 

              n = 98.111
          delta = 0.4
             sd = 1
      sig.level = 0.05
          power = 0.8
    alternative = two.sided

NOTE: n is number in *each* group

>>もう統計で悩むのを終わりにしませんか?


↑1万人以上の医療従事者が購読中

クロスオーバー試験のサンプルサイズ計算は?

必要な条件は以下の通り。

  • delta: effect size
  • sigma: 標準偏差
  • theta: 個人差指数(個人間分散と個人内分散の比。通常1より大きいはず。)
  • sigma.w: 個人内標準偏差
  • rep.level: 繰り返し計算を行う条件。デフォルトでは計算結果の差の割合が10-8未満になるまで繰り返す。

以下が R スクリプト

samplesize.cross <- function(sig.level=0.05, power=0.8, 
delta, sigma, theta, rep.level=10^-8, 
alternative=c("two.sided", "one.sided"))
{
 alternative <- match.arg(alternative)
 tside <- switch(alternative, one.sided=1, two.sided=2)

 p.t.t <- power.t.test(power=power, delta=delta/sigma)
 np <- p.t.t$n
 nc <- np/(2*(1+theta**2))
 nc.approx <- nc
 sigma.w <- sqrt(sigma**2/(1+theta**2))
 nc0 <- nc
 nc1 <- nc+5

 yy <- matrix(0,8,1)
 i <- 0
 diff <- abs(nc1-nc0)/nc0
 while (diff > rep.level){
  i <- i+1
  nc <- nc0
  ta <- qt(p=1-sig.level/tside, df=2*nc-2)
  tb <- qt(p=power, df=2*nc-2)
  nc <- ((ta+tb)/(delta/sigma.w))**2
  nc1 <- nc
  diff <- abs(nc1-nc0)/nc0
  yy[i,1] <- nc1
  nc.exact <- nc1
  nc0 <- nc1
 }

NOTE <- "n is number in *each* group"
METHOD <- "t-test sample size for cross-over trial design"

structure(list("n(parllel)"=np, "n(cross-over)"=nc.approx, 
"n(cross-over exact)"=nc.exact, delta=delta, 
sigma=sigma, sig.level=sig.level, power=power, 
alternative=alternative, note=NOTE, 
method=METHOD),
class="power.htest")
}

有意水準5%、検出力80%、差が10、標準偏差が25 というのは先ほどの並行群間比較試験と同じ条件。

個人差指数を1.5(つまり個人差変動が個人内変動より1.5倍大きい)と見積もると、必要サンプルサイズは一群17例と計算される。

並行群間だと一群100例だったので、約1/5に節約できる。

> samplesize.cross(delta=10, sigma=25, theta=1.5)

     t-test sample size for cross-over trial design 

         n(parllel) = 99.08057
      n(cross-over) = 15.24316
n(cross-over exact) = 16.12026
              delta = 10
              sigma = 25
          sig.level = 0.05
              power = 0.8
        alternative = two.sided

NOTE: n is number in *each* group

個人差指数を1として、個人内変動が結構大きいと想定して見積もると、必要サンプルサイズは一群26例と計算される。

100例必要だったところ、約1/4に減らせるのは効率がいい。

> samplesize.cross(delta=10, sigma=25, theta=1)

     t-test sample size for cross-over trial design 

         n(parllel) = 99.08057
      n(cross-over) = 24.77014
n(cross-over exact) = 25.53465
              delta = 10
              sigma = 25
          sig.level = 0.05
              power = 0.8
        alternative = two.sided

NOTE: n is number in *each* group

個人差指数thetaは先行研究でわかれば問題ないが、難しいかもしれない。

わからない場合は、1で計算すれば、控えめで無難だ。

クロスオーバー試験のサンプルサイズ計算をエクセルで

並行群間試験、つまり平均値の差の検定用の簡易的なサンプルサイズ計算式を活用して、クロスオーバー試験のサンプルサイズ計算スクリプトを作成した。

samplesize.cross.approx <- function(sig.level=0.05, power=0.8, 
delta, sigma, theta, alternative=c("two.sided", "one.sided"))
{
 alternative <- match.arg(alternative)
 tside <- switch(alternative, one.sided=1, two.sided=2)

 Za <- qnorm(1-sig.level/tside)
 Zb <- qnorm(power)
 np <- 2*((Za+Zb)/(delta/sigma))^2
 nc.approx <- np/(2*(1+theta**2))

 NOTE <- "n is number in *each* group"
 METHOD <- "t-test sample size for cross-over trial design"

 structure(list("n(parllel)"=np, "n(cross-over)"=nc.approx, 
 delta=delta, sigma=sigma, sig.level=sig.level, power=power, 
 alternative=alternative, note=NOTE,  method=METHOD),
 class="power.htest")
}

並行群間試験の n は簡易的な方法では98.11、その結果を用いたクロスオーバー試験の簡易的なサンプルサイズ計算は24.53で、より正確な方法による上記の24.77と1 は違わない。

丸めると25例。

クロスオーバー試験の正確なサンプルサイズ計算は25.53なので、まるめると26例で違いは1例。

> samplesize.cross.approx(delta=10, sigma=25, theta=1)

     t-test sample size for cross-over trial design 

     n(parllel) = 98.111
  n(cross-over) = 24.52775
          delta = 10
          sigma = 25
      sig.level = 0.05
          power = 0.8
    alternative = two.sided

NOTE: n is number in *each* group

結果としては、正確な方法とほとんど差がなく、実際には1例少ない程度のため、実用には問題ないと考える。

これを使ってエクセルファイルも作成してみた。

よければどうぞ。

クロスオーバー試験 平均値の差の検定 サンプルサイズ計算【エクセルでサンプルサイズ】 | TKER SHOP

使い方動画解説。

こちらもよければどうぞ。

youtu.be

まとめ

クロスオーバー試験は、ウォッシュアウトをどうするかという問題はあるものの、必要サンプルサイズが大幅に約1/4~1/5に減る。

被験者を集めにくい試験の場合は、検討する価値はある試験デザインだ。

参考文献

丹後俊郎著 無作為化比較試験 朝倉書店
p.47 並行群間比較試験
p.182 クロスオーバー試験