引言Introduction

生存曲线看似简单,但代码里最容易踩坑。分组错了,时间和结局写反了,p值和风险表也可能失真。对临床医生、硕博生和科研人员来说,一张图画对,远比“画出来”更重要
临床科研场景下的Kaplan-Meier生存曲线示意图,包含高低表达两组曲线、删失点和风险表

1. 生存曲线代码前,先把数据结构理清

1.1 时间、结局、分组,三个变量不能混

生存分析最核心的输入只有三类。time代表随访时间,status代表结局状态,group代表分组信息 。这三个变量一旦混淆,后面的曲线、p值和HR都会出问题。

在R里,通常先用 Surv(time, status) 构建生存对象。这里的关键是状态变量要符合你的编码规则。比如,有的数据集里1表示删失,2表示事件。也有的数据用0和1编码。代码前必须先核对数据字典,不能直接套模板。

常见错误包括:

  • 把生存时间写成了生存月份,却当成天数解释。
  • 把事件状态反了。
  • 把高低组变量写成了连续变量,导致模型含义错误。

1.2 先看数据分布,再决定怎么分组

很多人上来就按中位数分组。这样做并非绝对错误,但要先确认数据是否适合。对于基因表达数据,常见做法是按中位值分成高表达组和低表达组 。如果样本量较小,也可以考虑四分位数、最佳截点或预设阈值,但要说明依据。

分组前建议先做这三步:

  1. 看表达值分布,确认是否偏态。
  2. 看样本量是否足够支撑分组。
  3. 明确分组标准是否和研究问题一致。

分组标准不清,结论就不稳。 这是生存曲线代码里最常见的第一类坑。

2. 单因素生存曲线代码最常见的错误

2.1 survfitggsurvplot 的逻辑要接住

单因素Kaplan-Meier曲线的核心流程很固定。先构建 Surv 对象,再用 survfit(Surv(time, status) ~ group, data=...) 拟合模型,最后用 ggsurvplot() 出图。

常用参数包括:

  • pval = TRUE,显示log-rank检验结果。
  • risk.table = TRUE,显示风险表。
  • conf.int = FALSE/TRUE,决定是否显示置信区间。
  • palette,控制颜色。
  • linetype,控制线型。

不要只看图好不好看,要先确认模型是否正确。 如果 group 没有正确传入,图可能能画出来,但统计意义是错的。

2.2 p值有了,不代表结果就能直接写进论文

很多初学者看到 p < 0.05 就认为完成了。其实还要看曲线形态。知识库里已经明确提到,如果两条曲线交叉明显,即便p值显著,也要谨慎解释 。交叉说明比例风险假设可能不稳定,或者某些时间段效应方向不同。

建议你检查:

  • 曲线是否明显交叉。
  • 交叉发生在早期还是后期。
  • 风险表中各时间点在组人数是否过少。
  • 是否需要进一步做亚组分析。

不要为了“显著”去删掉交叉后的数据。 这类处理会破坏统计完整性,也不符合规范。

2.3 风险表和删失点,不能省略得太随意

风险表显示的是各时间点仍在随访的人数。对于临床读者来说,这比单纯一条曲线更有解释力。删失点则提示样本在何时退出观察。

如果图上没有风险表,读者很难判断后期曲线是否稳定。尤其是样本量下降很快时,后半段曲线的可信度会明显下降。风险表不是装饰,而是解释曲线可信度的重要部分。

3. 批量生存曲线代码,最容易在循环里出错

3.1 批量分析的关键是统一模板

很多科研项目会一次分析多个基因。此时最重要的不是画图,而是把循环逻辑写对。知识库中批量绘图的思路很清晰:先提取基因列表,再循环计算中位数分组、拟合 survfit、进行 survdiff 检验,最后把结果保存到 list 中。

这一类代码最容易出错的地方有三个:

  1. 基因名提取不完整。
  2. 循环中变量覆盖。
  3. 输出文件名重复,导致结果被覆盖。

建议统一命名规则,例如:

  • gene 存放基因名。
  • Med 存放中位数。
  • fit 存放拟合结果。
  • p 存放P值。

循环代码越长,变量名越要清楚。 这是批量生存曲线代码能否稳定运行的核心。

3.2 结果筛选要提前设定阈值

批量分析往往不是所有基因都值得展示。知识库中提到,可以根据p值筛选后再保留结果。常见做法是保留 p < 0.05 的基因,再输出图形和统计结果。

但这里也要注意两点:

  • 批量筛选后要说明是否做了多重检验校正。
  • 不能把筛选结果直接当作因果证据。

如果是探索性分析,建议在结果中明确说明这是候选基因筛选。这样更符合E-E-A-T中的可信原则。

3.3 保存图和保存统计结果要同步

很多人只保存图片,不保存统计表。等到写文章时,p值、HR、CI区间又要重新跑一次。实际上,最好在循环里同时保存:

  • 图片文件。
  • p值结果。
  • HR和置信区间。
  • 分组信息。

这样后续写结果和方法部分都更顺。图、表、代码三者必须对应。

4. 双因素生存曲线,联合分析比单看单基因更稳

4.1 两个基因联合分组,先定义组合逻辑

双因素生存曲线常用于看两个变量的联合效应。知识库中提到,可以把两个基因都按中位数分成高低组,再组合成四组。比如:

  • 11组。
  • 12组。
  • 21组。
  • 22组。

这里最重要的是分组顺序要统一 。如果一个变量高表达记为1,另一个变量低表达记为2,那么后续合并时就要保持一致。否则图例和真实分组会错位。

4.2 两两比较和一次性比较,适用场景不同

双因素曲线有两种画法。第一种是四组之间做两两比较。第二种是四组一次性比较。知识库明确指出,如果目的是展示联合诊断价值,直接四组整体比较往往更合适

两两比较适合回答“哪两组差异显著”。
一次性比较适合回答“四组整体是否存在差异”。

写作时建议这样表述:

  • 先报告整体log-rank检验结果。
  • 再根据需要补充两两比较。
  • 不要把所有比较都堆在一张图里,图会非常乱。

4.3 HR、P值和图注,三者必须一致

双因素分析通常会涉及HR和p值。这里要注意,HR的解释对象必须和分组定义一一对应 。如果图例里低表达在前,但模型里高表达作为参照组,文本解释就会冲突。

建议你在出图前检查:

  • 图例顺序是否正确。
  • 参考组是否定义清楚。
  • 图中标注的p值是否对应正确比较。

这是论文审稿中非常容易被追问的地方。尤其是临床方向的稿件,图注和正文不一致会直接降低可信度。

5. 写论文和出图时,最该避免的五个坑

5.1 不要把统计显著等同于临床显著

生存曲线显著,只说明组间生存分布有差异,不等于临床效应足够大。要结合HR、95%CI和样本量一起看。统计显著不等于临床有意义。

5.2 不要忽略删失和随访不足

如果后期风险表人数很少,曲线尾部的解释力度就下降。尤其在长期随访研究中,尾段结果要谨慎解释。

5.3 不要把交叉曲线强行解释成单向优劣

曲线交叉时,常见情况是不同时间段风险不同。此时更适合进一步做分段分析或亚组分析,而不是直接下结论。

5.4 不要忘记方法部分要写清软件和参数

论文里至少要说明:

  • 使用的软件和版本。
  • 使用的R包。
  • 分组方式。
  • 检验方法。
  • 是否展示风险表和置信区间。

5.5 不要只复制代码,不理解统计含义

生存曲线不是“跑通就行”。真正合格的结果,是代码、统计和临床解释三者一致。

总结Conclusion

生存曲线代码的核心,不只是会画图,而是把时间、结局、分组、检验和解释全部对齐。单因素分析要看分组是否合理,批量分析要防止循环出错,双因素分析要避免图例和参照组混乱。只要前期数据定义清楚,后面的结果才可信、可写、可复现。

如果你希望把生存曲线从“能画出来”提升到“能稳定出结果、能直接用于论文”,可以借助解螺旋 的生信与科研服务,减少重复试错,把时间留给更重要的研究设计和结果解读。

解螺旋科研助手企业微信二维码,扫码添加免费领取科研资料礼包,包含AI科研提效、SCI投稿技巧、国自然基金、医学科研绘图、科研软件工具等实用资料