KM曲線
在分析疾病的死亡率時,我們往往會糾結于怎樣在邏輯架構中去考慮未死亡的人群,以及想研究兩種藥物的表現效果,但病人的指標表現都不明顯,作用于其他指標且很難量化。
而KM曲線可以很好地反映人群在時間序列上的生存率,且能考慮到中途生存出院的數據,因為死亡率并不會等到病人都死亡了再去計算,而KM曲線對于這類數據的處理是出院人群不影響生存概率,即不會提高它,只是當做數據集的長度變短了,這樣可以有效避免對于生存率和藥物效果的誤判。
這里舉一個例子來說明:
library(survival)
library(survminer)# 1. 生成模擬數據集
set.seed(123) # 確保結果可重復
n <- 100 # 樣本量# 創建數據集:時間、事件狀態(1=發生事件,0=刪失)、組別
time <- round(rexp(n, rate=1/50), 1) # 生存時間(指數分布)
status <- rbinom(n, size=1, prob=0.7) # 70%的概率發生事件
group <- sample(c("A", "B"), n, replace=TRUE) # 隨機分組# 創建數據框
surv_data <- data.frame(time, status, group)# 查看前幾行數據
head(surv_data)# 2. 擬合KM模型
km_fit <- survfit(Surv(time, status) ~ group, data=surv_data)# 3. 繪制KM曲線
ggsurvplot(km_fit, data = surv_data,pval = TRUE, # 顯示p值conf.int = TRUE, # 顯示置信區間risk.table = TRUE, # 顯示風險表palette = c("#E7B800", "#2E9FDF"), # 顏色xlab = "Time (days)", # x軸標簽ylab = "Survival Probability", # y軸標簽title = "Kaplan-Meier Survival Curve", # 標題legend.labs = c("Group A", "Group B")) # 圖例標簽# 4. 查看匯總統計
summary(km_fit)# 5. 計算中位生存時間
km_fit
輸出:
Call: survfit(formula = Surv(time, status) ~ group, data = surv_data)group=A time n.risk n.event survival std.err lower 95% CI upper 95% CI0.2 61 1 0.9836 0.0163 0.95225 1.0002.1 60 1 0.9672 0.0228 0.92354 1.0002.8 58 1 0.9505 0.0278 0.89750 1.0003.4 57 1 0.9339 0.0320 0.87327 0.9997.3 54 1 0.9166 0.0357 0.84912 0.98910.8 53 1 0.8993 0.0390 0.82594 0.97913.0 51 1 0.8816 0.0421 0.80294 0.96814.0 49 1 0.8636 0.0449 0.78001 0.95614.1 48 1 0.8457 0.0474 0.75764 0.94414.2 47 1 0.8277 0.0497 0.73575 0.93115.3 45 1 0.8093 0.0519 0.71369 0.91815.7 44 1 0.7909 0.0539 0.69203 0.90415.8 42 1 0.7720 0.0558 0.67010 0.89016.0 41 1 0.7532 0.0575 0.64852 0.87519.0 40 1 0.7344 0.0591 0.62726 0.86024.0 39 1 0.7156 0.0605 0.60630 0.84528.2 38 1 0.6967 0.0618 0.58561 0.82929.5 36 1 0.6774 0.0630 0.56449 0.81331.5 35 1 0.6580 0.0641 0.54364 0.79632.2 34 1 0.6387 0.0651 0.52304 0.78034.3 33 1 0.6193 0.0659 0.50270 0.76339.5 32 1 0.6000 0.0666 0.48258 0.74648.3 29 1 0.5793 0.0675 0.46103 0.72848.6 28 1 0.5586 0.0682 0.43975 0.71048.7 27 1 0.5379 0.0687 0.41876 0.69151.4 25 1 0.5164 0.0692 0.39703 0.67256.5 23 1 0.4939 0.0698 0.37446 0.65259.6 22 1 0.4715 0.0701 0.35225 0.63162.7 21 1 0.4490 0.0703 0.33039 0.61066.5 20 1 0.4266 0.0703 0.30887 0.58972.0 18 1 0.4029 0.0702 0.28625 0.56774.8 16 1 0.3777 0.0702 0.26235 0.54478.2 13 1 0.3486 0.0706 0.23446 0.51878.5 11 2 0.2853 0.0706 0.17566 0.46381.0 9 1 0.2536 0.0695 0.14820 0.43486.6 8 1 0.2219 0.0676 0.12207 0.40392.8 7 1 0.1902 0.0650 0.09734 0.372108.4 6 1 0.1585 0.0614 0.07417 0.339136.3 4 1 0.1189 0.0574 0.04611 0.306202.1 3 1 0.0792 0.0501 0.02294 0.274224.9 2 1 0.0396 0.0376 0.00617 0.254360.6 1 1 0.0000 NaN NA NACall: survfit(formula = Surv(time, status) ~ group, data = surv_data)n events median 0.95LCL 0.95UCL
group=A 61 43 56.5 39.5 78.5
group=B 39 28 53.4 42.5 82.1
從輸出中,我們可以觀察到兩組的中位生存時間很接近,說明兩組數據的病人存活率差不多,而圖片中兩條曲線的趨勢相近,且置信區間(圖中的陰影部分)大部分重疊,更進一步說明了兩組數據的差異性不大。最后觀察p值遠大于0.05,說明在統計上兩組數據沒有顯著不同。但要注意的是,隨著時間的推移,樣本量的數量在急劇減少,在過了隨訪時間后,就很難跟蹤到病人進一步的變化,所以要想確定結論是否是對的,還需要擴大數據量去進一步分析。