R語言-生存分析與結果的圖像處理
數據準備:
library("survival")
library("survminer")
data("lung")
調用“lung”數據集,使用head()命令調查前6行,得到以下結果:
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
time是指生存時間,status是二值型的生存狀態,其中“1”代表存活,“2”代表已經死亡。
KM非參數法:
調用survival包中的survfit來進行生存分析,得到每個時間段中的生存率。
fit <- survfit(Surv(time, status) ~ 1, data = lung)
直接查看fit的信息可以看到
> fit
Call: survfit(formula = Surv(time, status) ~ 1, data = lung)
n events median 0.95LCL 0.95UCL
228 165 310 285 363
n:代表總的樣本數爲228個
events:代表status爲2的樣本數(死亡樣本數)
0.95LCL:95% 置信區間的下界
0.95UCL:95%置信區間的上界
median:代表中位數
Log-Rank檢驗:
針對使用KM方法的生存分析,可以使用survdiff()來比較兩組或者多組之間的的生存曲線,調查它們生存率和標準誤之間的差異,輸出p值。
> survdiff(Surv(time, status) ~ ph.karno, data = lung)
Call:
survdiff(formula = Surv(time, status) ~ ph.karno, data = lung)
n=227, 1 observation deleted due to missingness.
N Observed Expected (O-E)^2/E (O-E)^2/V
ph.karno=50 6 5 5.71 0.0874 0.0935
ph.karno=60 19 16 9.64 4.1905 4.5095
ph.karno=70 32 29 20.53 3.4943 4.0275
ph.karno=80 67 47 43.30 0.3161 0.4390
ph.karno=90 74 49 58.85 1.6489 2.5910
ph.karno=100 29 18 25.97 2.4454 2.9262
Chisq= 12.3 on 5 degrees of freedom, p= 0.03
COX半參數法:
使用coxph()函數來進行生存分析:
cox_single <- coxph(Surv(time, status) ~ sex, data = lung) #單變量
cox_muti <- coxph(Surv(time, status) ~ age + sex + ph.ecog, data = lung)#多變量
使用summary函數可以查看返回當結果和p值:
> summary(cox_single)
Call:
coxph(formula = Surv(time, status) ~ sex, data = lung)
n= 228, number of events= 165
coef exp(coef) se(coef) z Pr(>|z|)
sex -0.5310 0.5880 0.1672 -3.176 0.00149 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
exp(coef) exp(-coef) lower .95 upper .95
sex 0.588 1.701 0.4237 0.816
Concordance= 0.579 (se = 0.021 )
Likelihood ratio test= 10.63 on 1 df, p=0.001
Wald test = 10.09 on 1 df, p=0.001
Score (logrank) test = 10.33 on 1 df, p=0.001
coxph()會給出Likelihood ratio test,Wald test,Score (logrank) test三種檢驗的結果,當樣本數量足夠大時,三者的值相似,一般情況下Likelihood ratio test的值更加準確。
相似比檢驗:
針對cox模型,R裏面的cox.zph函數可以對其進行檢驗:
R<-cox.zph(cox.muti)
> R
chisq df p
age 0.188 1 0.66
sex 2.305 1 0.13
ph.ecog 2.054 1 0.15
GLOBAL 4.464 3 0.22
其原假設爲符合PH假定,代表假定HR值不隨時間發生變化,滿足比例風險假定。在結果中所有變量的p值均>0.1,無法拒絕原假設。
生存曲線和診斷圖:
1,plot()
對於KM方法而言可以直接使用plot()命令來繪製生存曲線:
plot(fit,main="survival-KM",xlab="time",ylab="rate")
2,ggsurvplot
使用ggsurvplot()函數對KM的結果繪製生存曲線:
ggsurvplot(fit,
pval = FALSE, conf.int = TRUE, #是否顯示p值/顯示風險區域
risk.table = TRUE, # 將風險表顯示在生存曲線下面
risk.table.col = "strata",
linetype = "strata",
surv.median.line = "hv", # 中位數的標記可選(hv,v,h)
ggtheme = theme_bw(), # 改變ggplot2的樣式
palette = "green" #設置曲線顏色
)
3,多組生存曲線
在繪製多組間生存曲線時,pval=TRUE可以輸出log-rank的p值,使用pval.method=T可以顯示計算p值的方法;
調查ph.ecog組間生存曲線的差異:
fit <- survfit(Surv(time, status) ~ ph.ecog, data = lung)
ggsurvplot(fit,data=lung,pval=T,risk.table = T,risk.table.col="red",pval.method=T)
%其他參數:
risk.table = TRUE #風險表是否顯示
risk.table.col="red" #風險表顏色
surv.median.line = "hv"#中位數標記的方法(hv,h,v)
4,COX模型的Hazard ratio圖:
使用ggforest()函數進行繪製,可以得到log-rank的p值,AIC值
5,Schoenfeld individual檢驗診斷圖:
又稱“Schoenfeld Residuals Test”,用於調查殘差與時間的獨立性,從而檢驗Cox模型中的比例風險假設。相當於是cox.zph()結果的可視化表現。P值不顯著,說明符合原假設
R<-cox.zph(cox_muti) #cox多變量檢驗
ggcoxzph(R,resid=T,se=T,point.col = "red",point.size = 1)
參考文獻:
https://www.mbaskool.com/business-concepts/statistics/8766-schoenfeld-residuals-test.html
https://blog.csdn.net/weixin_43700050/article/details/100938707
https://blog.csdn.net/xiaohukun/article/details/78019726
https://blog.csdn.net/jaen_tail/article/details/79081954
*剛剛接觸生存分析這一塊,還有很多東西需要去學習,望大家一起討論一起學習。Fight!