生存分析Log-rank检验
一句话概述:Log-rank检验是比较两组或多组生存曲线是否有显著差异的非参数检验方法,是Kaplan-Meier生存分析中判断组间生存差异的标准统计方法,在肿瘤和临床研究中必用。
核心知识点速查表
| 概念 | 说明 |
|---|
| Log-rank检验 | 比较生存曲线的非参数检验(白话:两组人的存活率有没有显著差别) |
| Kaplan-Meier | 非参数生存曲线估计方法 |
| 删失(Censoring) | 随访结束时事件未发生(白话:到研究结束人还活着) |
| 中位生存时间 | 50%患者存活的时间点 |
| 风险表 | 各时间点的存活人数 |
一、R语言实操
# === Kaplan-Meier + Log-rank检验 ===
library(survival)
library(survminer)
# 准备生存数据
# time: 生存时间(天/月)
# status: 0=删失, 1=死亡/事件
# group: 分组变量
# 拟合KM曲线
fit <- survfit(
Surv(time, status) ~ group, # 生存对象 ~ 分组
data = clinical_data
)
# Log-rank检验
survdiff(Surv(time, status) ~ group, data=clinical_data)
# p < 0.05 → 两组生存率有显著差异
# ★可视化(最常用的图)
ggsurvplot(
fit,
data = clinical_data,
pval = TRUE, # 显示p值
risk.table = TRUE, # 风险表
risk.table.height = 0.25, # 风险表高度
palette = c("#E7B800", "#2E9FDF"), # 颜色
conf.int = TRUE, # 95%置信区间
xlab = "Time (months)", # x轴标签
ylab = "Survival Probability", # y轴标签
legend.labs = c("Group A", "Group B"), # 图例
ggtheme = theme_minimal(), # 主题
surv.median.line = "hv" # 中位生存线
)
# === 多组比较 ===
# 三组或以上
fit3 <- survfit(Surv(time, status) ~ stage, data=clinical_data)
log_rank <- survdiff(Surv(time, status) ~ stage, data=clinical_data)
# 如果全局显著,做成对比较
pairwise_survdiff(
Surv(time, status) ~ stage,
data = clinical_data,
p.adjust.method = "BH" # 多重检验校正
)
二、面试高频考点
Q1: Log-rank检验的原理?
- 比较各组的观察死亡数(O)和期望死亡数(E)
- 如果两组生存没有差异,O应该接近E
- 统计量: χ² = Σ(O-E)²/E,自由度=组数-1
- 白话:看实际死亡人数和"假设两组一样"时的预期死亡人数差多少
Q2: Log-rank vs Wilcoxon(Breslow)?
| Log-rank | Wilcoxon(Breslow) |
|---|
| 权重 | 各时间点等权重 | 早期事件权重更大 |
| 适用 | 晚期差异(如长期生存率不同) | 早期差异(如术后短期差异) |
| 假设 | 比例风险(PH) | 无PH假设 |
| 推荐 | ★默认首选 | 关注早期差异时 |
Q3: p值显著但曲线交叉怎么办?
- 曲线交叉说明违反了比例风险假设
- Log-rank检验可能不可靠
- 解决方案:①分段分析 ②用Wilcoxon检验 ③用限制性平均生存时间(RMST)
速查表
# === 生存分析速查 ===
library(survival); library(survminer)
# KM曲线 + Log-rank
fit <- survfit(Surv(time, status) ~ group, data=df)
ggsurvplot(fit, pval=TRUE, risk.table=TRUE)
# 成对比较
pairwise_survdiff(Surv(time,status)~group, data=df, p.adjust.method="BH")
# 中位生存时间
print(fit) # median列
# Log-rank p值显著 → 说明两组生存有差异
# 下一步: Cox回归分析具体风险因素