Kaplan-Meier 推定量と右打ち切り — 生存時間データのノンパラメトリック推定
データ処理、統計解析、報告書の執筆はいずれも筆者が単独で行った。
背景:生存時間データと打ち切りの問題
臨床研究では「死亡までの期間」「再発までの時間」「入院期間」といった、イベント発生までの時間を評価することが多い。こうした生存時間データ(time-to-event data)の最大の特徴は、すべての被験者が観察期間内にイベントを経験するとは限らない点にある。観察終了時点でまだ生存している、あるいは転居などで追跡不能になったケースは「打ち切り(censoring)」として扱われる。特に、イベントが観察終了時刻より「右側」で起こるケースを右打ち切り(right censoring)と呼ぶ。
打ち切り例を単純に分析から除外すると、生存関数を過小評価してしまう。なぜなら、打ち切り例の多くは「長く生存しているからこそ、まだイベントが観察されていない」のであり、それらを「なかったこと」にすることは、長期間生存する被験者の情報を捨てることになるからだ。
この問題に対処するために開発されたのが Kaplan-Meier(KM)推定量である。本演習では、(1) 手計算による KM 推定量の仕組みの理解、(2) シミュレーションによる打ち切り処理の重要性の可視化、(3) 実データを用いた 2 群比較と log-rank 検定、の 3 段階で生存時間解析の基礎を学んだ。
方法 1:手計算で理解する KM 推定量
理論
人の被験者について、イベント発生または打ち切りが観察された時点を とする。各時点 において:
- :時点 でイベントが発生した人数
- :時点 の直前までにイベントも打ち切りも経験していない人数(リスク集合)
KM 推定量は以下の条件付き生存確率の積で表される:
打ち切りが発生した時点ではリスク集合 から当該被験者を除外するが、 の積には影響を与えない。この仕組みにより、打ち切り例の「少なくともその時点までは生存していた」という情報を無駄にしない。
小例による手計算
以下の 5 名のデータで実際に計算してみる(survtime: 生存時間または打ち切り時刻, event: 1=イベント発生, 0=打ち切り):
| ID | survtime | event |
|---|---|---|
| 1 | 2 | 0 |
| 2 | 4 | 0 |
| 3 | 4 | 1 |
| 4 | 5 | 1 |
| 5 | 7 | 1 |
時点 では ID 2(打ち切り)と ID 3(イベント)が同時に発生している。打ち切りを先に処理する慣習に従い、 でのリスク集合は (ID 1 は で打ち切られているので既に除外)、イベント数は となる。よって 。
このように各時点の生存確率を積み重ねていくことで、階段状に減少する生存曲線が得られる。打ち切り時点には マークを付けて可視化する。
方法 2:シミュレーションによる検証
データ生成
パラメータ の指数分布から の生存時間を生成し、一様分布から打ち切り時刻を与えた。真の生存関数は である。
n <- 100; lambda <- 0.05; set.seed(2025)
true_time <- rexp(n, rate = lambda)
censor_time <- runif(n, min = 0, max = max(true_time))
obs_time <- pmin(true_time, censor_time)
status <- as.numeric(true_time <= censor_time)
3 本の曲線を比較する
以下の 3 本を重ねてプロットした:
- 真の生存関数 (理論値、比較基準)
- KM 推定量(打ち切り適切処理)—
survfit(Surv(time, status) ~ 1) - 打ち切り除外推定(status == 1 のデータのみで KM)

結果、KM 推定量は真の曲線に近い軌跡を示したが、打ち切り単純除外は生存確率を一貫して低く見積もった。打ち切りを無視することの危険性が一目瞭然である。
打ち切り時期の影響
さらに、打ち切りが早期(最大 30 時点)に集中するシナリオも検証した。追跡不能が早期に発生すると、後半のリスク集合が小さくなり KM 推定量の信頼性が低下する。臨床試験において追跡期間の設計が推定精度に直結することを示している。
方法 3:実データへの適用
データセット 1:example_data.csv
example_data.csv を用いて、Control 群と Treatment 群の生存曲線を KM 推定し比較した。
example.data <- read.csv("example_data.csv")
example.data$group <- factor(example.data$group,
labels = c("Control", "Treatment"))
fit.km <- survfit(Surv(time, status) ~ group, data = example.data)
plot(fit.km, col = c("gray40", "darkorange"), lwd = 3,
xlab = "Time", ylab = "S(t)", mark.time = TRUE)
survdiff(Surv(time, status) ~ group, data = example.data)
データセット 2:veteran(公開データ)
R の survival パッケージには lung, ovarian, colon, veteran など複数の公開臨床試験データが収録されている。今回は veteran——進行肺がん患者を対象としたランダム化比較試験()——を用いた。veteran は治療群(標準治療+新規薬剤)と対照群(標準治療のみ)の 2 群からなり、生存時間と打ち切り有無に加え、cell type(組織型)や Karnofsky performance score などの予後因子も含む、生存時間解析の標準的な教材データである。
library(survival)
data(veteran)
fit.km <- survfit(Surv(time, status) ~ trt, data = veteran)
plot(fit.km, col = c("gray40", "darkorange"), lwd = 3,
xlab = "Time (days)", ylab = "Survival probability")
survdiff(Surv(time, status) ~ trt, data = veteran)

log-rank 検定の原理
2 群の生存曲線を比較する際に最もよく使われるのが log-rank 検定である。帰無仮説は「2 群の生存関数は等しい」()である。
各イベント発生時点 において、群 1 のリスク集合人数を 、群 2 を 、その時点の総イベント数を とすると、群 1 のイベント数の期待値は となる。
これらを全時点で合計し、以下の検定統計量が帰無仮説のもとで自由度 1 のカイ二乗分布に近似的に従うことを利用する:
log-rank 検定の特徴は、早期から後期までの全イベント時点にわたって差を蓄積することだ。ある特定の時点だけの差ではなく、曲線全体としての乖離を検出する。また各イベント発生時点のリスク集合に基づいて計算されるため、独立な打ち切りはリスク集合の減少として自然に反映される。一方で、比例ハザード性が成り立たない場合や、治療効果が早期と後期で逆転して生存曲線が交差するような場合には、検出力が著しく落ちることが知られている。そのような状況では、特定の時期のイベントに重み付けを行う一般化 Wilcoxon 検定などの代替手法を検討する必要がある。
結果と解釈上の注意点
veteran データでの log-rank 検定の結果、カイ二乗統計量は (自由度 1)、 となり、治療群と対照群の生存曲線に統計学的に有意な差は認められなかった。
また、生存曲線のプロット(図)を観察すると、Treatment 群の一部が 付近まで生存し、曲線が右側に長く伸びていることがわかる。しかし、この区間まで生存している被験者数(リスク集合)は極めて少なく、曲線の変動は偶然誤差(ランダムなばらつき)によるものが大きい。KM 曲線の終端部分における生存率の推定値は不確実性が高いため、視覚的な印象のみで「一部の患者には長期的な効果がある」と過大評価しないよう注意が必要である。
この結果から言えることは「治療に効果がない」ではなく、「このデータとこのサンプルサイズでは、有意水準 5% で検出できる差はなかった」ということだ。臨床試験の解析において「有意差なし」の解釈には常にこの注意が必要であり、サンプルサイズや効果量、検出力を踏まえた総合的な判断が求められる。
生物統計学との接続
KM 推定量の核心——打ち切り例を「なかったこと」にせず「そこまでは生存していた」証拠として扱う——は、より高度な因果推論手法にも通じる考え方だ。
Target Trial Emulation の枠組みでは、観察データで模倣的 RCT を構成する際、観察開始後に生じる打ち切りを Inverse Probability of Censoring Weighting(IPCW)で補正する。この IPCW は「打ち切りがなければ観察されたはずの情報を、観察された被験者の重みで復元する」という発想に基づいており、KM 推定量が打ち切り時点でリスク集合から除外する——つまり「情報を捨てずに扱う」——考え方の延長線上にある。
本演習を通じて、生存時間データの特殊性と、それを適切に扱うノンパラメトリック手法の意義を、手計算・シミュレーション・実データの 3 つの角度から確認することができた。
ソースコードとデータ
本解析で使用した R コードおよびダミーデータは、以下の GitHub リポジトリにて公開している: