forked from winterwang/LSHTMlearningnote
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path11-Survival-analysis.Rmd
2093 lines (1493 loc) · 102 KB
/
11-Survival-analysis.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
# (PART) 生存分析 survival analysis {-}
# 生存分析入門
> The best thing about being a statistician is that you get to play in everyone's backyard.
>
> --- John Tukey
## 什麼是生存分析
生存分析,研究的是隨訪中研究對象發生我們關心的事件與否,以及比較發生該事件之前時間的長短 (生存時間) 的一種分析方法。生存數據的常見例子如下:
- 死亡 (all cause);
- 診斷/治療後直至死亡發生的時間;
- 孕婦的懷孕時間 (孕期長短);
- 對象以健康狀態進入研究時開始,直至其診斷爲患有某種疾病的時間。
生存分析中的常見術語:
- 生存時間 survival time = 失敗時間 failure time = 事件時間 event time。
- 生存分析本身常被叫做事件史分析 time-to-event analysis。
生存分析的結果,可以用來回答很多我們關心的問題:
1. 研究特定人羣中,在某段時間內人口生存 (或死亡) 的模式 (平均壽命): 在英國,某年 (例如 1970 年) 出生的人,能夠生存到 5 歲,40 歲,100 歲的概率是多大? (關心的是死亡在某人身上發生的概率)
2. 比較兩組或多組人羣之間,不同的特徵導致的死亡時間的差異大小的估計: 某種新療法對於同時被診斷爲相同程度肺癌的患者,和標準療法相比是否能有效延長其生存時間?
3. 研究多種變量 (例如體重,年齡,性別,吸煙,飲食等) 和事件發生時間長短之間的關系: 例如收集健康對象,研究其體質指數 (BMI) 和最終發生二型糖尿病幾率之間的關系,同時要調整其他已知的混雜因素。
4. 預測特定患者的存活幾率: 肝癌患者診斷後的 5 年生存率,10 年生存率的推算。
## 生存數據在哪裏
生存數據其實很常見,下面是幾個例子:
1. 特定國家特定時間內對人口出生死亡的登記數據;
2. 在隨機雙盲對照臨牀試驗中,治療組和安慰劑組相比,治療組的生存時間是否真的較長;
3. 前瞻性隊列研究;
4. 非醫學的例子也有很多,例如分析暴風雪降臨之前的時間,或者推測地震可能發生的幾率。
## 生存數據分析之前要理清楚的問題
1. 對於結果/事件的定義;
2. 研究的時間起點;
3. 研究的時間單位是用的月份,周,還是年,是觀察時間,還是患者的實際年齡 (實際年齡就是實際生存時間);
4. 事件發生時的時間,是否被精確定義了?
## 生存數據的左右截尾
沒有哪個研究能保證觀察隨訪到所有的研究對象最終是否發生了事件 (死亡),有些對象在研究中途就會退出實驗。所以這些沒有觀察到事件發生,但是在研究的過程中貢獻了生存時間數據的對象,被稱爲刪失數據 (censored)。刪失數據又根據其發生原因的不同被分爲下面幾種:
1. **行政刪失 (administrative censoring)**: 如果最終事件,被定義爲死亡的話,研究者不大可能等到所有的觀察對象都死亡 (可能耗時幾十年) 之後再分析數據,而是認爲地定義某個時間點作爲研究結束,不再隨訪的時間。
2. **隨訪失敗 (loss to follow-up)**: 無論是幹預型實驗,還是觀察性實驗,有些觀察對象中途無法聯系上,或者改變主義推出實驗的人並不少見。這些對象的出現都意味着研究者無法再對他們進行事件發生與否的觀察了。
3. **死於其他原因 (death from other causes)**: 可能某些研究只關心患者吸煙習慣與死於肺癌的時間長短的關系,當某些觀察對象確實發生了死亡事件,但是死因並不是肺癌時 (肝癌,或者自殺,車禍等),這些人也被認爲是刪失數據。
上述幾種可能發生的刪失數據,這幾種類型的刪失數據,被叫做**右側刪失數據 (right censoring),在分析中不能被刪除,因爲他們在未離開研究之前,我們確定他們是沒有發生事件的,他們的觀察時間也應當被放入統計模型中加以考慮。**
### 左側截尾數據 left-truncation
左側截尾現象,又被叫做**延時進入 (delayed entry)**: 由於觀察對象實際進入研究時的年齡各不相同,對所有人的觀察時間,都從出生日開始算起的研究,實施難度極大。此時,應當注意把進入研究之前的生存時間 (進入實驗時的年齡),考慮進來,因爲這些人至少活到了進入研究的年齡。這也是一種生存偏倚現象,因爲人羣中被觀察到的人,只是一小部分樣本,所以把所有人都當作相同概率進入研究是不恰當的,有許多對象沒有活到進入研究的時間。
## 初步分析生存數據
生存數據,比較的是生存時間。由於時間本身是連續型變量,我們可能會想到利用處理連續型變量時的方法來進行初步的比較:
1. 每個人生存時間的柱狀圖 (histogram);
2. 計算生存時間的簡單統計量: 中位數 (median)。
即使是拿穩健統計學方法比較治療組和對照組的中位數是否不同,也無法解決刪失數據的問題。我們需要新的方法來處理生存數據。
## 初步描述生存數據
描述生存數據的統計學正式方案是:
1. 生存方程 the survival function
2. 風險度方程和累積風險度 the hazard function and the cumulative hazard
3. 概率密度方程 the probability density function
### 生存方程
生存方程的定義是,觀測生存時間 $T$,大於某個時間 $t$ 的概率:
$$
S(t) = \text{Pr}(T > t)
$$
累計概率方程是
$$
F(t) = \text{Pr}(T \leqslant t) = 1 - S(t)
$$
### 風險度方程
風險度有時候就只叫做風險 (hazard),時間 $t$ 時的風險度爲 $h(t)$。風險度方程被定義爲:
$$
h(t) = \lim_{\delta\rightarrow0}\frac{1}{\delta}\text{Pr}(t\leqslant T < t + \delta | T\geqslant t)
$$
風險度利用的是數學中的極限理論,表示在時間 $t$ 和時間 $t+\delta$ (其中$\delta \rightarrow 0$) 之間,觀察對象沒有發生事件的概率。風險度的概念明白了以後,風險度在時間軸上的積分,就被叫做**累積風險度**:
$$
H(t) = \int_0^th(u)\text{d}u
$$
### 概率密度方程
和其他的方程類似,常用 $f(t)$ 標記生存時間的概率密度方程:
$$
f(t) = \frac{\text{d}}{\text{d}t}F(t) = \lim_{\delta\rightarrow0}\frac{1}{\delta}\text{Pr}(t\leqslant T < t + \delta)
$$
### 各方程之間的關系
$$
\begin{aligned}
f(t) & = \frac{\text{d}}{\text{d}t}F(t) = \frac{\text{d}}{\text{d}t}\{ 1-S(t) \} = - \frac{\text{d}}{\text{d}t}S(t) \\
S(t) & = 1 - F(t) = 1 - \int_0^t f(u)\text{d}u = \int_t^\infty f(u)\text{d}u \\
h(t) & = \lim_{\delta\rightarrow0}\frac{1}{\delta}\text{Pr}(t \leqslant T < t+ \delta | T > t) \\
& = \lim_{\delta\rightarrow0}\frac{1}{\delta}\frac{\text{Pr}(t \leqslant T < t+ \delta, T > t)}{\text{Pr}(T > t)} (\text{Bayes' Theroem}) \\
& = \lim_{\delta\rightarrow0}\frac{1}{\delta}\frac{\text{Pr}(t \leqslant T < t+ \delta)}{\text{Pr}(T > t)} \\
& = \frac{f(t)}{S(t)} \\
h(t) & = \frac{f(t)}{S(t)} = \frac{\frac{\text{d}}{\text{d}t}F(t)}{S(t)} = \frac{- \frac{\text{d}}{\text{d}t}S(t)}{S(t)} = - \frac{\text{d}}{\text{d}t}\text{log}[S(t)] \\
\end{aligned}
$$
**推導** $S(t), H(t)$ 之間的關系:
$$
\begin{aligned}
\because h(t) & = - \frac{\text{d}}{\text{d}t}\text{log}[S(t)] \\
\text{intergrate both} & \text{ sides over the range from 0 to }t: \\
\int_0^th(u)\text{d}u & = - \int_0^t\frac{\text{d}}{\text{d}u}\text{log}[S(t)]\text{d}u \\
& = -[\text{log } S(u)]_{u = 0}^{u = t} \\
& = -[\text{log } S(t) - \text{log } S(0)] \\
& = -\text{log }S(t) \\
\Rightarrow S(t) & = \exp\{ - \int_0^th(u)\text{d}u\} = \exp\{ -H(t) \}
\end{aligned}
$$
## 生存時間的參數分布
### 指數分布
適用於生存時間最簡單的分布是指數分布 (exponentiential distribution)。指數分布默認風險率 (hazard rate,$\lambda$) 不隨時間變化。在指數分布中,風險度方程,生存方程和概率密度方程分別是:
$$
\begin{aligned}
h(t) & = \lambda, \\
S(t) & = e^{-\lambda t} \\
f(t) & = h(t)S(t) \\
& = \lambda e^{-\lambda t}
\end{aligned}
(\#eq:survival01-11)
$$
```{r Surv-fig1-4, echo=FALSE, fig.asp=.7, fig.width=4, fig.cap='The hazard function, survivor function and probability density function under an exponential distribution for survival times', fig.align='center', out.width='90%', cache=TRUE}
knitr::include_graphics("img/Selection_117.png")
```
### Weibull 分布
指數分布的前提 -- 事件發生率相同的假設過於強硬,許多真實數據,都不能滿足這個前提條件。另一個比指數分布靈活的分布是 Weibull 分布。它包含兩個參數,其風險度方程,生存方程和概率密度方程分別是:
$$
\begin{aligned}
h(t) & = \kappa\lambda t^{\kappa - 1} \\
S(t) & = \exp(-\lambda t^\kappa) \\
f(t) & = \kappa \lambda t^{\kappa - 1} \exp(-\lambda t^\kappa)
\end{aligned}
(\#eq:survival01-12)
$$
```{r Surv-fig1-6, echo=FALSE, fig.asp=.7, fig.width=4, fig.cap='Illustrations of the hazard function under a Weibull distribution with different shape (kappa) and scale (lambda).', fig.align='center', out.width='90%', cache=TRUE}
knitr::include_graphics("img/Selection_118.png")
```
```{r Surv-fig1-7, echo=FALSE, fig.asp=.7, fig.width=4, fig.cap='Illustrations of the survival function and probability function under a Weibull distribution with different shape (kappa) and scale parameter lambda = 0.2.', fig.align='center', out.width='90%', cache=TRUE}
knitr::include_graphics("img/Selection_119.png")
```
當 $\kappa = 1$ 時,Weibull 分布就降級爲簡單指數分布。從圖中也可以看出,**Weibull 分布只允許風險度隨着時間單調遞增/遞減**。
除了這兩個常見的生存時間分布,另外還有許多不同類型的分布。練習題中也會再探索 log-logistic 分布的應用。
## 極大似然法估計
假設,我們決定使用上面描述的簡單分布 - 指數分布來做爲生存時間的分布。接下來,就可以利用學習過的統計推斷的知識,對其做極大似然估計。
假設 $n$ 名研究對象編號各自爲 $i = 1, \cdots,n$,研究者對他們完成了從起點時間 (time origin) 起的隨訪。有些人發生了相關事件 (Event),所以,他們的生存時間 $t_{E_i}$。有些人則由於各種原因變成了刪失值,他們的生存時間是 $t_{C_i}$。關於刪失對象我們確切知道在時間 $t_{C_i}$ 之內,他們沒有發生相關事件,且他們退出研究之後是否發生了事件不得而知。我們再根據觀察對象是否發生相關事件,在模型中生成一個啞變量 $\delta_i$,當 $\delta_i = 1$ 時,該對象的觀察生存時間是 $t_{E_i}$,當 $\delta_i = 0$ 時,該對象的觀察生存時間就是 $t_{C_i}$:
$$
\delta_{i}=\left\{ \begin{array}{ll}
1 \text{ if } t_{E_i} \text{ observed} \\
0 \text{ if } t_{C_i} \text{ observed}\\ \end{array} \right.
t_{i}=\left\{ \begin{array}{ll}
t_{E_i} \text{ if } \delta_i = 1 \\
t_{C_i} \text{ if } \delta_i = 0 \\ \end{array} \right.
$$
```{r Surv01tab00, echo=FALSE, cache=TRUE, eval=FALSE}
dt <- read.csv("backupfiles/Survtab0101.csv", header = T)
#names(dt) <- c("Model with", "sigma_u", "sigma_e", "sigma_u", "sigma_e")
kable(dt, "html", align = "l", caption = "表 71.1: Data on survival and censoring times for n individuals") %>%
kable_styling(bootstrap_options = c("striped", "bordered"),full_width = F, position = "center") #%>%
#add_header_above(c("Level" = 2))
```
<table class="table table-striped table-bordered" style="width: auto !important; margin-left: auto; margin-right: auto;">
<caption>表 71.1: Data on survival and censoring times for n individuals</caption>
<thead>
<tr>
<th style="text-align:left;"> Individual </th>
<th style="text-align:left;"> Survival or censoring time </th>
<th style="text-align:left;"> Indicator of outcome or censoring </th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left;"> $1$ </td>
<td style="text-align:left;"> $t_1$ </td>
<td style="text-align:left;"> $\delta_1$ </td>
</tr>
<tr>
<td style="text-align:left;"> $2$ </td>
<td style="text-align:left;"> $t_2$ </td>
<td style="text-align:left;"> $\delta_2$ </td>
</tr>
<tr>
<td style="text-align:left;"> $3$ </td>
<td style="text-align:left;"> $t_3$ </td>
<td style="text-align:left;"> $\delta_3$ </td>
</tr>
<tr>
<td style="text-align:left;"> . </td>
<td style="text-align:left;"> . </td>
<td style="text-align:left;"> . </td>
</tr>
<tr>
<td style="text-align:left;"> . </td>
<td style="text-align:left;"> . </td>
<td style="text-align:left;"> . </td>
</tr>
<tr>
<td style="text-align:left;"> . </td>
<td style="text-align:left;"> . </td>
<td style="text-align:left;"> . </td>
</tr>
<tr>
<td style="text-align:left;"> $n$ </td>
<td style="text-align:left;"> $t_n$ </td>
<td style="text-align:left;"> $\delta_n$ </td>
</tr>
</tbody>
</table>
對於那些觀察到事件的人,他們各自對似然的貢獻是 $f(t_{E_i})$; 對於那些成爲刪失值的人,他們各自對似然的貢獻是 $S(t_{C_i})$,所以該數據的似然就是:
$$
\begin{aligned}
L & = \prod_{\text{Events}}f(t_{E_i})\prod_{\text{Censorings}}S(t_{C_i}) \\
& = \prod_i f(t_i)^{\delta_i} S(t_i)^{1-\delta_i} \\
& = \prod_i \{ h(t_i)S(t_i) \}^{\delta_i}S(t_i)^{1-\delta_i} \text{ because } h(t) = \frac{f(t)}{S(t)} \\
& = \prod_i h(t_i)^{\delta_i} S(t_i)
\end{aligned}
$$
極大似然法對各個參數的估計就可以用我們在統計推斷中使用的求對數極大似然的方法:
$$
\begin{aligned}
\ell & = \sum_i[\delta_i\text{log}f(t_i) + (1-\delta_i)\text{log}S(t_i)] \\
& = \sum_i\{\delta_i\text{log}(\lambda e^{-\lambda t_i}) + (1-\delta_i)\text{log}(e^{-\lambda t_i}) \} \\
& = \sum_i\{ \delta_i\text{log}\lambda - \delta_i\lambda t_i -\lambda t_i + \delta_i\lambda t_i \} \\
& = \sum_i[\delta_i \text{log}\lambda - \lambda t_i] \\
& = \sum_i\delta_i\text{log}\lambda - \lambda\sum_it_i \\
\Rightarrow \ell^\prime & = \frac{\sum_i\delta_i}{\lambda} - \sum_i t_i \\
\text{let } \ell^\prime & =0 \Rightarrow \hat\lambda = \frac{\sum_i\delta_i}{\sum_i t_i}\\
\text{Because }\ell^{\prime\prime} & = -\frac{\sum_i\delta_i}{\lambda^2} < 0 \\
\text{Therefore } \hat\lambda & = \frac{\sum_i\delta_i}{\sum_it_i} \\
\text{ is the MLE for} & \text{ survival time follows exponential distribution.}
\end{aligned}
$$
## Practical Survival 01
### 生存分析的時間尺度
#### 把 PBC 數據讀入 R 中,`d, time, datein, dateout` 是什麼含義?
```{r SurvPrac01-01, cache=TRUE}
pbcbase <- read_dta("backupfiles/pbcbase.dta")
# d 是表示是否發神事件的變量
# d = 0 表示該觀察對象是刪失值
# d = 1 表示該觀察對象在研究隨訪中死亡
# datein 是該觀察對象進入臨牀試驗的日期
# dateout 是該觀察對象發生死亡事件/變成刪失值的日期
# time 是從進入臨牀試驗到發生死亡時間或者變成刪失值這段時間的長度,以年爲單位
head(pbcbase[,1:5])
```
#### 你認爲該研究應該使用哪種時間尺度?
這是一個比較兩種治療方案哪個更能延長患者生命時間的臨牀實驗,正確的時間尺度應該是從進入試驗開始,直至發生事件 (死亡) 或者離開試驗的這段時間 (隨訪時間 follow-up time)。
#### 試驗中,多少患者發生了死亡事件,又有多少患者是刪失值?
```{r SurvPrac01-02, cache=TRUE}
# 患者中 96 人 (50.3%) 發生了死亡事件; 95 人是刪失值。
with(pbcbase, tab1(d, graph = FALSE))
# 第一例死亡發生在隨訪開始的 0.025 年,最後一例死亡發生在隨訪開始的 9.26 年;
# 所有對象中隨訪時間最長達到 11.64 年。
# 死亡事件發生的病例中,隨訪時間的中位數是 2.85 年
# 刪失對象的病例中,隨訪時間的中位數是 4.62 年。
with(pbcbase, summ(time[d==1], graph = FALSE))
with(pbcbase, summ(time[d==0], graph = FALSE))
```
#### 讀入另一個數據 `whitehall.csv`,使用是否發生冠心病 `chd` 變量作爲事件變量。仔細觀察其時間的格式,`timein, timeout, timebth`,各自是什麼含義?1987 年 1 月 30 日發生了什麼事件?
```{r SurvPrac01-03, cache=TRUE, message=FALSE}
whitehall <- read_dta("backupfiles/whitehall.dta")
# timebth 是每個患者的出生日期
# timein 是每個患者進入試驗的日期,且注意到許多患者的進入試驗日期是相同的
# timeout 是隨訪結束的日期,對於 chd = 1 的人,這個日期是其死於冠心病的日期,
# 其餘的人則是刪失日期,且注意到許多刪失日期都是1987年1月30日,推測這是行政刪失日期。
whitehall[,c(1,3,12:14)]
```
#### 應該使用哪種時間尺度作爲此研究的時間呢?
很顯然,本實驗可以使用隨訪時間,作爲時間尺度。當然,考慮到不同的人進入實驗時的年齡不同,也可以用隨訪年齡作爲時間尺度。需要注意的是,如果使用年齡作爲時間尺度,不能使用 `timeout - timebth` 也就是隨訪結束減去出生日期作爲時間變量。因爲這樣的做法默認了所有人從出生時,就進入了實驗,這是無論如何也無法做到的。所以我們要用下面的第二個計算時間的代碼 `M1`,來考慮進入實驗時的年齡。因爲,進入實驗時,該觀察對象沒有發生事件,這已經是一個生存偏倚,需要告訴軟件加以考慮。注意比較三種方法計算的時間的最小值最大值的差別。
```{r SurvPrac01-04, cache=TRUE}
# 用隨訪時間做時間尺度
M0 <- survfit(Surv(time = (timeout - timein)/365.25, event = chd)~1, data = whitehall)
summ(M0$time, graph = FALSE)
# 考慮了左側截尾的時間尺度
M1 <- survfit(Surv(agein, agein + (timeout - timein)/365.25, event = chd) ~ 1, data = whitehall)
summ(M1$time, graph = FALSE)
# 錯誤地認爲所有人都從出生日期開始進入試驗的時間尺度
M2 <- survfit(Surv((timeout - timebth)/365.25, event = chd) ~ 1, data = whitehall)
summ(M2$time, graph = FALSE)
```
### 擬合最簡單的指數分布生存數據
```{r SurvPrac01-05, cache=TRUE, message=FALSE}
mydata <- read_csv("backupfiles/surv_data_practical1.csv")
mydata
exp.model <- survreg(Surv(surv.times) ~ 1, dist = "exponential", data = mydata)
# 值得注意的是,在 R 裏擬合指數分布的生存數據時,計算獲得的是 -log(lambda)
summary(exp.model)
# 風險度比 HR
exp(-exp.model$coefficients)
# HR 的 95% 信賴區間
exp(-exp.model$coefficients - 1.96*summary(exp.model)$table[2])
exp(-exp.model$coefficients + 1.96*summary(exp.model)$table[2])
```
### 探索服從 Weibull 分布時風險度方程的曲線
```{r SurvPrac01-06, cache=TRUE, echo=TRUE, fig.height=5, fig.width=6, fig.cap='Illustrations of the hazard function under a Weibull distribution with lambda = 0.2, and different shape (kappa)', fig.align='center', out.width='80%', message=FALSE, warning=FALSE}
wei.haz <- function(x, lambda, kappa) {
kappa*lambda*x^(kappa - 1)
}
curve(wei.haz(x, 0.2, 0.5), ylim = c(0,0.8), xlab = "Time", ylab = "Hazard function")
curve(wei.haz(x, 0.2, 1.5), add = TRUE, col = "blue")
curve(wei.haz(x, 0.2, 1), add = TRUE, lty = 2)
curve(wei.haz(x, 0.2, 2), add = TRUE, col = "red")
curve(wei.haz(x, 0.2, 5), add = TRUE, col = "green")
```
在 Weibull 分布下,參數 $\kappa$ 決定了風險度曲線的形狀。 $\kappa < 1$ 時,風險度隨着時間下降,$\kappa > 1$ 時,風險度隨着時間上升。當 $\kappa = 1$ 時,Weibull 分布降級爲簡單的指數分布 (圖中點狀直線)。當 $\kappa = 2$ 時,風險度和時間成線性關系。
### 探索 對數邏輯 (log-logistic) 分布時,風險度方程曲線會有哪些特性?
$$
h(t) = \frac{e^\theta \kappa t^{\kappa -1}}{1 + e^\theta t^\kappa}
$$
```{r SurvPrac01-07, cache=TRUE, echo=TRUE, fig.height=5, fig.width=6, fig.cap='Illustrations of the hazard function under a log-logistic distribution with different theta, and different shape (kappa)', fig.align='center', out.width='80%', message=FALSE, warning=FALSE}
loglog.haz <- function(x, theta, kappa) {
exp(theta)*kappa*x^(kappa - 1)/(1 + exp(theta)*x^kappa)
}
curve(loglog.haz(x, 1, 0.2), ylim=c(0,6), xlab = "Time", ylab = "Hazard function", col = "red")
curve(loglog.haz(x, 1, 2), add = T, col = "black")
curve(loglog.haz(x, 3, 2), add = T, col = "blue")
```
在 Weibull 分布下,風險度只能隨着時間單調遞增或者遞減。但是,在對數邏輯分布下,風險度就可以跟隨時間有增有減。
# 非參數法分析生存數據 {#nonparametric}
## 生存分析中的非參數分析法
非參數法分析生存數據其實是所有人在分析生存數據時應該着手做的第一件事。
- 非參數法可以對生存時間不必進行任何參數分布 (parametric assumption) 的假設,初步地估計生存方程和累積風險度方程;
- 使用非參數法可以用生存曲線圖的方式直觀地展示生存數據,包括刪失值在數據中的存在也可以通過圖表來表現出來;
- 非參數法可以初步地對不同組/羣之間生存曲線的變化進行比較;
- 通過非參數法對生存數據進行初步分析之後,可以對接下來的生存數據建模過程提供有參考價值的背景信息。
## Kaplan-Meier 法分析生存方程
### 當數據中沒有刪失值
如果,研究對象裏的每個人都發生了事件,那麼研究對象裏的每個人身上都觀察到了生存時間,自然而然地特定時間 $t$ 時的生存方程是:
$$
\hat{S}(t) = \frac{\text{number of individuals with survival time} > t}{\text{total number of individuals}}
$$
在每個觀察到事件的時間點 $t_1 < t_2 < t_3 < \cdots < t_K$,我們可以計算該時間點的生存方程,然後假定兩個事件的時間點之間的生存概率保持不變,就可以繪制出一個階梯形狀的生存曲線。
### 當數據中有刪失值
前一小節提到的非參數法繪制生存時間曲線的方法,其實完全可以拓展到含有刪失值的生存數據中。同樣地,用 $t_1 < t_2 < t_3 < \cdots < t_K$ 表示**發生事件的觀察對象的生存時間**。我們可以用以下的步驟來拓展生存時間曲線的繪制思路:
1. 首先定義 $h_j$ 作爲時間 $t_j$ 時期的風險率 (hazard rate),那麼每個發生事件的對象的風險和生存時間就有了各自的關聯 $h_1, h_2, \cdots, h_k$;
2. 在時間點 $t_1$ 時,隊列中的全部對象中,沒有發生事件的概率是 $1-h_1$;
3. 在時間點 $t_2$ 時,隊列中的全部對象中,在時間 $t_1, t_2$ 時都沒有發生事件的概率是 $(1-h_1)(1-h_2)$;
4. 所以,生存方程就是,任何一個人,在任何一個時間點,在隊列中,且不發生事件的概率 $$S(t_j) = \prod_{k=1}^j(1-h_k)$$
此時,每個時間點風險度方程的無偏估計爲,該時間點中在隊列中發生事件的人數 $d_j$ 除以當時在隊列中的人數 $n_j$:
$$
\hat h_j = \frac{d_j}{n_j}
$$
用上面的這些初步結果,可以推導出在時間點 $t_j$ 時,隊列中的生存方程是:
$$
\hat S(t_j) = \prod_{k=1}^j (1-\hat h_k) = \prod_{k=1}^j ( 1- \frac{d_k}{n_k})
$$
它的更加一般化形式就是我們常常念叨的那個**生存方程的 Kaplan-Meier 估計量**,它的別名是 "the product limit estimate":
$$
\begin{equation}
\hat S(t) = \prod_{j|t_j \leqslant t} (1 - \frac{d_j}{n_j})
\end{equation}
(\#eq:surv-2-6)
$$
**例子:** 下表羅列了某個白血病患者治療組生存數據的 Kaplan-Meier 生存方程估計和他們的計算過程,其中值得注意的是,如果生存表格中某時間點 (年或月或日,取決於你的研究使用的時間刻度) 同時有事件 (event) 和刪失 (censoring),習慣上是默認刪失發生在事件發生之前:
```{r Surv02tab00, echo=FALSE, cache=TRUE, eval=FALSE}
dt <- read.csv("backupfiles/surv_example2-2.csv", header = T)
names(dt) <- c("Survival time and censoring time", "Number at risk", "Number of events", "Number of censorings", "S(t)")
kable(dt, "html", align = "l", caption = "表 72.1: Time to remission for leukaemia patients in the treatment group: Kaplan-Meier estimates of the survivor function") %>%
kable_styling(bootstrap_options = c("striped", "bordered"),full_width = F, position = "center") #%>%
#add_header_above(c("Level" = 2))
```
<table class="table table-striped table-bordered" style="width: auto !important; margin-left: auto; margin-right: auto;">
<caption>表 72.1: Time to remission for leukaemia patients in the treatment group: Kaplan-Meier estimates of the survivor function</caption>
<thead>
<tr>
<th style="text-align:left;"> Survival time $(t_j)$ and censoring time </th>
<th style="text-align:left;"> Number at risk </th>
<th style="text-align:left;"> Number of events </th>
<th style="text-align:left;"> Number of censorings </th>
<th style="text-align:left;"> $\hat{S}(t_j)$ </th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left;"> 6 </td>
<td style="text-align:left;"> 21 </td>
<td style="text-align:left;"> 3 </td>
<td style="text-align:left;"> 1 </td>
<td style="text-align:left;"> (1-3/21) = 0.857 </td>
</tr>
<tr>
<td style="text-align:left;"> 7 </td>
<td style="text-align:left;"> 17 </td>
<td style="text-align:left;"> 1 </td>
<td style="text-align:left;"> 0 </td>
<td style="text-align:left;"> (1-3/21)(1-1/17) = 0.807 </td>
</tr>
<tr>
<td style="text-align:left;"> 9 </td>
<td style="text-align:left;"> 16 </td>
<td style="text-align:left;"> 0 </td>
<td style="text-align:left;"> 1 </td>
<td style="text-align:left;"> -- </td>
</tr>
<tr>
<td style="text-align:left;"> 10 </td>
<td style="text-align:left;"> 15 </td>
<td style="text-align:left;"> 1 </td>
<td style="text-align:left;"> 1 </td>
<td style="text-align:left;"> (1-3/21)(1-1/17)(1-1/15) = 0.753 </td>
</tr>
<tr>
<td style="text-align:left;"> 11 </td>
<td style="text-align:left;"> 13 </td>
<td style="text-align:left;"> 0 </td>
<td style="text-align:left;"> 1 </td>
<td style="text-align:left;"> -- </td>
</tr>
<tr>
<td style="text-align:left;"> 13 </td>
<td style="text-align:left;"> 12 </td>
<td style="text-align:left;"> 1 </td>
<td style="text-align:left;"> 0 </td>
<td style="text-align:left;"> 0.69 </td>
</tr>
<tr>
<td style="text-align:left;"> 16 </td>
<td style="text-align:left;"> 11 </td>
<td style="text-align:left;"> 1 </td>
<td style="text-align:left;"> 0 </td>
<td style="text-align:left;"> 0.627 </td>
</tr>
<tr>
<td style="text-align:left;"> 17 </td>
<td style="text-align:left;"> 10 </td>
<td style="text-align:left;"> 0 </td>
<td style="text-align:left;"> 1 </td>
<td style="text-align:left;"> -- </td>
</tr>
<tr>
<td style="text-align:left;"> 19 </td>
<td style="text-align:left;"> 9 </td>
<td style="text-align:left;"> 0 </td>
<td style="text-align:left;"> 1 </td>
<td style="text-align:left;"> -- </td>
</tr>
<tr>
<td style="text-align:left;"> 20 </td>
<td style="text-align:left;"> 8 </td>
<td style="text-align:left;"> 0 </td>
<td style="text-align:left;"> 1 </td>
<td style="text-align:left;"> -- </td>
</tr>
<tr>
<td style="text-align:left;"> 22 </td>
<td style="text-align:left;"> 7 </td>
<td style="text-align:left;"> 1 </td>
<td style="text-align:left;"> 0 </td>
<td style="text-align:left;"> 0.538 </td>
</tr>
<tr>
<td style="text-align:left;"> 23 </td>
<td style="text-align:left;"> 6 </td>
<td style="text-align:left;"> 1 </td>
<td style="text-align:left;"> 0 </td>
<td style="text-align:left;"> 0.448 </td>
</tr>
<tr>
<td style="text-align:left;"> 25 </td>
<td style="text-align:left;"> 5 </td>
<td style="text-align:left;"> 0 </td>
<td style="text-align:left;"> 1 </td>
<td style="text-align:left;"> -- </td>
</tr>
<tr>
<td style="text-align:left;"> 32 </td>
<td style="text-align:left;"> 4 </td>
<td style="text-align:left;"> 0 </td>
<td style="text-align:left;"> 2 </td>
<td style="text-align:left;"> -- </td>
</tr>
<tr>
<td style="text-align:left;"> 34 </td>
<td style="text-align:left;"> 2 </td>
<td style="text-align:left;"> 0 </td>
<td style="text-align:left;"> 1 </td>
<td style="text-align:left;"> - </td>
</tr>
<tr>
<td style="text-align:left;"> 35 </td>
<td style="text-align:left;"> 1 </td>
<td style="text-align:left;"> 0 </td>
<td style="text-align:left;"> 1 </td>
<td style="text-align:left;"> - </td>
</tr>
</tbody>
</table>
## Kaplan-Meier 數據的不確定性
**Greenwood's 公式的推導:**
如何推導獲得生存估計 $\hat{S}(t_j)$ 的方差呢?
利用方程 \@ref(eq:surv-2-6) 的對數:
$$
\begin{aligned}
\text{Var}\{ \text{log}\hat{S}(t) \} & = \text{Var}\{ \text{log}\prod_{j|t_j \leqslant t} (1 - \hat{h}_j)\} \\
& = \text{Var}\{ \sum_{j|t_j \leqslant t} \text{log}(1-\hat{h}_j)\} \\
& = \sum_{j|t_j \leqslant t}\text{Var}\{ \text{log}(1-\hat{h}_j) \}
\end{aligned}
$$
接下來利用線性近似原則 (linear approximation),也就是英国数学家**[泰勒的一次近似泰勒展开法 (first order Taylor series approximation)](https://zh.wikipedia.org/wiki/%E6%B3%B0%E5%8B%92%E7%BA%A7%E6%95%B0):**
$$
\begin{equation}
\text{log} (1-\hat{h}_j) \approx \text{log}(1-h_j) + (\hat{h}_j - h_j)/(1-h_j)
\end{equation}
(\#eq:surv2-7)
$$
這個近似公式可以讓我們得到其方差爲:
$$
\text{Var}\{ \text{log}(1-\hat{h}_j) \} \approx \frac{\text{Var}(\hat{h}_j)}{(1-h_j)^2}
$$
这个就是大名鼎鼎的 **[Delta 法](https://cran.r-project.org/web/packages/modmarg/vignettes/delta-method.html)**。
接下來需要推導風險 (hazard) $\hat{h}_j$ 的方差,注意,在時間 $t_j$ 時, 事件發生次數 $d_j$ 其實是服從如下的二項分布:
$$
d_j \sim \text{Binomial}(n_j, h_j)
$$
所以,
$$
\text{Var}(\hat{h}_j) = \frac{\text{Var}(d_j)}{n_j^2}
$$
根據伯努利分布 \ref{bernoulli} 和二項分布 \ref{binomial} 的性質:
$$
\text{Var}(\hat{h}_j) = \frac{\text{Var}(d_j)}{n_j^2} = \frac{n_jh_j(1-h_j)}{n_j^2} = \frac{h_j(1-h_j)}{n_j}
$$
綜上可得:
$$
\text{Var}\{ \text{log}(\hat{S}(t)) \} = \sum_{j|t_j \leqslant t}\frac{h_j}{n_j(1-h_j)}
$$
這裏再對 $\log(\hat{S}(t))$ 用一次線性近似:
$$
\log\hat{S}(t) \approx \log S(t) + \frac{\hat{S}(t) - S(t)}{S(t)}
$$
所以其實
$$
\text{Var}\{ \log (\hat{S}(t)) \} = \frac{\text{Var}\{ \hat{S}(t) \}}{S(t)^2}
$$
最終我們獲得 Greenwood's 公式:
$$
\begin{equation}
\text{Var}\{ \hat{S}(t) \} = \hat{S}(t)^2\sum_{j|t_j \leqslant t}\frac{h_j}{n_j(1-h_j)}
\end{equation}
(\#eq:surv2-14)
$$
獲得生存方程的方差以後,接下來就是 95% 信賴區間的推導:
$$
\hat{S}(t) \pm 1.96 \sqrt{\text{Var}\{ \hat{S}(t) \}}
$$
這裏獲得的 Kaplan-Meier 信賴區間是沒有錯的,但是在某些較爲極端的生存數據中 (時間接近 0, 或者時間接近追蹤結束),這個公式可能導致計算獲得的信賴區間超過 $(0,1)$。因爲這裏我們假定的是生存概率近似服從正態分布時,才能使用的信賴區間公式。另一個改良版本的區間公式可以避免出現不正常的信賴區間。它需要對生存數據進行數學轉換。常用的生存數據的數學轉換是 $\log\{-\log \hat{S}(t) \}$。利用上面推導 Greenwood's 公式 \@ref{eq:surv2-14} 時相似的過程,我們可以獲得該轉換過後的方差是:
$$
\begin{equation}
\text{Var}\{ \log\{-\log \hat{S}(t)\} \} \approx \frac{\text{Var}\{\log\hat{S}(t) \}}{\{ \log S(t) \}^2}
\end{equation}
(\#eq:surv2-16)
$$
如果使用 $v^2(t)$ 來標記上式 \@ref{eq:surv2-16} 時,有
$$
\begin{aligned}
\log\{- \log \hat{S}(t) \} - 1.96v(t) & < \log\{-\log S(t) \} < \log\{- \log \hat{S}(t) \} + 1.96v(t) \\
\text{Taking the exponential:} & \\
\{ -\log \hat{S}(t) \} \exp(-1.96v(t)) & < -\log S(t) < \{ -\log \hat{S}(t) \} \exp(1.96v(t)) \\
\text{Multiply everything by } & -1: \\
\{ \log \hat{S}(t) \} \exp(1.96v(t)) & < \log S(t) < \{ \log \hat{S}(t) \} \exp(-1.96v(t)) \\
\text{Take the exponential again:} & \\
\hat{S}(t)^{\exp(1.96v(t))} & < S(t) < \hat{S}(t)^{\exp(-1.96v(t))}
\end{aligned}
$$
所以,這個校正版本的生存方程信賴區間公式就是:
$$\hat{S}(t)^{\exp\{ \mp1.96 v(t)\}}$$
## 另一種非參數法分析 -- 生命表格估計
Kaplan-Meier 估計的生存方程過程中,我們假定的是觀察到事件的時間點是間斷的,也就是哪個事件發生在哪個時間點,是可以被精確觀察到的。然而,現實比較骨感的時候,你的數據可能只有生命表格,也就是常見的如一年內本市死亡人口多少多少人這樣,事件發生在某個時間區間內的類型數據。因爲此時無法特定每個死亡人口發生死亡時的確切時間日期。此時可以利用生命表格計算。
我們假定,某個隨訪時間可以被分爲許許多多的時間區間 $I_1, I_2, \cdots, I_K$,且這些時間區間並不一定需要等距。另外,用 $d_j$ 表示在時間區間 $I_j$ 中發生的事件次數,在該時間段的開始時,有 $n_j$ 個觀察對象 (number of individuals at risk at the start of interval $I_j$),其中在下一段時間開始之前,有 $m_j$ 個刪失值。用這些數學標記來表示時間段 $I_j$ 中發生事件的概率 (前提是這 $n_j$ 個觀察對象在時間段 $I_j$ 開始前還沒有發生事件):
$$p_j = \frac{d_j}{n_j - m_j/2}$$
分母中使用了 $m_j/2$ 是由於我們無法確定事件發生和刪失值發生的時間在這個時間段 $I_j$ 中是如何分布的,所以我們只能假定他們平均的分布在時間段 $I_j$ 中點的兩側。如此,生命表法計算的生存方程公式就是:
$$
\hat{S}(t) = \prod_{k = 1}^j(1-p_k) \text{ for } t_j \leqslant t < t_{j+1}
$$
你可以看出,生命表的推算生存方程,其實和 Kaplan-Meier 法很接近,你同樣可以使用 Greewood's 的公式 (用 $n_j - m_j/2$ 替換掉 $n_j$ 即可) 獲取生命表生存方程的方差用於計算其信賴區間。
```{example 11-Survival-analysis-1}
心絞痛患者死亡追蹤: 生命表格的制作例子 (選自 [@van2004biostatistics])。本例子中,2418 名男性心絞痛患者被收入研究中並追蹤其死亡結果,記錄數據中包括患者死亡的日期和患者離開研究的時間。下面的表格是追蹤前十年的數據:
```
```{r Surv02tab02, echo=FALSE, cache=TRUE, eval=FALSE}
dt <- read.csv("backupfiles/Surv2-2.csv", header = T)
# names(dt) <- c("Survival time and censoring time", "Number at risk", "Number of events", "Number of censorings", "S(t)")
kable(dt, "html", align = "c", caption = "表 72.2: Men with angina: Numbers of deaths (dj), cencorings (mj), total numbers at risk (nj), and the life-table estimate of the survivor function by year") %>%
kable_styling(bootstrap_options = c("striped", "bordered"), full_width = F, position = "center") #%>%
#add_header_above(c("Level" = 2))
```
<table class="table table-striped table-bordered" style="width: auto !important; margin-left: auto; margin-right: auto;">
<caption>表 72.2: Men with angina: Numbers of deaths $(d_j)$, cencorings $(m_j)$, total numbers at risk $(n_j)$, and the life-table estimate of the survivor function by year.</caption>
<thead>
<tr>
<th style="text-align:center;"> Year </th>
<th style="text-align:center;"> $n_j$ </th>
<th style="text-align:center;"> $d_j$ </th>
<th style="text-align:center;"> $m_j$ </th>
<th style="text-align:center;"> $p_j$ </th>
<th style="text-align:center;"> $1-p_j$ </th>
<th style="text-align:center;"> $\hat S(t)$ </th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center;"> 0-1 </td>
<td style="text-align:center;"> 2418 </td>
<td style="text-align:center;"> 456 </td>
<td style="text-align:center;"> 0 </td>
<td style="text-align:center;"> 456/2418 = 0.188 </td>
<td style="text-align:center;"> 0.812 </td>
<td style="text-align:center;"> 0.812 </td>
</tr>
<tr>
<td style="text-align:center;"> 1-2 </td>
<td style="text-align:center;"> 1962 </td>
<td style="text-align:center;"> 226 </td>
<td style="text-align:center;"> 39 </td>
<td style="text-align:center;"> 226/(1962 - 39/2) = 0.116 </d0>
</td>
<td style="text-align:center;"> 0.884 </td>
<td style="text-align:center;"> 0.718 </td>
</tr>
<tr>
<td style="text-align:center;"> 2-3 </td>
<td style="text-align:center;"> 1697 </td>
<td style="text-align:center;"> 152 </td>
<td style="text-align:center;"> 22 </td>
<td style="text-align:center;"> 152/(1697 - 22/2) = 0.090 </d0>
</td>
<td style="text-align:center;"> 0.910 </td>
<td style="text-align:center;"> 0.653 </td>
</tr>
<tr>
<td style="text-align:center;"> 3-4 </td>
<td style="text-align:center;"> 1523 </td>
<td style="text-align:center;"> 171 </td>
<td style="text-align:center;"> 23 </td>
<td style="text-align:center;"> 171/(1523 - 23/2) = 0.113 </d0>
</td>
<td style="text-align:center;"> 0.887 </td>
<td style="text-align:center;"> 0.579 </td>
</tr>
<tr>
<td style="text-align:center;"> 4-5 </td>
<td style="text-align:center;"> 1329 </td>
<td style="text-align:center;"> 135 </td>
<td style="text-align:center;"> 24 </td>
<td style="text-align:center;"> 135/(1329 - 24/2) = 0.103 </d0>
</td>
<td style="text-align:center;"> 0.897 </td>
<td style="text-align:center;"> 0.519 </td>
</tr>
<tr>
<td style="text-align:center;"> 5-6 </td>
<td style="text-align:center;"> 1170 </td>
<td style="text-align:center;"> 125 </td>
<td style="text-align:center;"> 107 </td>
<td style="text-align:center;"> 125/(1170 - 107/2) = 0.112 </d0>
</td>
<td style="text-align:center;"> 0.888 </td>
<td style="text-align:center;"> 0.461 </td>
</tr>
<tr>
<td style="text-align:center;"> 6-7 </td>
<td style="text-align:center;"> 938 </td>
<td style="text-align:center;"> 83 </td>
<td style="text-align:center;"> 133 </td>
<td style="text-align:center;"> 83/(938 - 133/2) = 0.095 </d0>
</td>
<td style="text-align:center;"> 0.905 </td>
<td style="text-align:center;"> 0.417 </td>
</tr>
<tr>
<td style="text-align:center;"> 7-8 </td>
<td style="text-align:center;"> 722 </td>
<td style="text-align:center;"> 74 </td>
<td style="text-align:center;"> 102 </td>
<td style="text-align:center;"> 74/(722 - 102/2) = 0.110 </d0>
</td>
<td style="text-align:center;"> 0.890 </td>
<td style="text-align:center;"> 0.371 </td>
</tr>
<tr>
<td style="text-align:center;"> 8-9 </td>
<td style="text-align:center;"> 546 </td>
<td style="text-align:center;"> 51 </td>
<td style="text-align:center;"> 68 </td>
<td style="text-align:center;"> 51/(546 - 68/2) = 0.100 </d0>
</td>
<td style="text-align:center;"> 0.900 </td>
<td style="text-align:center;"> 0.334 </td>
</tr>
<tr>
<td style="text-align:center;"> 9-10 </td>
<td style="text-align:center;"> 427 </td>
<td style="text-align:center;"> 42 </td>
<td style="text-align:center;"> 64 </td>
<td style="text-align:center;"> 42/(427 - 64/2) = 0.106 </d0>
</td>
<td style="text-align:center;"> 0.894 </td>
<td style="text-align:center;"> 0.299 </td>
</tr>
</tbody>
</table>
```{r SurvExample2-3, echo=FALSE, fig.asp=.7, fig.width=7, fig.cap='Men with angina data: Life table estimate of the survivor function.', fig.align='center', out.width='90%', cache=TRUE}
knitr::include_graphics("img/Selection_131.png")
```
看圖 \@ref(fig:SurvExample2-3) 和上面估計的生存概率估計表格,請回答:
1. 患者的 5 年以上生存概率是多少? (51.9% 表格第五行)
2. 患者的 2.5 年以上生存概率是多少? (71.8% 記住在 2-3 年這段時間內生存概率被假定是不變的)
## 兩組之間生存概率的比較
本章目前爲止介紹的非參數法可以用於初步地對生存數據中不同組之間生存概率的比較。我們當然可以給不同組的患者/研究對象估計各自的生存曲線 (和信賴區間) 繪圖比較。
```{example 11-Survival-analysis-2}
**治療組和對照組白血病患者的生存曲線比較**: (本例中,時間是從發病到症狀緩解的時間,所以時間越短,說明療法越好) 下圖繪制的是治療組21名患者和對照組21名患者的生存概率曲線和它們各自的信賴區間。治療組的症狀緩解時間明顯比對照組要長,暗示治療方案可能對患者有不太好的影響。且途中的兩條生存曲線的95%信賴區間也基本沒有重疊。
```
```{r SurvExample2-4, echo=FALSE, fig.asp=.7, fig.width=7, fig.cap='Kaplain-Meier time-to-remission survival curves (solid lines) in leukemia patients in treatment and control groups, with corresponding 95% confidence limits(dotted lines)', fig.align='center', out.width='90%', cache=TRUE}
knitr::include_graphics("img/Selection_132.png")
```
看圖中的生存曲線,目測第十周時,治療組和對照組各自的生存率大概是多少,你的結論是怎樣的?
從圖上看,在對照組,第十周時患者的生存概率在 40% 左右; 在治療組,第十周時患者的生存概率是 75% 左右。所以,治療組中的患者傾向於需要更多的時間才能達到症狀緩解。在第十周時,對照組患者有 60% 已經症狀緩解,然而治療組只有 25% 的患者症狀緩解,所以我們認爲數據提示治療方法可能對患者是有副作用的。
### The log rank test
兩組 (或者更多組) 之間生存概率曲線其實是可以用統計學檢驗方法來檢驗的。用 $S_1(t),S_2(t)$ 分別表示兩組研究對象的生存概率。那麼在時間點 $u$ 時,兩組時間生存概率的比較可以用下面的檢驗統計量:
$$
\begin{equation}
\frac{\hat S_1(u) - \hat S_2(u)}{\sqrt{var \hat S_1(u) + var \hat S_2(u)}}
\end{equation}
(\#eq:surv2-20)
$$
然後把這個統計量拿去和標準正態分布做比較 (z-test)。
但是其實我們可以做得檢驗可以更多,比如比較兩組患者之間生存概率的分布,而不是只看某個時間點的生存概率之差。這種檢驗方法叫做 log rank test,或者 Mantel-Haenszel 檢驗。該檢驗的零假設是,兩組患者的生存曲線相同,它比較的是兩組患者的總體生存概率 (the whole survivor curves)。
接下來我們來推導這個檢驗方法。首先,先列出兩組患者在特定時間點時的數據:
```{r Surv02tab04, echo=FALSE, cache=TRUE, eval=FALSE}
dt <- read.csv("backupfiles/Surv2-4.csv", header = T)
# names(dt) <- c("Survival time and censoring time", "Number at risk", "Number of events", "Number of censorings", "S(t)")
kable(dt, "html", align = "c", caption = "表 72.2: Summary of numbers at risk and number of events at time tj in two groups.") %>%
kable_styling(bootstrap_options = c("striped", "bordered"), full_width = F, position = "center") #%>%
#add_header_above(c("Level" = 2))
```
<table class="table table-striped table-bordered" style="width: auto !important; margin-left: auto; margin-right: auto;">
<caption>表 72.2: Summary of numbers at risk and number of events at time $t_j$ in two groups.</caption>
<thead>
<tr>
<th style="text-align:center;"> Group </th>
<th style="text-align:center;"> Events at $t_j$ </th>
<th style="text-align:center;"> Number of surviving beyond $t_j$ </th>
<th style="text-align:center;"> Total number at risk at $t_j$ </th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center;"> 1 </td>
<td style="text-align:center;"> $d_{1j}$ </td>
<td style="text-align:center;"> $n_{1j} - d_{1j}$ </d0>
</td>
<td style="text-align:center;"> $n_{1j}$ </td>
</tr>
<tr>
<td style="text-align:center;"> 1 </td>
<td style="text-align:center;"> $d_{2j}$ </td>
<td style="text-align:center;"> $n_{2j} - d_{2j}$ </d0>
</td>
<td style="text-align:center;"> $n_{2j}$ </td>
</tr>
<tr>
<td style="text-align:center;"> Total </td>
<td style="text-align:center;"> $d_j$ </td>
<td style="text-align:center;"> $n_j$ <d0> dj </d0>
</td>
<td style="text-align:center;"> $n_j$ </td>
</tr>
</tbody>
</table>
在零假設 -- 不同的組之間,在該時間點時事件發生次數沒有差別 -- 的條件下,第一組患者中事件發生次數服從超幾何分布 (hypergeometric distribution) (章節: \@ref(hyperdist))。在超幾何分布下,組樣本量 $n_{1j}$ 中發生事件次數 $d_{1j}$ 在全體 (總樣本量 $n_j$,事件次數 $d_j$) 中的概率是:
$$
\begin{equation}
\frac{\binom{d_{j}}{d_{1j}}\binom{n_j - d_j}{n_{1j} - d_{1j}}}{\binom{n_j}{n_1j}}
\end{equation}
$$
對於第二組的患者,發生 $d_{2j}$ 次事件的概率也可以用相同的公式。那麼在給定的時間點 $t_j$,在零假設 -- 不同的組之間,在該時間點時事件發生次數沒有差別 -- 的條件下, 第一組患者中發生事件次數的期望值 (expectation):
$$
\begin{aligned}
e_{1j} = \frac{n_{1j}d_j}{n_j}
\end{aligned}
(\#eq:surv2-22)
$$
套用這個公式 \@ref(eq:surv2-22),我們可以計算每個時間點上事件發生次數的期望值和實際觀測值之間的差: $d_{1j}-e_{1j}$ 然後把每個時間點上事件次數的觀測值和期望值之間的差求和:
$$
\begin{equation}
\sum_j (d_{1j} - e_{1j})
\end{equation}
(\#eq:surv2-23)
$$
如果零假設成立,統計量 \@ref(eq:surv2-23) 應該等於零或者接近等於零。根據超幾何分布的方差,
$$
v_{1j}^2 = \text{var}(d_{1j}) = \frac{n_{1j}n_{2j}d_{j}(n_j - d_j)}{n_j^2 (n_j - 1)}
$$
所以,log-rank test 的檢驗統計量是
$$
\frac{\{ \sum_j(d_{1j} - e_{1j}) \}^2}{\sum_jv^2_{1j}} \sim \chi_1^2