冲击肿瘤生存类高分 SCI 的“方法学门面三件套“:RMST 阴影图 + Landmark HR 曲线 + 条件生存 n
冲击肿瘤生存类高分 SCI 的"方法学门面三件套":RMST 阴影图 + Landmark HR 曲线 + 条件生存 nomogram——SeerSurvivalR 一行代码全出
要做肿瘤生存类高分 SCI 论文?只靠 KM+Cox 不够。RMST 阴影 KM、Landmark HR 曲线、条件生存 nomogram这 3 张图,是冲击高分生存类数据库(SEER、TCGA、NCDB)方法学段的"标配"。配齐这 3 件套,方法学段直接立住,没配齐的论文基本被审稿人打回返修。
一句话先抛结论
| 方法 | 解决什么审稿人追问 | 投稿必含图 / 表 | 加分档位 |
|---|---|---|---|
| RMST | "两组 tau 时间内平均多活多少天?" | RMST 阴影 KM + RMST forest plot | 4 分 → 5 分 |
| Landmark | "术后早期死亡会不会扭曲治疗效应?" | Landmark KM + 连续 HR 曲线 + Cox 森林 | 4 分起步 |
| 条件生存 | "已经熬到 X 年的患者再活 Y 年的概率?" | 条件生存曲线族 + 嵌 CS 列线图 | 4 分偏 5 分 |
这 3 个方法单独用任何一个都能让论文从 3 分迈进 4 分门槛;3 个都用 = 方法学段落直接碾压多数审稿人。
💡 一句话记住:RMST 给数字、Landmark 控偏倚、条件生存给患者用——三个方法都不是画一张图的事,是论文方法学段落的"门面三件套"。
方法 1|RMST(限制平均生存时间)
做什么:在指定时间 τ 之内,A 组比 B 组平均多活多少个月(不是 HR,是带单位的"差值")。
用在什么场景:
- 当两条 KM 曲线中位生存时间相同(HR = 1)但长期拖尾不一样(A 组有 20% 长尾活到 10 年),传统 Cox 报 HR=1 没差异,审稿人立刻质疑
- 临床医生 / 患者最关心具体多活几个月,HR 听不懂,RMST 直接给"多活 2.3 个月"这种话
- JAMA、Lancet Oncology、Annals of Oncology现在统计审稿人强推这种
真实发表案例:Durer et al.Cancer Res Commun2026,PMID [41334888](https://pubmed.ncbi.nlm.nih.gov/41334888/)
7 项 ES-SCLC 一线 ICI 试验 IPD meta 分析(n = 1,766)。HR 法结果:OS pooled HR = 0.73(0.68-0.79);RMST 法结果:pooled RMST gain =1.98 months(1.38-2.58)。两方法方向一致,但 RMST 给出"具体多活几个月",临床可直接翻译给患者。
图 1:A) Durer 等 2026 - OS RMST forest plot(PMID 41334888,Cancer Res Commun)。pooled RMST gain = 1.98 months (95% CI 1.38-2.58, I² = 0%),对应 pooled HR = 0.73(Figure 3)。HR 给"风险降低"是比例,RMST 给"具体多活多久"是数字——RMST 才能直接告诉患者"你大概多活 2 个月"。同一试验池(n=1,766),两个度量角度。
7 trials OS pooled HR 0.73 vs pooled RMST gain 1.98 月:同一组数据,两种解读——这就是为什么越来越多期刊要求 RMST。
SeerSurvivalR 实测:胃癌 Grade 1-2 vs 3-4,60 个月 RMST 阴影 KM
我们用 SeerSurvivalR 在 11 万 SEER 胃癌患者上跑了同样的 RMST 分析(JCO_rmst_km_plot,τ = 60 月),下面是代码实测输出——不是示意图。
图 2:SeerSurvivalR 3.5 实测 - Grade 3-4 vs 1-2 在 60 个月内 RMST 差异 8.31 个月(95% CI 7.98-8.64,P<0.001)。阴影部分就是两组 RMST 差对应的生存时间面积,肉眼能直接看出"低级别人群平均多活 8 个月"。
示例代码(基于SeerSurvivalR3.5)
library(SeerSurvivalR) # tau = 60 个月(5 年) p_rmst <- JCO_rmst_km_plot( data = seer_stomach, time_col = "time", status_col = "status", group_col = "Grade_bin", tau = 60 ) # 出图:打印 + 保存 print(p_rmst$plot) ggsave("fig_rmst_shadedKM.png", p_rmst$plot, width = 10, height = 7, dpi = 150)回答审稿人问题:"两组 HR 接近,但临床实际差多少?"—— 直接给具体月份。
方法 2|Landmark 分析
做什么:选定一个时间点 τ 作为"新起点",把已经活到 τ 的患者重新设基线,规避immortal time bias(不死时间偏倚)。
用在什么场景:
- 治疗组和对照组做"手术 vs 不手术"比较——能活到术后 1 年的本身就是"筛选过的人",普通 KM 把早期术后死亡错误归类
- 新辅助化疗 vs 术后化疗:从诊断时间算死亡会被 immortal time 污染;Landmark 从手术日重新算
- 任何"暴露发生在诊断后某段时间"的研究,Landmark 几乎是审稿必问项
真实发表案例 1:Li et al.J Cardiothorac Surg2026,PMID [41987194](https://pubmed.ncbi.nlm.nih.gov/41987194/)
157 例 III-IV 期肺恶性瘤,ablation vs laser excision,PSM 后 60-day Landmark 分析:剔除早期治疗相关死亡后,multivariable Cox HR = 0.56(0.34-0.93, p=0.025),LE 优势在 Landmark 后仍稳健。这篇文章能发,关键就是做了 Landmark sensitivity analysis 把 immortal time 堵住。
图 3:Li 等 2026 - PSM 后 Kaplan-Meier 曲线(PMID 41987194)。p = 0.048,提示 ablation 组生存劣于 laser excision 组。该论文不仅做 PSM,还做了 60-day Landmark(图未显示)作为 sensitivity analysis,对照 immortal time。
图 4:Li 等 2026 - PSM 后 multivariable Cox 森林图(PMID 41987194)。Ablation 多变量 HR = 0.52,P = 0.011,方法学段就是这种 Cox + Landmark 组合。
SeerSurvivalR 实测:胃癌 Grade 连续 Landmark,HR 随时间下降曲线
我们用 SeerSurvivalR 在 11 万 SEER 胃癌患者上跑了连续 Landmark 分析(τ = 12/24/36/48/60 月,共 5 个时间点)——每个 τ 跑一次 Cox,看 Grade 3-4 vs 1-2 的 HR 怎么随时间变。
图 5:SeerSurvivalR 3.5 实测 - HR 随 Landmark 时间变化曲线。12 月时 HR = 1.30,60 月时 HR = 1.04,早期 HR 显著升高、晚期趋向 1——这意味着 Grade 对死亡风险的影响"集中在前 3 年",熬过 3 年的患者 grade 已不重要。这是审稿人最难看到的"时间依赖性"洞察,传统 Cox 给不出。
示例代码(基于SeerSurvivalR3.5)
library(SeerSurvivalR) # 单 τ Landmark Cox res <- landmark_cox_analysis( data = seer_stomach, time_var = "time", event_var = "status", covariates = c("Grade_bin", "Age_num", "Sex_bin"), landmark_time = 12, export_csv = FALSE, print_results = TRUE ) # 输出 before / after 双套 HR——after 更稳健才是 Landmark 的价值 # 连续 Landmark:每个 τ 都跑一次 Cox cont <- continuous_landmark_analysis( data = seer_stomach, landmark_times = c(12, 24, 36, 48, 60), formula_str = "Surv(time, status) ~ Grade_bin + Age_num + Sex_bin", covariate_of_interest = "Grade_bin" ) # 出 HR 随时间变化曲线 p_hr <- plot_landmark_hr_curve( results = cont, title = "Grade 3-4 vs 1-2 HR 随 Landmark 时间变化", y_limits = c(0.5, 2.5) ) print(p_hr)回答审稿人问题:"你这些治疗组里有早期死亡/早期换组的患者,处理了吗?"—— 直接拿 Landmark before/after 对比。
方法 3|条件生存(Conditional Survival, CS)
做什么:算CS(t2 | t1)——已经活到 t1 年的患者,再活 t2 年的概率是多少。
用在什么场景:
- 患者最有共鸣的问题:"医生,我已经熬过术后 1 年,以后还能活多久?"普通 KM 给不出
- 癌症慢性病化的当下(甲状腺、乳腺、前列腺 5 年生存率 90%+),CS 是"长期管理"的核心统计工具
- JNCI、Cancer、EJC在乳腺癌、结直肠癌、甲状腺癌论文中频繁出现
真实发表案例:Zhang et al.Transl Cancer Res2026,PMID [42305490](https://pubmed.ncbi.nlm.nih.gov/42305490/)
1,552 例原发性乳腺淋巴瘤(PBL),3/5/10 年总生存率分别为 85%/77%/58%。CS 分析:活过 9 年再活 10 年的概率 =95%;刚诊断的患者 10 年 OS 仅 58%;AHR 第 1 年高峰 8.05% 后逐年下降,3 年后趋于平稳——CS 给出"熬过 3 年就基本没事"的患者关键答案。
图 6:Zhang 等 2026 - PBL 条件生存曲线族(PMID 42305490)。左:已活到 X 年的人在接下来 Y 年里的条件生存概率;右:9×10 概率矩阵,每格颜色代表概率。10-year CS:起诊断时 58%,活过 9 年后再活 10 年 = 95%——42% 差额就是"熬过 9 年"换来的。
图 7:Zhang 等 2026 - PBL CS-Nomogram(PMID 42305490)。这不是传统 Nomogram!这种 Nomogram 的每一行 "10-year CS(9|1) probability" 都是时间条件概率,横跨 9 行——让预测"动态化"。顶刊最爱这种把 CS 嵌入 Nomogram 的图,因为它直接告诉患者"按你的情况,熬到 X 后再活 Y 的概率"。
SeerSurvivalR 实测:胃癌条件生存曲线 + 概率表 二合一图
我们用 SeerSurvivalR 在 11 万 SEER 胃癌患者上跑了conditional_survival_risk_curve()——一张图 = 上半部分曲线族 + 下半部分 6×6 概率矩阵,正是上面 Fig 6 文献版式的"自家复刻"。
图 7-补:SeerSurvivalR 3.5 实测 - 条件生存 + 概率表二合一图。上:给定已活到 X 年,未来 Y 年条件生存概率曲线族;下:6×6 概率矩阵精确数值。读法:第 2 行第 4 列 = 73%,意思是"已活到 1 年的患者,再活 3 年的概率是 73%"。
SeerSurvivalR 实测:胃癌 CS 嵌入列线图
再用 SeerSurvivalR 的generate_nomogram_with_cs()在同一份数据上跑了直接把 CS 嵌进 Cox 列线图——正是上面 Fig 7(Zhang PBL)那种"CS-Nomogram"的自家复刻。
图 7-补 2:SeerSurvivalR 3.5 实测 - CS 嵌入 Cox 列线图(仿真 Zhang PBL Fig 7 风格)。模型变量:Grade_bin / Age_num / Sex_bin;底部 6 行:3 行普通生存率 + 3 行条件生存率。临床用法:患者总分算出来→沿 6 条概率线分别读出"1/3/5 年总生存率 + 熬过 1 年后再活 1/2/4 年的条件生存概率"。
SeerSurvivalR 实测:胃癌条件生存曲线族
我们在 11 万 SEER 胃癌患者上跑了同样的 CS 分析——输出的是真实数据曲线,不是示意图。
图 8:SeerSurvivalR 3.5 实测 - 胃癌患者条件生存曲线族。彩线按"已活到 X 月"分层(X = 0/12/24/36/48/60)。随着 X 增大(已熬过更长时间),条件生存曲线越来越"平",意味着后期死亡风险越来越低——这是"熬到一定时间就基本没事"的视觉证明。
示例代码(基于SeerSurvivalR3.5)
library(SeerSurvivalR) library(survival) # 1) 先拟合 KM km <- survfit(Surv(time, status) ~ 1, data = seer_stomach) # 2) 条件生存曲线族 p_cs <- plot_conditional_surv_curve( km_fit = km, at = seq(0, 60, 12), main = "胃癌患者条件生存曲线", xlab = "未来生存时间 (月)", ylab = "条件生存概率" ) print(p_cs) # 3) 把 CS 嵌入 Cox 列线图(顶刊最爱看的"动态预测") cox <- cph(Surv(time, status) ~ Grade_bin + Age_num + Sex_bin, data = seer_stomach, x = TRUE, y = TRUE, surv = TRUE) nom <- generate_nomogram_with_cs( cox_model = cox, surv_times = c(1, 3, 5), cs_times_list = list(c(1, 2), c(1, 3), c(1, 5)), funlabel = c("1-year", "3-year", "5-year", "CS(2|1)", "CS(3|1)", "CS(5|1)"), xfrac = 0.25 ) plot(nom, xfrac = 0.25)回答审稿人问题:"熬过难熬期后,这群患者实际命运如何?"—— 直接用 CS(5|3) 给具体数字。
三大方法投稿排版:发 SCI 加多少分?
| 投稿档次 | Figure 数 | 至少包含 |
|---|---|---|
| 3 分 | 3–4 张 | Flow + KM + Cox forest + 校准 |
| 4 分 | 5–6 张 | 上述 + RMST 阴影 / Landmark HR 曲线 / CS 曲线 |
| 5 分 | 7+ 张 | 上述 + CS 嵌入列线图 + 连续 Landmark + RMST 森林图 |
只做"4 件套"(KM + Cox + PSM + 竞争风险)已经到 4 分。如果你想挤进 5 分期刊(>5 IF),这 3 个高阶方法至少要做 2 个——多数审稿人一看方法学段就心里有数。
三大方法回答审稿人 5 类问题
| 审稿人问题 | 用什么方法答 | 哪张图配 |
|---|---|---|
| 治疗到底有没有获益? | Cox HR | 森林图 (Fig 4) |
| HR 看起来接近,临床实际差多少? | RMST | 阴影 KM (Fig 2) + RMST forest (Fig 1) |
| 这群患者的死亡 / 换组有 immortal time 偏倚吗? | Landmark | 连续 HR 曲线 (Fig 5) |
| 早期死亡会不会扭曲结论? | Landmark | KM (Fig 3) + Cox (Fig 4) |
| 已经熬过难熬期的患者以后命运如何? | 条件生存 | 曲线族 (Fig 6+8) + 列线图 (Fig 7) |
| HR 在不同时间会变吗? | 连续 Landmark HR 曲线 | Fig 5 |
| 长期随访可靠吗? | Reverse KM 中位随访 | —— |
不会用这 3 个方法的 4 个真实坑
- PH 假设不检验就跑 Cox— Cox 的前提是"风险比不随时间变",不跑
cox.zph()的话 HR 是错的;如果违规,要么用Landmark 分段,要么换 RMST - Landmark 没说 τ 为什么选 τ— τ 必须有临床意义(如术后 1 年是新辅助化疗完成时点),不能拍脑袋;τ 还应该 ≤ 中位随访时间,避免大量删失
- CS 的 at 超过观察范围—
at最大值不能超过最大观测生存时间;SEER 胃癌最长 227 月,你 at 设 300 月直接报错 - RMST 的 tau 设太大— tau > 实际随访长度时差值会被删失稀释变得不可靠;一般选 中位随访 × 0.8 或 5 年 / 10 年
本篇 takeaway + 行动 CTA
RMST 给数字、Landmark 控偏倚、条件生存给患者用——这 3 个方法是 4 分 SCI 的"基线工具"、5 分 SCI 的"入场券"。做完 4 件套再做这 3 个,方法学段落直接立住,审稿人没得挑。
下一步立刻能做的 3 件事:
- 把 RMST 的 tau 设成 60 / 120 月,3 个 tau 都跑一遍,对比哪个 tau 上 RMST diff 最显著——这就是 Discussion 里要写的"最大获益时间窗"
- 试试
landmark_cox_analysis(data, landmark_time = 12),对比 Landmark 前后 HR 变化——变化大说明 immortal time 偏倚严重,Discussion 第一段就能写 - 把条件生存曲线输出在列线图上(
generate_nomogram_with_cs),回邮件给导师看,他会立刻让你加进论文
附、对应三大分析的小工具:SeerSurvivalR 函数速查
SeerSurvivalR 3.5把上面三种分析做了一行代码封装,仅按"RMST / Landmark / 条件生存"三块组织:
RMST 模块(7 个函数)
rmst_analysis()— 单个 tau 的 RMST 差异分析(未调整 / 调整)rmst_table_unadjust()— 未调整 RMST 多时间点 Word 表rmst_table_adjust()— 调整后 RMST 多时间点表 + 自动生存曲线JCO_rmst_km_plot()— JCO 风格 KM + RMST 阴影面积图(本篇 Fig 2 用这个)jco_rmst_survival_curve()— 单组 RMST 曲线 + RMTLrmst_waterfall_plot()— RMST diff 瀑布图(多 tau 对比)rmst_psi_plot()/rmst_psi_threshold_table()— 预后指数辅助
Landmark 模块(5 个函数)
landmark_cox_analysis()— 单个 τ 的 Landmark Cox(输出 before/after 双表)landmark_survival_KM()— Landmark KM 曲线continuous_landmark_analysis()— 连续 Landmark(多个 τ 各跑一次 Cox,本篇 Fig 5 用这个)plot_landmark_hr_curve()— HR 随 τ 变化曲线(本篇 Fig 5 用这个)landmark_hr_table()/plot_landmark_hr_comparison()— 横向对比
条件生存模块(4 个函数)
plot_conditional_surv_curve()— CS(t2|t1) 条件生存曲线(本篇 Fig 8 用这个)generate_conditional_survival_table()— 多 t1 / t2 条件生存概率表conditional_survival_risk_curve()— 条件生存曲线 + 概率表 二合一(本篇 Fig 7-补 用这个,正是用户说的"那种图 + 表格集合")generate_nomogram_with_cs()— 把 CS 嵌入 Cox 列线图(本篇 Fig 7-补 2 用这个;复刻 Zhang PBL Fig 7 结构)
安装:install.packages("SeerSurvivalR_3.5.0.zip", repos = NULL, type = "source")📌 一句话总结:KM + Cox + PSM + 竞争风险 = 3 分方法学基线;再加RMST + Landmark + 条件生存= 4 分 SCI 的方法学门面,5 分 SCI 的入场券。SeerSurvivalR 3.5把这 3 类高阶分析都做了一行代码封装,跑完 4 件套再做这 3 个,等于把审稿人想问的"方法还有什么补充"全部提前堵死。