跳转至

生存分析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-rankWilcoxon(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回归分析具体风险因素