Skip to content

第 7 章 人时数据与生存分析(Person-Time Data & Survival Analysis)

对应课件 7 Person-Time Data.pdf,覆盖 Rosner 第 14 章。 本章是流行病学/临床研究中最关键的部分:当数据带有"时间"维度(每人随访时间不同、可能未观察到事件就删失),普通比例就不够用了。


1. 风险/频率的三种度量

度量分子分母适用
累积发病率(Incidence Proportion)0t 的新病例数t=0 时无病人数全员同时随访到 t
点患病率(Point Prevalence)t 时的当前病例数(含旧病)t 时总人口截面调查
发病率(Incidence Rate / Density)0t 的新病例数总人时(如人年)队列研究、随访时间不一

2. 发病率(Incidence Rate)

2.1 定义

每个个体被随访直到:

  1. 发病
  2. 死亡
  3. 失访(迁出)
  4. 研究结束

总人时 = 所有受试者的随访时间之和(如人年)。

λ^=at
  • a:观察到的事件数
  • t:总人时

2.2 例:加工肉摄入与糖尿病

摄入组病例数 a人年 t发病率
高摄入182,9350.00613 = 613/10万人年
不摄入215135,1300.00159 = 159/10万人年

思考单位:发病率必须带"每人年"等单位。


2.3 累积发病率(CumI)

假设发病率 λ 时间不变:从泊松过程导出

P(T>t)=eλt

CumI(t)=1eλt

λt<0.1 时(罕见事件、短随访):

CumI(t)λt(Taylor 一阶近似)

直觉:低风险时,"累积发病率 ≈ 发病率 × 时间"。


3. 单样本发病率检验

3.1 模型

APoisson(μ=λt)。检验:

H0:λ=λ0vsH1:λλ0

3.2 大样本(正态近似)

X2=(aμ0)2μ0χ12

经验法则:μ0=λ0t10 时近似良好。

例:高风险饮食 vs 总体糖尿病发病率

  • λ0=0.004,t=4000μ0=16
  • 观察 a=28
  • X2=(2816)2/16=144/16=9.0>3.84=χ1,0.952
  • → 拒绝 H0:高风险组糖尿病发病率显著高于总体。

3.3 小样本(精确泊松)

p=min[2k=0aeμ0μ0kk!,1]若 a<μ0p=min[2(1k=0a1eμ0μ0kk!),1]若 aμ0

3.4 λ 的置信区间

  • a10:正态近似 a±z1α/2a,再除以 t
  • a<10:用泊松分位数
CI^(λ)=(c1t,c2t)

例(高风险饮食):λ^=28/4000=0.007,95% CI:

28±1.9628=(17.6,38.4)λ(0.0044,0.0096)

不含 0.004,与拒绝 H0 一致。


4. 双样本发病率检验

4.1 模型转化

两组 a1,t1a2,t2。在 H0:λ1=λ2 下:

A1(A1+A2=n)Binomial(n,p0),p0=t1t1+t2

直觉:在 H0 下,每个事件落在第 1 组的概率正比于第 1 组的人时占比。

4.2 期望与方差(H0 下)

E(A1)=np0,Var(A1)=np0(1p0)=nt1t2(t1+t2)2

4.3 大样本检验(含连续性校正)

要求 Var(A1)5

z=a1E(A1)0.5Var(A1)N(0,1)

a1>E 时减 0.5;a1E 时加 0.5)

例:肉摄入与糖尿病

  • a1=18(高摄入),t1=2935a2=215t2=135130
  • E(A1)=(18+215)2935/1380654.95
  • 等等,按课件数据为 a1=9,a2=239E=5.27,Var=5.16(细节略)
  • z=(95.270.5)/5.161.42p0.155不拒绝

4.4 小样本:精确二项检验

直接用 Binomial(n,p0) 算单/双侧 p 值。当 Var(A1)<5 必须用此法。


5. 发病率比(Incidence Rate Ratio, IRR)

5.1 估计

IRR^=λ^1λ^2=a1/t1a2/t2

5.2 ln(IRR) 的方差(Delta 方法)

ln(IRR^)=lna1+lnt2lna2lnt1

AiPoissonVar(Ai)ai,应用 Delta 法(一阶 Taylor):

Var[ln(IRR^)]1a1+1a2

5.3 95% CI

先在 log 尺度算,再指数变换回来:

cL,U=ln(IRR^)z1α/21/a1+1/a2CI^(IRR)=(ecL,ecU)

a1=15,t1=4000(暴露),a2=50,t2=15000(非暴露):

  • IRR^=(15/4000)/(50/15000)=0.00375/0.00333=1.13
  • ln(1.13)=0.122
  • SE=1/15+1/50=0.291
  • 95% CI for ln(0.1221.96(0.291),0.122+1.96(0.291))=(0.294,0.538)
  • 95% CI for IRR:(e0.294,e0.538)=(0.75,1.71)含 1,差异不显著)

6. 分层人时数据(Stratified Analysis)

6.1 为什么分层?

混杂变量(confounder):与暴露、结局都有关。例:年龄既影响是否服药,又影响发病率。直接比较暴露/非暴露会被年龄"混淆"。

→ 按年龄分层,在每层内"公平"比较。

6.2 假设:层间 IRR 相同(同质性 Homogeneity)

设第 i 层(共 k 层):

p1,i=a1,i/t1,i,p2,i=a2,i/t2,i

H0:IRRi=1 下:第 i 层暴露组事件期望

Ei=(a1,i+a2,i)t1,it1,i+t2,iVari=(a1,i+a2,i)t1,it2,i(t1,i+t2,i)2

6.3 综合检验统计量

A=a1,i,E=Ei,V=VariX2=(|AE|0.5)2Vχ12

V5。这是Mantel-Haenszel 风格的检验。


6.4 综合 IRR 估计(按方差倒数加权)

ln(IRR^)=wiln(IRR^i)wi,wi=1Var{ln(IRR^i)}=11/a1,i+1/a2,i

方差最小化 → 这是最优权重

Var{ln(IRR^)}=1wi

CI 同上:先 log 尺度做正态 CI,再指数变换。

例:药物 vs 疾病(5 个年龄层)

  • 综合 IRR^=1.41,95% CI:(1.17,1.69)
  • 比较"未分层"的 crude IRR = 1.25 → 年龄是负向混杂(年龄越大用药越少,但发病率越高)

6.5 同质性检验

若各层 IRR 不同,"综合 IRR"无意义。检验:

H0:IRR1==IRRkX2=wi[ln(IRR^i)ln(IRR^)]2χk12

工作流:先做同质性检验;如果不显著(不能拒绝同质),再报告综合 IRR。


7. 生存数据(Survival Data)

7.1 什么是生存数据?

Time-to-event 变量:从某个时间起点到事件发生的时间。

定义生存时间需要 3 要素:

  1. 明确的事件(终点):死亡、复发、出院、确诊等
  2. 明确的起点(启动时钟):诊断、手术、入组、随机化
  3. 时间单位:天、月、年

常见生存指标

指标含义
OS Overall Survival诊断到任何死因死亡
PFS Progression-Free Survival治疗开始到疾病进展或死亡
DOR Duration of Response首次响应(CR/PR)到进展或死亡

7.2 删失(Censoring)

由于时间限制、失访等,事件可能未观察到

类型

  • 右删失(Right)(最常见):研究结束/失访前未发病 → 真实事件时间 观察时间
  • 左删失(Left):在第一次评估前事件就发生了
  • 区间删失(Interval):在两次评估之间发生(如两次 MRI 之间出现病灶)

7.3 非信息性删失假设

核心假设:删失的发生与未来事件风险无关——被删失者与仍在风险中的人有同样的未来风险。

信息性删失示例(违反假设、产生偏差):

  • 因副作用退出(治疗组的"高风险者"被剔除)
  • 因病情严重提前结束随访

观察到的:

Tobs=min{Ttrue,Tcens},δ=1{Tobs=Ttrue}

→ 数据由 (T,δ) 两个变量表示。

为什么删失数据有用? 被在 t 删失的人 → 真实生存时间 t → 仍是有效信息。


8. Kaplan-Meier 估计

8.1 KM 基本思路

[0,t) 切成若干不重叠子区间(在每个观察到的事件时刻断开)。

P(活过 t)=i:y(i)tP(活过第 i 段)

KM 估计公式

S^(t)=i:y(i)t(1d(i)n(i))
  • d(i):在 y(i) 时刻发生事件的人数
  • n(i):在 y(i) 正前一刻仍在风险集中的人数(既未事件也未删失)

8.2 KM 曲线特征

  • 始于 1(100% 存活)
  • 单调阶梯下降(仅在事件时刻下降,删失不下降)
  • 若最后一个观察是事件 → 终点降到 0
  • 删失个体在自己时刻"安静地"退出风险集(曲线不变化,但通常打小竖标记)

8.3 关键量

t 年生存概率 = 曲线在 t 时刻的高度。配 95% CI(Greenwood 公式估方差)。

中位生存时间 t50:使 S^(t50)=0.5 的时间。

⚠️ 不要混淆

  • "样本中 80 人活过 1 年"——只是观察比例
  • "1 年生存率估计为 80%"——必须用 KM(考虑删失)

8.4 寿命表(Life Table)

旧方法,用于:

  • 所有人观察周期相同
  • 数据按固定时间区间(0–1 年、1–2 年)汇总

假设删失在区间内均匀分布:

ni=niCi2S^(t)=i=1j(1dini)

KM vs 寿命表:

  • KM 用实际风险集大小;寿命表用平均
  • KM 间隔由事件时刻决定;寿命表间隔预先固定

9. Log-rank 检验(比较两组生存曲线)

9.1 思路

对每个未删失事件时刻 ti

  • 观察事件数 O1i(暴露组)
  • H0 下期望 E1i=(O1i+O2i)n1in1i+n2i(按风险集人数比例分配)

把所有事件时刻的 (OE) 求和,按其方差归一化得到 χ2

9.2 假设与等价名

H0:S1(t)=S2(t)t

别称:Mantel-Cox 检验,或 Mantel-Haenszel 应用于"在每个事件时刻分层"。

9.3 注意事项

  1. Log-rank 检验整条曲线,不是某一时间点。报告时不要写"6 个月生存率显著不同(log-rank p<0.05)"——应写"两组生存分布显著不同"。
  2. 多组:H0:S1==Sk。整体显著后,再做两两比较,注意多重比较修正
  3. 连续协变量:可分组(三/四分位)做 log-rank;更好用 Cox 回归保留原尺度。
  4. 比例风险时功效最高;曲线交叉时不灵敏。
  5. 功效主要由事件数决定,不是受试者数。

9.4 加权扩展

检验强调
Peto, Tarone-Ware早期差异
Prentice后期差异
Fleming-Harrington灵活加权

10. Cox 比例风险模型

10.1 风险函数(Hazard)

h(t)=limΔt0P(tT<t+ΔtTt)Δt

含义:"在 t 时仍存活的人,下一刻发生事件的瞬时速率"。

注意:

  • 速率(rate),可大于 1
  • 条件(仅对仍在风险中的人)

10.2 风险函数与生存函数

h(t)=ddtlnS(t),S(t)=exp(0th(u)du)

→ 高风险 ↔ 低生存(一一对应)。

指数分布特例h(t)=λ 常数 → S(t)=eλt


10.3 Cox PH 模型

h(tX)=h0(t)exp(β1X1++βpXp)
  • h0(t):基线风险函数(所有 X=0 时的风险),与时间有关形态不指定
  • 指数部分:协变量乘性效应
  • 没有截距 β0(被吸收进 h0

取对数:

lnh(tX)=lnh0(t)+β1X1++βpXp

10.4 系数解释:风险比(HR)

控制其他变量不变,X1 加 1 个单位:

h(tX1=x+1)h(tX1=x)=eβ1=HR
βHR含义
>0>1风险升高
=0=1无关
<0<1保护性

典型检验H0:HR=1(即 β=0)。


10.5 比例风险假设(Proportional Hazards Assumption)

h(tX1=x+1,)h(tX1=x,)=eβ1

HR 不随时间变化(即使 h(t) 本身随时间变)。

诊断:

  • 多组 KM 曲线大致平行
  • log[-log S(t)] vs log(t) 应大致平行
  • Schoenfeld 残差检验

PH 假设违反时:

  • 加入时间-协变量交互
  • 分层 Cox(不同基线 h0
  • 使用 Accelerated Failure Time (AFT) 模型

10.6 半参数模型

  • 参数部分β(协变量效应)
  • 非参数部分h0(t)(基线,形态不限)

估计

  • β偏似然(partial likelihood)最大化(Cox 1972)——不依赖 h0(t)
  • h0(t):仅在需要预测绝对风险时估计(如 Breslow 估计)

优雅的地方:在不假设基线分布的前提下,仍能精确估计 β


11. 生存研究的样本量与设计

11.1 关键事实

统计功效由事件数决定,而不是受试者数!

  • 大量删失会"浪费"样本量
  • 招募时间长 + 随访短 ≠ 招募时间短 + 随访长
  • 高发病率(如重症晚期癌)→ 短随访就够;低发病率 → 长随访

11.2 所需事件数公式

Schoenfeld(1981)等分配 n1=n2

d=4(zα/2+zβ)2[ln(HR)]2

Freedman(1982)

d=(zα/2+zβ)2(1+HR)2(1HR)2

通用:

1d1+1d2=[ln(HR)]2(zα/2+zβ)2

影响因素

  • 功效 1β ↑ → d
  • α ↓ → d
  • |lnHR| ↑(效应越大)→ d

11.3 由所需事件数 → 总样本量

N=dP(Event)

P(Event) 估计方法:

  1. 文献历史值 + 调整研究时长
  2. 假设指数生存:P(Event by t)=1eλt
  3. Lachin 近似(考虑招募 + 随访):
P(Event)=116[S¯(f)+4S¯(0.5a+f)+S¯(a+f)]

其中 a 招募期,f 招募结束后的随访期。


11.4 由中位生存反推 HR

指数模型下:

S(t50)=0.5λ=ln2t50

例:对照组中位 12 月,治疗组 18 月:

HR=λtrtλctrl=(ln2)/18(ln2)/12=1218=0.67

→ 治疗组风险下降 33%。


11.5 失访率修正

P(drop out) 为退出比例:

N=dP(Event)11P(drop out)

11.6 招募率(Accrual rate)

均匀招募:

N=accrual rate×a,a=Naccrual rate

例:30 事件、P(Event)=0.5N=60;3 人/月 → 招募 a=20 月;总时长 60 月 → 随访 f=40 月。

11.7 设计工作流

  1. 由 HR、power、α 算所需事件数 d(Schoenfeld 公式)
  2. 固定一项约束,反求另一项
    • 固定 N → 求 f(随访期)
    • 固定 T=a+f → 求 N=d/P(Event)
  3. 由招募率算招募期 a=N/rate

12. 决策树:生存分析方法选择

研究问题
├─ 比较单一组与已知率 → 单样本泊松/正态近似
├─ 比较两组发病率 → 双样本(IRR)
│   ├─ Var(A1) ≥ 5 → 正态近似 + 连续性校正
│   └─ Var(A1) < 5 → 精确二项
├─ 控制混杂变量 → 分层分析 + 同质性检验
├─ 全曲线比较 → Kaplan-Meier + Log-rank 检验
└─ 协变量调整 + 风险比 → Cox PH 回归

13. 公式速查

公式
发病率λ^=a/t
累积发病率1eλt;罕见时 λt
单样本卡方X2=(aμ0)2/μ0
IRR(a1/t1)/(a2/t2)
ln IRR 方差1/a1+1/a2
KM 估计S^(t)=(1di/ni)
Cox 模型h(tX)=h0(t)exp(βX)
风险比HR=eβj
所需事件数d=4(zα/2+zβ)2/[ln(HR)]2

14. 自测要点(Checklist)

人时数据

  • [ ] Incidence rate / Cumulative incidence / Prevalence 三者区别
  • [ ] 累积发病率 1eλt 的来源(泊松假设)
  • [ ] 单样本检验的大样本与精确法
  • [ ] 双样本检验中 p0=t1/(t1+t2) 的解释
  • [ ] IRR 的 Delta 方法、ln 尺度 CI 构造
  • [ ] 分层分析:综合 IRR 与同质性检验

生存数据基础

  • [ ] 生存时间三要素:事件、起点、单位
  • [ ] 删失类型与非信息性删失假设
  • [ ] 删失数据为何仍有用(t 的信息)
  • [ ] OS / PFS / DOR 的定义

KM 与 Log-rank

  • [ ] KM 公式与图形性质(仅事件下降,删失不变)
  • [ ] 中位生存时间的图解读法
  • [ ] 寿命表与 KM 的差别
  • [ ] Log-rank 检验整条曲线,不能解释为某点
  • [ ] 多组比较与多重比较修正
  • [ ] 比例风险时 log-rank 功效最高

Cox 回归

  • [ ] 风险函数定义、与生存函数的关系
  • [ ] 比例风险假设的几何含义
  • [ ] HR、β 的解释
  • [ ] 半参数模型与偏似然
  • [ ] PH 假设的诊断方式

研究设计

  • [ ] 功效由事件数决定的核心事实
  • [ ] Schoenfeld 公式的四个要素
  • [ ] 招募/随访/失访对样本量的影响
  • [ ] 由中位生存反推 HR

思考题

  1. 累积发病率与发病率的区别——为什么"5% 发病率"必须带时间单位?
  2. 一个 Cox 模型 HR=1.5(95% CI: 1.1–2.0),如何向非统计学家解释?
  3. 如果某药真有保护作用但研究功效不够,log-rank p=0.20,你能下"无效"的结论吗?
  4. 把 KM 图上"5 年生存率 70%"和 IRR 数据中"年发病率 0.06"做个换算,假设指数生存模型,看是否一致。
  5. 生存研究中"非信息性删失"假设若被违反(如治疗组重病人提前退出),会导致 HR 偏向哪个方向?