🐊
【R】群逐次デザインの理論と実装
臨床試験デザインに関する学習記事です。群逐次デザイン(Group Sequential Desig、GSD)の枠組みを数式と実装から理解することが目標です。
1. 理論
1-1. 概要
群逐次デザインは、臨床試験の途中で複数回の中間解析を計画的に行い、早期終了(有効性、無益性、安全性)やサンプルサイズ再設定を可能にするデザインです。中間解析を複数回行うと、第一種の誤り(
1-2. \alpha 消費関数
-
: 試験で得られる全情報量のうち、観測されている情報量の割合t_k -
:I_k 回目の中間解析時点の情報量(例:症例数、イベント数)k -
: 最終解析時点の情報量I_{\text{max}}
-
: 情報割合\alpha(t) までに累積して消費したt エラーの合計\alpha -
:\alpha(t_k) 回目の中間解析までに累積で消費したk エラーの量\alpha -
: 前回の中間解析までに消費した\alpha(t_{k-1}) エラーの量\alpha -
:\Delta\alpha_k 回目の中間解析で新たに消費するk エラーの量\alpha
1-3. 代表的な\alpha 消費関数
1-3-1. O'Brien-Fleming型
-
: 標準正規分布の累積分布関数\Phi(\cdot) -
: 標準正規分布の上側z_{1-\alpha/2} 点\alpha/2
1-3-2. Pocock型
1-4. 停止境界
-
:b_k 回目の中間解析で、検定統計量k がこの値を超えたら試験を早期終了するという閾値Z_k -
: 標準正規分布の上側z_{1-\alpha/2} 点\alpha_k
2. R実装
2-1. \alpha 消費関数を定義
obrien_fleming_alpha <- function(t, alpha = 0.05) {
z <- qnorm(1 - alpha / 2)
2 * (1 - pnorm(z / sqrt(t)))
}
pocock_alpha <- function(t, alpha = 0.05){
alpha * log(1 + (exp(1) - 1) * t)
}
2-2. \alpha 消費関数のデータフレーム作成
info_frac <- seq(0.1, 1, by = 0.01)
df_alpha <- bind_rows(
tibble(
info_frac = info_frac,
alpha_spent = obrien_fleming_alpha(info_frac),
method = "O'Brien_Fleming"
),
tibble(info_frac = info_frac,
alpha_spent = pocock_alpha(info_frac),
method = "Pocock"
)
)
2-3. \alpha 消費関数の可視化
ggplot(df_alpha, aes(x = info_frac, y = alpha_spent, color = method)) +
geom_line() +
labs(title = " alpha spending function",
x = "information rate",
y = "cumulative alpha spent",
color = "method") +
theme_minimal()

- O'Brien-Fleming法は、初期の情報割合でほとんど
を消費せず、最終解析に近づくほど\alpha 消費が増える。\alpha - Pocock法は、各解析で均等に
を消費する。\alpha
2-4. 停止境界の計算と可視化
info_points <- c(1/3, 2/3, 1)
alpha_obf_points <- obrien_fleming_alpha(info_points)
alpha_pocock_points <- pocock_alpha(info_points)
z_obf <- qnorm (1 - alpha_obf_points)
z_pocock <- qnorm(1 - alpha_pocock_points)
df_boundary <- tibble(
interim = rep(1:3, 2),
info_flaction = rep(info_points, 2),
z_bound = c(z_obf, z_pocock),
method = rep(c("O'Brien-Fleming", "Pocock"), each = 3)
)
ggplot(df_boundary, aes(x = info_flaction, y = z_bound, color= method)) +
geom_point() +
geom_line() +
scale_x_continuous(breaks = info_points) +
labs(title = "stopping boundary",
x = "information rate",
y = "stopping boundary",
color = "method") +
theme_minimal()

-
消費量は「その中間解析で、帰無仮説が本当なのに有意差が出てしまう(偽陽性)確率」のこと。\alpha -
値が高いほど、標準正規分布の上側確率(Z 消費量)は小さくなり、判定が厳しくなる。\alpha - O'Brien-Fleming法は「初期解析で厳しい判定」、Pocock法は「どの回も同じ判定基準」。
2-5. 感度分析:\alpha を変えて\alpha 消費関数を可視化
alpha_levels <- c(0.01, 0.05, 0.1)
df_alpha_sensitivity <- map_dfr(alpha_levels, function(a){
tibble(
info_frac = info_frac,
alpha_spent = obrien_fleming_alpha(info_frac, alpha = a),
alpha_level = paste("alpha =", a)
)
})
ggplot(df_alpha_sensitivity, aes(x = info_frac, y = alpha_spent, color = alpha_level)) +
geom_line() +
labs(title = "O'Brien-Fleming(alpha sentivive analysis)",
x = "information rate",
y = "cumulative alpha spent",
color = "alpha levels") +
theme_minimal()

3. 終わりに
間違いなどありましたら遠慮なくご指摘いただけますと幸いです。
Discussion