無増悪生存期間を主要評価項目に置いた試験でも、解析データセットは一つに決まりません。進行日を予定検査日と実際の増悪日のどちらから取るか、後続治療を始めた患者を打ち切るか追跡し続けるか、評価を欠測した区間の進行をイベントに数えるかによって、結果が変わるためです。こうした決め事が統計解析計画書にない場合、解析データセットを組むプログラムが事実上の規則になります。この記事のランダムに生成したデータセットでは、患者、観測、設定した治療効果が同じでも、規則を替えただけでハザード比が0.794から1.173まで動きました。
規則を替えるだけで効果の向きが変わります
2群各160例、合計320例のランダムに生成したデータセットを使います。治療群の進行ハザードは対照群の0.70倍、死亡ハザードは0.85倍とし、予定評価は56日ごと、追跡の上限は728日としました。ただし、0.70は進行だけに設定した値です。同じ仕組みで進行日と死亡日を連続時間のまま20万例分生成し、728日で管理打ち切りしたCoxモデルのハザード比は0.761であり、規則ごとの推定値はこの値と比べます。
後続治療を始めた患者をその直前の評価日で打ち切る規則に替えると、ハザード比は1.173(95%信頼区間0.846〜1.627)で、追跡を続ける規則の0.794(0.619〜1.017)から0.380だけ1の側へ動き、点推定の向きが反転します。そこで、起点、イベントに数える事象、打ち切り日の取り方、規則を替えた解析の報告方法を順に扱います。
OS、PFS、DFSは起点もイベントも異なります
全生存期間、無増悪生存期間、無病生存期間の違いは、数えるイベントの種類だけにあると考えたくなります。ただし、実際に異なるのは、イベントに数える事象、起点、対象となる患者の疾患状態、打ち切り規則の組です。無作為化比較試験の全生存期間なら、無作為化日を起点に死亡だけをイベントとし、進行後の患者も残したまま、生存が確認された最終日で打ち切ります。
一方、無病生存期間は無作為化日または根治手術日を起点に取り、二次がんや対側の再発をイベントに含めるかどうかで、同じ試験データから異なる数字が出ます。起点は試験計画と実施計画書で決まるため、単群試験や観察研究では登録日や治療開始日が起点になります。米国FDAのがん領域エンドポイント指針(FDA 2018)も、起点とイベントを試験ごとに規定したうえで解析することを前提に書かれています。
無増悪生存期間でも、無作為化比較試験なら起点は無作為化日、対象は進行が確認されていない患者で、進行と死亡のうち早い方がイベントになります。ただし、進行は画像評価が行われた日にしか観測できず、ここに全生存期間にはない自由度が入ります。Gourgou-Bourgadeら(2015)が報告したDATECANは、乳がん試験の時間依存エンドポイントについて、どの事象をイベントに数え、どの事象で打ち切るかを定めています。
打ち切りの基本は生存時間解析入門で扱いました。ここでは、管理打ち切りと後続治療の開始による打ち切りの違いに絞ります。
起点、イベント、打ち切り日を表に固定します
真の進行日を$T_P$、そのうち実際に評価で観測できた進行日を$\tilde{T}_P$、死亡日を$T_D$、打ち切り日を$C$と置きます。観測されるのは、次の組です。
$$T = \min(\tilde{T}_P, T_D, C), \qquad \delta = \mathbb{I}\{\min(\tilde{T}_P, T_D) \le C\}\tag{1}$$
$T$は観測時間、$\delta$はイベント指示変数で、記録された進行または死亡が打ち切りより先に起きた時に1、そうでない時に0になります。$\mathbb{I}\{\cdot\}$は、中の条件が成り立つ時に1を返す関数です。式(1)で押さえておきたいのは、解析に入るのが真の進行日$T_P$ではなく、評価で記録された$\tilde{T}_P$だという点です。
そこで、事象ごとの扱いは解析計画書の表で固定します。このデータでは、次の規則を使いました。
| 事象 | 扱い | 日付 |
|---|---|---|
| 死亡 | イベント | 死亡日 |
| 画像で確認した進行 | イベント | 進行を確認した評価日 |
| 後続治療の開始 | 打ち切りに使わず、開始後も追跡を続けます | 後続治療の開始日は解析データに入れず、その後の進行または死亡の日付を採ります |
| 進行確認の直前に連続2回以上の評価欠測 | イベント(進行として採ります) | 進行を確認した評価日 |
| 同日に進行と死亡 | イベント(死亡を優先します) | 死亡日 |
| 追跡期間の満了 | 打ち切り | 728日 |
表の各行が一意に定まれば、誰が解析しても同じデータセットが組み上がります。主解析の規則Aに対し、規則Bは後続治療の行だけ、規則Cは連続欠測の行だけを打ち切りに替えました。規則Bは治療効果の定義が変わるので補足解析、規則Cは定義を保ったまま欠測の仮定だけを替えるので感度分析にあたります。
進行日は増悪日ではなく検査日になります
予定評価が56日ごとだと、真の進行が第100日に起きても、記録に残るのは第112日です。式で書くと、記録される進行日は次のようになります。
$$\tilde{T}_P = \min\{v_k : v_k \ge T_P,\ R_k = 1\}\tag{2}$$
$v_k$は第$k$回の予定評価日、$R_k$はその評価が実際に行われた時に1、欠測した時に0となる変数です。つまり、記録される進行日は、真の進行以降で実際に行われた最初の評価日まで後ろへ動きます。評価を1回飛ばした患者では、この後ろへのズレが56日から112日に広がります。
この遅れが群間比較で打ち消し合うとは限りません。予定評価日が両群で同じでも、実際に評価が行われた割合、予定外の受診、真の進行時点が評価間隔のどこに落ちるかまで群間で同程度でなければ、ズレの分布は揃わないためです。このデータでも対照群の欠測を多めに設定しているので、ズレの分布は群間で同じになっていません。
また、Panageasら(2007)は、評価間隔そのものが推定される無増悪生存期間を動かし、試験同士で日程が異なれば比較が成り立たなくなることを報告しています。そのため、他試験の中央値と並べる場合は、評価間隔の確認が欠かせません。
この遅れを打ち切りではなく区間として扱う方法は区間打ち切りで扱いました。評価日をそのままイベント日として使っている限り、推定された無増悪生存期間は真の値より長めに出ます。
後続治療での打ち切りは群ごとに偏ります
後続治療の開始日で打ち切る規則は、次治療後の進行まで割付治療の効果として数えたくない、という点で筋が通っています。ただし、後続治療の開始は評価項目の解釈を変える中間事象であり、ICH E9(R1)はその扱いを治療効果の定義の一部として計画時に決めるよう求めています。追跡を続ける規則では後続治療の使われ方まで含めた治療方針同士を比較しますが、直前で打ち切る規則が意図するのは、後続治療が入らなかった条件での治療効果です。もっとも、打ち切るだけでその効果を推定できるわけではなく、識別仮定とそれに合わせた解析法が要ります。したがって、知りたい治療効果が先に定まり、それに応じて規則が決まります。

このデータでは、進行や死亡より先に後続治療が始まった患者が、対照群で73例、治療群で33例でした。また、後続治療は高リスク例ほど始まりやすく設定しているため、対照群からは進行しかけている患者が優先的に、しかも早い時期に取り除かれ、残った対照群は本来より進行しにくい集団になります。CampigottoとWeller(2014)は、打ち切られた患者が残った患者より予後不良な場合に、無増悪生存期間のKaplan–Meier推定値が上振れすることをシミュレーションで確かめています。
後続治療での打ち切りを主解析に入れる場合、群ごとの打ち切り人数と時期の分布の確認が欠かせません。このデータの打ち切りが情報を持つと言い切れるのは、後続治療が高リスク例で早く始まる生成の仕組みを設定しており、図1がその結果を表しているためです。一方、実データでは仕組みが見えないため、群ごとの人数と時期から読み取れるのは不均衡の有無までで、独立打ち切りが成り立っているかは観測された分布だけでは決まりません。それでも不均衡は、この規則を主解析に置いてよいかを疑う理由になります。打ち切りが情報を持つ場合に何が起きるかは情報的打ち切りで扱いました。
後続治療を打ち切りに使わず、時間依存の変数としてCoxモデルに入れる方法もありますが、これは割付治療の効果を推定するための手当てにはなりません。後続治療は無作為化の後に、それまでの経過を見て決まるため、通常の時変共変量調整では時間依存交絡が入ります。データの持ち方そのものは時変共変量で扱いましたが、後続治療の入り方まで含めて効果を推定する場合はg法を使います。
Rで規則ごとにハザード比を求めます
survivalパッケージを使い、真の進行日、死亡日、予定評価が実際に行われたかどうかを区別したデータを用意しました。
set.seed(42)
library(survival)
arm <- rep(c(0L, 1L), each = 160L)
visit_days <- seq(56, 728, by = 56)
risk_score <- rnorm(320)
true_progression_day <- rexp(320, rate = 0.00225 * exp(log(0.70) * arm + 0.55 * risk_score))
true_death_day <- rexp(320, rate = 0.00055 * exp(log(0.85) * arm + 0.25 * risk_score))
# 高リスク例ほど予定評価を欠測しやすい設定
miss_probability <- plogis(-2.25 + 0.55 * risk_score + 0.20 * (1L - arm))
assessment_observed <- matrix(rbinom(320 * 13, size = 1L, prob = rep(1 - miss_probability, times = 13)), nrow = 320, ncol = 13)
assessment_observed[, 1L] <- 1L
記録上の進行日は、式(2)に従い、真の進行以降で実際に行われた最初の評価日としました。また、後続治療の開始日は打ち切りに使わず、進行日とは区別して保持します。
detected_progression_day <- vapply(seq_len(320), function(index) {
eligible <- visit_days >= true_progression_day[index] & assessment_observed[index, ] == 1L
if (any(eligible)) min(visit_days[eligible]) else Inf }, numeric(1))
subsequent_probability <- plogis(-0.55 + 0.75 * risk_score + 0.85 * (1L - arm))
has_subsequent_therapy <- rbinom(320, size = 1L, prob = subsequent_probability) == 1L
lead_days <- runif(320, min = 14, max = 70)
subsequent_therapy_day <- ifelse(has_subsequent_therapy, pmax(21, true_progression_day - lead_days), Inf)
この観測データに対し、規則Aでは後続治療の開始後も追跡を続け、規則Bでは後続治療がイベントより先に来た患者を直前の観察済み評価日で打ち切ります。
last_observed_before <- function(index, cutoff) max(0, visit_days[visit_days < cutoff & assessment_observed[index, ] == 1L])
event_day <- pmin(detected_progression_day, true_death_day)
time_a <- pmin(event_day, 728)
status_a <- as.integer(event_day <= 728)
therapy_first <- subsequent_therapy_day < event_day & subsequent_therapy_day <= 728
censor_day_b <- vapply(seq_len(320), function(index) if (therapy_first[index]) last_observed_before(index, subsequent_therapy_day[index]) else Inf, numeric(1))
time_b <- pmin(event_day, censor_day_b, 728)
status_b <- as.integer(event_day <= pmin(censor_day_b, 728))
規則Cは、進行を確認した評価日の直前で予定評価が2回以上続けて欠測していた患者について、そのイベントを採らず、最後に実際に行われた評価日で打ち切る規則です。飛ばした本数は日付の差ではなく、欠測した予定評価そのものを数えます。このデータで該当したのは320例中5例でした。
# 進行を確認した評価日の直前に、連続して欠測した予定評価の本数を数える
missed_run <- vapply(seq_len(320), function(index) sum(cumprod(rev(assessment_observed[index, visit_days < detected_progression_day[index]]) == 0L)), numeric(1))
long_gap <- status_a == 1L & detected_progression_day <= true_death_day & missed_run >= 2
time_c <- ifelse(long_gap, vapply(seq_len(320), function(index) last_observed_before(index, event_day[index]), numeric(1)), time_a)
status_c <- ifelse(long_gap, 0L, status_a)
rule_fits <- list(coxph(Surv(time_a, status_a) ~ arm, ties = "efron"),
coxph(Surv(time_b, status_b) ~ arm, ties = "efron"), coxph(Surv(time_c, status_c) ~ arm, ties = "efron"))
3つの規則についてCoxモデルから得た係数を、比較できる形で示します。
#> 規則 coef exp(coef) se(coef) z p イベント数
#> A -0.2312 0.7936 0.1264 -1.829 0.0673 252
#> B 0.1598 1.1733 0.1668 0.958 0.338 149
#> C -0.2291 0.7952 0.1276 -1.796 0.0726 247
exp(coef)の列がハザード比で、規則Aは0.794、規則Bは1.173、規則Cは0.795です。また、規則Bのイベント数は252から149へ落ちていますが、イベントが起きにくくなったのではなく、後にPFSイベントを経験する患者が打ち切りに置き換わった結果です。規則Aでイベントだった103例が規則Bで打ち切りに変わり、その内訳は後の進行98例、後の死亡5例でした。p値も0.067から0.338へ動きますが、検出力だけの問題とみなすと、点推定が反対側へ抜けたことを見落とします。

動いた数字の全てが偏りではありません
中央値でも同じことが起きています。規則Aでは対照群280.0日、治療群392.0日でしたが、規則Bでは対照群616.0日、治療群504.0日となり、対照群の中央値が336日も伸びました。この336日は治療の効果ではなく、進行しかけていた対照群の患者を打ち切って集団から外したことの効果です。
3つの規則から得た推定値と95%信頼区間を、図3に並べました。
# 一点鎖線は本文の参照値0.761、破線はハザード比1
hazard_ratio <- t(vapply(rule_fits, function(model) exp(coef(model)[1L] + c(0, -1.96, 1.96) * sqrt(vcov(model)[1L, 1L])), numeric(3)))
plot(hazard_ratio[, 1], 3:1, log = "x", pch = 18, cex = 1.9, yaxt = "n", ylab = "",
xlim = c(0.55, 1.75), ylim = c(0.5, 3.5), xlab = "Hazard ratio, treatment vs control (log scale)")
axis(2, at = 3:1, labels = c("Rule A", "Rule B", "Rule C"), las = 1)
segments(hazard_ratio[, 2], 3:1, hazard_ratio[, 3], 3:1, lwd = 2.2)
abline(v = c(1, 0.761), lty = c(2, 4))

図3の参照値0.761も、無増悪生存期間の真値ではありません。死亡側には0.85を置き、両群に共通のリスクスコアも入れているため、単一の比例ハザード比が成り立つ設計にはなっていません。規則Cの0.795は、規則Aの0.794からほとんど動きませんでした。ただし、これを評価欠測が非情報的だった証拠に使うのは無理があります。該当したのは5例しかなく、推定値が動かないのは規則の性質というより該当例の少なさで決まっています。欠測がもっと頻繁で片方の群に集中しているデータなら、動き方は変わります。
また、規則Bの1.173を「後続治療で打ち切ると必ず効果が消える」と読むのも正しくありません。ここで打ち切りを情報的にしているのは、後続治療が真の進行の直前に、しかも高リスク例で始まるという生成の仕組みです。故意にそう作った例なので、1.173は後続治療がなかった条件での治療効果を表す値ではなく、読み取れるのは推定値が動き得る幅だけです。
データを見た後に打ち切り規則を替えることは適切ではありません。規則を替えるとハザード比が0.380も動くと分かっている状態では、どの規則を使うかを結果の側から選べてしまうためです。一方、事前に規則を固定したうえで別の規則も並べて報告することは勧めます。ただし、並べた解析には、打ち切りの仮定だけを変えたのか、異なる治療効果を推定したのかを添えます。
規則は解析計画書と論文の両方に書きます
固形がんの試験では、進行判定そのものをRECIST 1.1(Eisenhauer et al. 2009)に従って行うのが標準ですが、RECISTが定めるのは病変の測定と進行の判定基準までで、後続治療を始めた患者の扱いは書かれていません。その下流にある観測規則と打ち切り規則まで書いて、はじめて定義になります。
論文の統計解析の節には、起点、イベントに数える事象、打ち切りに回す事象、それぞれの日付の取り方を一続きの文として記載します。「無増悪生存期間を無作為化から進行または死亡までの期間と定義しました」という一文だけでは、この記事の規則のどれを使っても通ってしまうためです。DATECANは、この書き分けを事象ごとに標準化しています。
感度分析についても、役割を混ぜないように書きます。ICH E9(R1)では、感度分析は主解析と同じ推定対象について、置いている仮定を変えても結論が持つかを見るものとされ、中間事象の扱いを変えて別の治療効果を推定する解析は補足解析に置きます。この線引きは検出力にも効いていて、規則Bのようにイベント数が252から149へ落ちる規則を主解析に選べば、設計時に見込んだ検出力は成り立たなくなります。イベント数と検出力の関係は必要イベント数で扱っています。
解析前に固定する内容
解析を始める前には、同意の撤回や転院による追跡不能まで含め、事象ごとの扱いと日付が固定されている必要があります。この記事の表のように、各事象をイベントと打ち切りのどちらに扱うかを一意に定め、同日に事象が重なった場合の優先順位も含めます。扱いが定まらない事象が残っていれば、その規則はまだ解析データセットへ反映できる状態ではありません。
エンドポイントの定義は、データを開く前に終わっている必要があります。
どこまで規則を細かく書くかは、疾患ごとの評価スケジュールや想定される後続治療の入り方で変わります。この線引きの相談はDr.データサイエンスで承っています。
参考文献
- Eisenhauer EA, Therasse P, Bogaerts J, et al. New response evaluation criteria in solid tumours: revised RECIST guideline (version 1.1). Eur J Cancer. 2009;45(2):228-247.
- Panageas KS, Ben-Porat L, Dickler MN, Chapman PB, Schrag D. When you look matters: the effect of assessment schedule on progression-free survival. J Natl Cancer Inst. 2007;99(6):428-432.
- Campigotto F, Weller E. Impact of informative censoring on the Kaplan-Meier estimate of progression-free survival in phase II clinical trials. J Clin Oncol. 2014;32(27):3068-3074.
- Gourgou-Bourgade S, Cameron D, Poortmans P, et al. Guidelines for time-to-event end point definitions in breast cancer trials: results of the DATECAN initiative. Ann Oncol. 2015;26(5):873-879.
- U.S. Food and Drug Administration. Clinical Trial Endpoints for the Approval of Cancer Drugs and Biologics: Guidance for Industry. 2018.
- International Council for Harmonisation. ICH E9(R1) Addendum on estimands and sensitivity analysis in clinical trials to the guideline on statistical principles for clinical trials. 2019.


