1 KM法计算生存率——非参数模型

乘积极限法适用于离散数据,它用于建立时刻 t t t 上的生存函数,根据 t t t 时刻之前的所有时期的生存概率的乘积,来估计时刻 t t t 的生存函数 S ( t ) S(t) S(t)和它的标准误 S E ( S ( t ) ) SE(S(t)) SE(S(t))
生存概率 P :观察对象活过某个时期的概率。
P = 1 − d / n P =1-d/n P=1d/n

  • d d d :期内死亡人数
  • n n n:期初观察人数

生存率 S ( t i ) \bf{S(t_i)} S(ti):观察对象从起始时刻 t 0 t_0 t0 t i t_i ti 时刻活过多个时期的概率。
S ^ ( t i ) = ∏ j = 1 i p j , j = 1 , 2 , ⋯   , i \hat{S}(t_i)=\prod_{j=1}^ip_j,\quad j=1,2,\cdots,i S^(ti)=j=1ipj,j=1,2,,i
生存率标准误:
S E ( S ^ ( t i ) ) = S ^ ( t i ) ∑ j = 1 i d j n j ( n j − d j ) , j = 1 , 2 , ⋯   , i SE(\hat{S}(t_i))=\hat{S}(t_i)\sqrt{\sum_{j=1}^i\frac{d_j}{n_j(n_j-d_j)}}\quad ,\quad j=1,2,\cdots,i SE(S^(ti))=S^(ti)j=1inj(njdj)dj ,j=1,2,,i
置信区间: 通常取 95% 置信区间 u α / 2 = 1.96 u_{\alpha/2}=1.96 uα/2=1.96
S ^ ( t i ) ± u α / 2 ⋅ S E ( S ^ ( t i ) ) \hat{S}(t_i)\pm u_{\alpha/2}\cdot SE(\hat{S}(t_i)) S^(ti)±uα/2SE(S^(ti))
实例:

  • 使用肺癌患者数据集,计算生存率。

    library(DT)
    library(survival) 
    datatable(lung)
    

    在这里插入图片描述
    数据集中time表示生存时间,status表示生存状态,1表示存活,为截尾数据,2表示死亡,为完整数据。
    用 survival 包来进行生存分析,survfit()函数计算生存率,surv()函数对生存时间进行排序,并将存活的患者生存时间改为截尾数据,用 + 号表示。

    fit = survfit(Surv(time,status)~1,data = lung) # ~1表示不对数据分组
    summary(fit)
    

    部分结果:
    在这里插入图片描述
    上图中:

    • time:生存时间
    • n.risk:期初观察人数
    • n.event:期内死亡人数
    • survival:生存率
    • std.err:生存率标准误
    • lower 95% CI:95% 置信区间下界
    • upper 95% CI:95% 置信区间上界

    可视化:

    library(survminer)
    ggsurvplot(fit,lung)
    

在这里插入图片描述

2 log-rank秩检验比较不同组的生存率

2.1 输入数据

取 lung 数据集前 20 行作为输入数据。

df = lung[1:20,]
head(df)
 inst time status age sex ph.ecog ph.karno pat.karno meal.cal wt.loss
1    3  306      2  74   1       1       90       100     1175      NA
2    3  455      2  68   1       0       90        90     1225      15
3    3 1010      1  56   1       0       90        90       NA      15
4    5  210      2  57   1       1       90        60     1150      11
5    1  883      2  60   1       0      100        90       NA       0
6   12 1022      1  74   1       1       50        80      513       0

2.2 建立假设

H 0 H_0 H0: 男性患者和女性患者的生存率相同
H 1 H_1 H1: 男性患者和女性患者的生存率不同
检验水准: α = 0.05 \alpha = 0.05 α=0.05

2.3 log-rank秩精确性检验

序号 时间(天) Male Female all_n all_d
n 1 i n_{1i} n1i d 1 i d_{1i} d1i T 1 i T_{1i} T1i n 2 i n_{2i} n2i d 2 i d_{2i} d2i T 2 i T_{2i} T2i n i n_i ni d i d_i di
1 61 15 0 0.75 5 1 0.25 20 1
2 71 15 1 0.7894737 4 0 0.2105263 19 1
3 88 14 1 0.7777778 4 0 0.2222222 18 1
4 144 13 1 0.7647059 4 0 0.2352941 17 1
5 166 12 1 0.75 4 0 0.2500000 16 1
6 170 11 1 0.7333333 4 0 0.2666667 15 1
7 210 10 1 0.7142857 4 0 0.2857143 14 1
8 218 9 1 0.6923077 4 0 0.3076923 13 1
9 306 8 1 0.6666667 4 0 0.3333333 12 1
10 310 7 0 0.6363636 4 1 0.3636364 11 1
11 361 7 0 0.7000000 3 1 0.3 10 1
12 455 7 1 0.7777778 2 0 0.2222222 9 1
13 567 6 1 0.7500000 2 0 0.2500000 8 1
14 613 5 1 0.7142857 2 0 0.2857143 7 1
15 654 4 0 0.6666667 2 1 0.3333333 6 1
16 707 4 1 0.8000000 1 0 0.2000000 5 1
17 728 3 0 0.7500000 1 1 0.25 4 1
18 883 3 1 1 0 0 0 3 1
19 1010 2 0 0 0 0 0 2 0
20 1022 2 0 0 0 0 0 2 0

卡方计算:
V k i = n k i n i ( 1 − n k i n i ) ( n i − d i n i − 1 ) d i χ 2 = 2 ⋅ ( ∑ d k i − ∑ T k i ) 2 ∑ V k i V_{ki}=\frac{n_{ki}}{n_i} (1-\frac{n_{ki}}{n_i}) (\frac{n_i-d_i}{n_i-1}) d_i \\[3ex] \chi^2=2\cdot \frac{(\sum{d_{ki}}-\sum{T_{ki}})^2}{\sum{V_{ki}}} Vki=ninki(1ninki)(ni1nidi)diχ2=2Vki(dkiTki)2

n1_i = c(15,15,14,13,12,11,10,9,8,7,7,7,6,5,4,4,3,3,2,2)
n_i = c(rev(2:20),2)
d_i = c(rep(1,18),rep(0,2))
T1_i = d_i/n_i*n1_i
d1_i = c(0,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,0,1,0,0)

sum1 = (sum(d1_i)-sum(T1_i))^2
sumVk = sum((n1_i/n_i)*(1 - n1_i/n_i) * (n_i- d_i)/(n_i-1) * d_i)

chisq = 2*sum1/sumVk
chisq
[1] 0.1138165

经过计算: χ 2 ≈ 0.1 \chi^2 \approx 0.1 χ20.1 ,查表得 P ≈ 0.8 P\approx 0.8 P0.8
通常用 survival 包中 survdiff()函数计算 P P P值:

survdiff(Surv(time,status)~sex,data = df)
Call:
survdiff(formula = Surv(time, status) ~ sex, data = df)
       N Observed Expected (O-E)^2/E (O-E)^2/V
sex=1 15       13    13.43    0.0140    0.0569
sex=2  5        5     4.57    0.0412    0.0569

 Chisq= 0.1  on 1 degrees of freedom, p= 0.8 

2.4 可视化

fit = survfit(Surv(time,status)~sex,data = df)
library(survminer)
ggsurvplot(fit, 
           data = df,
           #conf.int = TRUE,
           pval = TRUE,                     # logrank秩检验
           fun = "pct",                     # 生存率转换为百分数
           risk.table = TRUE,               # 添加风险表
           size = 1,
           linetype = "strata",
           palette = c("#E7B800","#2E9FDF"),
           legend = "bottom",
           legend.title = "Sex",
           legend.labs = c("Male","Female")) # 1代表Male,2代表Female

在这里插入图片描述
从上图可以看出男性和女性患者生存率并没有区别。

本博客内容将同步更新到个人微信公众号生信玩家。欢迎大家关注~~~
在这里插入图片描述

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐