名前はまだない

データ分析とかの備忘録か, 趣味の話か, はたまた

基本的な逐次的仮説検定について

はじめに

逐次検定を仕事で使えないかなと思って少し調べてみましたよ。

ちなみに歴史的にみると、ドイツ軍のエニグマ暗号解読の進め方の決定にも用いられていたようです。

en.wikipedia.org

逐次的に検定を行うことの問題点

通常の統計的仮説検定では、事前に設定したデータ数が集まった時点で仮説検定を行う。

一方で逐次的な統計的仮説検定では、一部のデータが集まった時点で仮説検定を行う。

この時の検定で、帰無仮説が棄却された場合にはデータ収集を中止することになる。

帰無仮説が棄却できなかった場合には、さらにデータを収集し検定することを繰り返す。

事前に設定したデータが全て集まらない状態でも、有意差が出れば検定のプロセスを終了することができるようになる。

検定を繰り返すことになり、理論上は偽陽性(false positives)5%で済むはずのものが実際には偽陽性が増大する可能性が出てきてしまう。

そのため、多重性の調整を行う必要性が出てくる。

代表的な多重性の調整の一つとして、Bonferroni補正がある。

Bonferroni補正では、N回の仮説検定を行う際に各検定の有意水準を0.05/Nとすることで、全体の有意水準\alphaに保つことができる。

逐次的仮説検定

所定のサンプルサイズが全て確保するにはコストや時間がかかってしまう場合に、確保すべきサンプルサイズが得られていない状態においても、中間解析として検定を実施する方法。

上記にも述べたように、逐次仮説検定でも複数回検定を行うことにより帰無仮説の棄却率が高まってしまう。

Bonferroni補正のように有意水準の補正(設計)する必要がある。

逐次検定における各中間試験の有意水準の設定方法の代表的なものとして、Pocock法やO’Brien-Fleming法がある。

Pocock法

試験全体の有意水準\alphaになるように仮定し、各試験で\alpha/Nと設定する方法である。

中間解析の棄却限界値(z-value)は常に一定になる。

この方法は,初期で有意差を検出しやすいため,早期中止をしやすい方法といえる.

O’Brien-Fleming法

各時点での解析において、検定統計量の棄却点が等しくなるようにする方法。

これは、全部でK回解析を行うとし、最終解析の棄却限界をCとすると、k回目 ( 0 \le k \le K ) の検定の棄却限界を \sqrt(K/k)Cとする設定します。

このように設定することで、後の解析に消費\alphaを多めに残すことができる。

早期の中間解析での棄却限界値をかなり大きくして、最終解析の棄却限界値は通常の試験とほぼ同様にする。

この方法は、初期では有意差を検出しにくく、驚きがある結果が得られた場合のみ、解析を中段すると言う考え方である。

Lan-DeMetz法

サンプルサイズではなく、有意水準0 \le \alpha \le 1をパラメータとする関数:\alpha消費関数を導入する。

中間解析ごとに少しずつ有意水準\alphaエラー)を「消費」しながら、最終解析で「合計:0.05」の有意水準を消費し切るという考えに基づいている。

各ステージで同じサンプルサイズを仮定する必要がなくなる。

つまり、事前に決められた中間解析の回数に縛られることなく,全体の有意水準\alphaに抑えることができるようになる。

上記の古典的な Pocockの方法,O’Brien-Flemingの方法のそれぞれで、Pocock型、O’Brien-Fleming型と言われている消費関数が用意されている。

それぞれの方法を近似した消費関数を"型"と言う意味になっている。

Pocock型の消費関数は次にように定義されている。

 \displaystyle{
f(t) = min \left \{ \alpha log(1 + (e − 1)t), \alpha \right \}
}

O’Brien-Fleming型の消費関数は次にように定義されている。

 \displaystyle{
f(t) = min  \left \{  2-2 \Phi \left( \frac{z_{1 - \frac{1}{\alpha}}}{\sqrt{t}} \right) , \alpha\right \}
}

ただし、\Phi (x) は標準正規分布の累積分布関数で、f(0) = 0 とする。

計画した有意水準と実際の α エラーとのずれ

計画したサンプルサイズとのずれ

このような場合には、次にような調整された\alpha消費関数を用いる。

 \displaystyle{
\alpha_\ast ' (t) = \alpha_i + \left( \frac{\alpha-\alpha_i}{\alpha-\alpha_\ast (t_i)} \right) \{ \alpha_\ast (t) - \alpha_\ast (t_i)\}
}

ここで、t_iは現時点、\alpha_iは現時点までに消費した\alpha\alpha_\ast (t)は元のα消費関数。

適応的逐次デザイン

これまでの逐次的検定のデザインでは、中間解析の結果から観察されたデータに基づき,症例数を再設定するなどの試験デザインを変更をすることは原則できない。

この問題を解消し適応的逐次デザインが提案されている。

適応的逐次デザインでは、早期の終了と中間解析の結果に基づいて途中での試験デザインの変更することができる。

Rで逐次的仮説検定

Rで逐次検定を行う際の棄却限界点などを得るためには、gsDesignパッケージを用います。

Pocock法とOBrien-Fleming法の各試験の棄却点を得るためは次にようにする。

## Pocock
PO <- gsDesign(k=5, timing=1, sfu="Pocock", alpha=0.025, beta =0.90, test.type=1)

## OBrien-Fleming
OF <- gsDesign(k=5, timing=1, sfu="OF", alpha=0.025, beta =0.90, test.type=1)

計算された棄却限界点を確認する。

> PO$upper$bound
[1] 2.41318 2.41318 2.41318 2.41318 2.41318

> OF$upper$bound
[1] 4.561743 3.225639 2.633723 2.280871 2.040073

f:id:saltcooky:20200712224002p:plain

\alpha消費関数を用いた逐次的仮説検定の設計を行う。

sfu引数を、Pocock型の場合はsfLDPocock、OBrien-Fleming型の場合はsfLDOFと指定する。

## OBrien-Fleming
sfOF <- gsDesign(k=5, timing=1, sfu=sfLDOF, alpha=0.025, beta =0.90, test.type=1) 

## Pocock
sfPO <- gsDesign(k=5, timing=1, sfu=sfLDPocock, alpha=0.025, beta =0.90, test.type=1) 

計算された棄却限界点を確認する。

> sfOF$upper$bound
[1] 4.229195 2.888136 2.298090 1.961822 1.739704

> sfPO$upper$bound
[1] 2.437977 2.426814 2.410194 2.396649 2.386000

f:id:saltcooky:20200712224024p:plain

f:id:saltcooky:20200714011103p:plain

plot関数に結果のオブジェクトを所定の結果のグラフを作成してくれます。

plottype引数は1~8まで指定することができ、様々な結果をggplotベースで出してくれます。 1で棄却限界、5で\alpha消費関数を描画できます。

gp1 <- plot(sfOF, plottype = 1)

gp2 <- plot(sfOF, plottype = 5)

library(patchwork)

gp1 + gp2 

f:id:saltcooky:20200721232123p:plain

両側検定の場合はtest.type引数を2に指定する。

sfOF <- gsDesign(k=5, 
                 timing=1, 
                 beta =0.90, 
                 sfu=sfLDOF, 
                 alpha=0.05, 
                 test.type=2) 

結果を可視化してみる。

gp1 <- plot(sfOF, plottype = 1)

gp2 <- plot(sfOF, plottype = 5)

gp1 + gp2 

f:id:saltcooky:20200721225653p:plain

参考