統計ER

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

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

Toukei Consul Banner

KH Coder Consul Banner

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

従来の薬と新薬とか、方法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

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

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

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

まとめ

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

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

エクセルでサンプルサイズ計算用の簡易的な計算方法(2020年4月14日追記)

並行群間試験、つまり平均値の差の検定用の簡易的なサンプルサイズ計算式を使って、クロスオーバー試験のサンプルサイズ計算をしてみた。これを使ってエクセルファイルも作成してみる。

結果としては、正確な方法とほとんど差がなく、実際には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例。この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

エクセルでサンプルサイズ計算(2020年4月15日追記)

よければどうぞ。

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

使い方動画解説。こちらもよければどうぞ。

youtu.be

参考文献

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