生存分析是什么,什么时候用
生存分析(Survival Analysis)是处理”到事件发生的时间”这类数据的统计方法,因最早用于医学上患者生存期比较而得名。在生物学实验室常见应用:
- 动物实验:比较不同给药组小鼠的生存期(肿瘤模型、药物治疗)
- 细胞存活:比较不同冻存条件下、不同复苏方法下细胞存活率随时间变化
- 细胞毒性 / 药物 LD₅₀:不同浓度药物处理下,细胞死亡时间曲线
- 分子事件:报告基因到达表达阈值的时间、细胞迁移穿越 Transwell 膜的时间等
核心特点是存在截尾(Censoring)——有些实验个体在实验结束时事件还没发生(比如小鼠还活着),或中途退出实验(比如意外死亡、处理错误)。这种数据 t 检验 / ANOVA 处理不了,必须用生存分析方法。
实验设计与数据准备
必须记录的三个要素
每一只小鼠 / 每一个样本,需要记录:
| 要素 | 含义 | 示例 |
|---|---|---|
| 分组 | 它属于哪一组(Control / Drug A / Drug B 等) | Control |
| 时间 | 从实验开始到事件发生(或实验结束 / 截尾)的时间长度 | Day 18、Day 25 |
| 事件状态 | 在该时间点,“事件发生了”还是”截尾了” | 1 = 事件发生(如小鼠死亡),0 = 截尾(如小鼠还活着 / 实验终止时仍存活) |
截尾(Censoring)的三种情况
- 右截尾(最常见):实验截止日该动物仍存活,或中途因非实验原因丢失
- 左截尾:事件在某次检查之前就发生了,但不知道具体时间
- 区间截尾:事件发生在两次检查时间之间(动物实验通常是每日观察一次,所以事件发生在 Day 17 与 Day 18 之间,记录为 Day 18,属于区间截尾简化为右截尾)
截尾数据是有效数据,不能删! 很多同学做生存分析时,把最后还活着的动物直接删掉,只统计死的——这会严重高估死亡率(删了存活贡献的信息)。截尾动物虽然不知道具体死亡时间,但提供了”它至少活了这么久”的重要信息。
动物实验数据示例
假设做了 3 组(Control、Drug Low、Drug High),每组 10 只小鼠,每日观察死亡情况,实验持续 40 天:
Group Time(days) Status
Control 15 1(死了)
Control 17 1
...
Control 40 0(到 Day 40 仍活着,截尾)
Drug Low 21 1
...
Drug High 31 1
...
Drug High 40 0(2 只还活着)
每组 10 条记录,不要取均值、不要提前汇总,GraphPad 需要的是单只动物一行。
GraphPad Prism 操作步骤(8.x / 9.x / 10.x 通用)
第 1 步:新建数据表格
- 启动 GraphPad Prism,New Project
- 在左侧选择 Survival 类型的数据表
- 数据格式选项:
- Enter/import raw data for each subject in a column structure → 选择 “Grouped” 数据格式(适合多组比较)
- 或新版 Prism 直接选 “Survival → Start with sample data to follow a tutorial” 也可以,先看示例
- 创建 3 个子列 × N 行(取决于最大动物数,通常 15 行就够)
第 2 步:数据录入
两种录入方式,选一种即可:
方式 A:一列式(推荐,有分组标签)
如果 Prism 版本允许 Survival 表直接录入,采用”长表格式”:
- 一列 Group(Control/Drug Low/Drug High)
- 一列 Time(时间数字)
- 一列 Status(1/0,事件或截尾)
方式 B:分组结构式(旧版 Prism 默认)
每个子列对应一组,两行一组:
- 第 1 行:生存时间(X)
- 第 2 行:事件标识,0 = 截尾,1 = 事件发生
示例(只看 Control 列):
Control
Time(Day) 15 17 20 22 40…
Status 1 1 1 1 0…
操作细节:把光标放在列标题上,右键 → “Insert Number of Subcolumns” 可以设置每个组多少子列。子列不够就加,每只动物占用 1 个子列(Time+Status 配对)。
第 3 步:自动生成 Kaplan-Meier 曲线
- 左侧导航栏切换到 Graphs → Data 1(就是你刚录入数据的那张图)
- Prism 会自动弹出图类型选择:选 Survival curve(Kaplan-Meier),X 轴 = Time,Y 轴 = Percent Survival(生存率 %)
- 默认样式:阶梯状下降曲线,每一个事件发生时曲线垂直下降一截。截尾点默认用 ”+” 符号标记在曲线上
第 4 步:曲线美化(论文要求)
双击图打开 Format Graph:
- 线条:加粗到 2 pt,每组用不同颜色或线型(实线/虚线/点划线),色盲友好配色
- 点:截尾标记保持 ”+“,Size 8 左右
- 坐标轴:
- X 轴标题:“Time (days)“,范围 0–40 或根据实验终止日定,Major Ticks 每 5 或 10
- Y 轴标题:“Survival (%)“,范围 0–100,Major Ticks 每 20
- 图例:放图右侧或下方,文字清晰
第 5 步:Log-rank 检验(组间比较)
这是生存分析的核心统计:
- 点击左侧导航 Analyze → Survival → Compare curves (log-rank, Gehan-Breslow-Wilcoxon)
- 勾选你要比较的组(3 组就全勾选)
- 检验选项:
- Test for trend(for ordered groups):如果分组是有序的(Control → Low → High,剂量递增),勾选这个(Tarone-Ware 趋势检验),检验效能更高
- 如果是普通无序分组(Control vs Drug vs 联合用药),不勾选
- OK,输出检验结果报告
第 6 步:结果报告解读
GraphPad 会输出一个完整报告,重点看以下几个数字:
1. 中位生存时间(Median Survival Time)
| Group | Median Survival (days) | 95% CI |
|---|---|---|
| Control | 20 | 17.5–22.5 |
| Drug Low | 27 | 23.5–30.5 |
| Drug High | 34 | 30.5–未达到 |
解释:Control 组一半小鼠在 Day 20 时死亡;Drug High 组超过实验末还没死完,中位生存时间**“未达到”(Not reached)**,95% CI 只有下限没有上限。
2. Log-rank 检验结果
| 比较对比 | Chi-square | P value |
|---|---|---|
| Overall(三组整体比较) | 13.8 | 0.0010 ✅ 有显著差异 |
| Control vs Drug Low | 4.5 | 0.033 ✅ |
| Control vs Drug High | 12.7 | 0.0004 ✅✅✅ |
| Drug Low vs Drug High | 3.3 | 0.069 NS |
解读逻辑:
- 先看 Overall P < 0.05,说明三组间至少有一组和其他组有差异 → 再看两两比较
- 如果 Overall P ≥ 0.05,两两比较一般也不会显著(GraphPad 会自动用 Bonferroni 校正多重比较)
3. 风险比 Hazard Ratio(HR,仅两组比较时输出)
两组之间的 GraphPad 额外给出 HR:
| 对比 | HR | 95% CI of HR |
|---|---|---|
| Drug High vs Control | 0.21 | 0.08–0.53 |
解释:
- HR < 1 = 处理组风险更低、存活更久(药物有效)
- HR = 0.21 意味着 Drug High 组在任何一个时间点的”瞬时死亡风险”只有 Control 组的 21%
- HR = 1 = 两组无差异;HR > 1 = 处理组更差
- 95% CI 不跨越 1,说明差异显著(与 Log-rank P 结果一致)
两种检验方法的选择
GraphPad 的 Compare 对话框中有三种检验:
| 检验方法 | 别名 | 适用场景 |
|---|---|---|
| Log-rank(Mantel-Cox) | Mantel-Haenszel | 默认推荐。给每个时间点等权重,对组间长期持续差异最敏感,论文最常用 |
| Gehan-Breslow-Wilcoxon | Wilcoxon-Breslow | 给早期时间点更大权重。如果药物前期效果明显、后期效果减弱,用这个更灵敏 |
| Tarone-Ware | — | 给中早期中等权重,折衷方案 |
一般情况用 Log-rank 就够了,90% 的论文都用这个。只有你确实关心早期差异(比如给药前 10 天效果强,后期耐药)才换 Wilcoxon。但不要挑最显著的那个报告(会被认为 P-hacking),在方法里说明你预设用哪种检验。
易错点合集
1. 截尾标反了(把活着的标成 1,死的标成 0)
GraphPad 默认为”时间 + 死亡指示(1=事件)“,但有时候会和其他软件(R、SPSS)的截尾约定(0=事件)搞混。标反了生存率会从 0 开始往上涨,结果完全颠倒。画完第一件事检查 Y 轴是不是从 100% 开始。
2. 同一时间点事件都算同一天,但生存曲线下降得不对
比如 Day 18 有 3 只小鼠死亡,GraphPad 应该一次性掉下 30%(如果 10 只),但发现只掉了 10% → 查数据里是否把三只都正确录入,而不是记了均值。
3. 没有用 Bonferroni 校正
3 组两两比较共 3 次比较,如果不校正 Family-wise error rate,假阳性会大大提高。GraphPad 做 3 组以上整体 Log-rank 时会自动校正,但手动拆成多次两两比较的话需要自己设。
4. 样本量太小(每组 <8 只)
生存分析对样本量敏感。每组 5 只的结果误差会非常大,Kaplan-Meier 阶梯跳得很猛,审稿人通常会要求每组至少 8–10 只动物。
5. 把”存活数”而不是”每只动物的时间和状态”录进去
很多同学把原始数据汇总成 Day 1 死几只、Day 2 死几只再录入。GraphPad 生存分析数据表是按个体,不是按时间点汇总。如果真的只有汇总数据,可以用 Prism 另一种”频次形式”录入(Advanced 选项中选择 number at risk)。
6. 统计显著性用错了指标
HR < 1 且 CI 不跨 1 → 显著,但有时候 HR 的显著和 Log-rank 的 P 会不一致(极端截尾模式下),论文中以 Log-rank P 为主要统计指标,HR 是解释效应量的辅助指标。
与其他实验的联动分析
动物生存实验通常和以下数据互相印证:
- 肿瘤生长曲线(每 2–3 天测量肿瘤体积):体积翻倍时间 vs 生存时间的关系
- 体重变化:体重下降 >20% 是否对应死亡事件?是否动物安乐死的判断标准一致?
- 终点取材 / IHC / 血清细胞因子:不同结局的动物组织学 / 分子标记是否有差异
动物实验数据和统计学结合,可参考 GraphPad ANOVA 完整指南(多组比较)和 GraphPad t 检验指南(两组比较)处理其他定量指标。