玩轉(zhuǎn)生存分析痴昧,這一篇就夠了

1. 導(dǎo)入數(shù)據(jù)

library(tidyverse)
library("survival")
library("survminer")

test_data=read.table("survival.txt",header = T,sep = "\t",stringsAsFactors = F)
test_data$over55=ifelse(test_data$age >= 55,1,0)
test_data$over55=as.factor(test_data$over55)
test_data$drug=as.factor(test_data$drug)

head(test_data)
# studytime died drug age over55
# 1         1    1    0  61      1
# 2         1    1    0  65      1
# 3         2    1    0  59      1
# 4         3    1    0  52      0
# 5         4    1    0  56      1
# 6         4    1    0  67      1

summary(test_data)
# studytime          died        drug        age        over55
# Min.   : 1.00   Min.   :0.0000   0:20   Min.   :47.00   0:19  
# 1st Qu.: 7.75   1st Qu.:0.0000   1:28   1st Qu.:50.75   1:29  
# Median :12.50   Median :1.0000          Median :56.00         
# Mean   :15.50   Mean   :0.6458          Mean   :55.88         
# 3rd Qu.:23.00   3rd Qu.:1.0000          3rd Qu.:60.00         
# Max.   :39.00   Max.   :1.0000          Max.   :67.00

attach(test_data)

注意,因?yàn)槲覟榱俗詣?dòng)補(bǔ)全變量名澜建,使用了attach()。如果沒(méi)有用這個(gè)蝌以,像survfit() coxph()這些函數(shù)還需要加上data參數(shù)

2. KM生存曲線

drug_KM=survfit(Surv(studytime,died) ~ drug,data=test_data)
ggsurvplot(drug_KM,data=test_data,legend.title = "drug",pval = TRUE,pval.method=T,palette=c("red","blue"))
ggsave("drug.png",width = 5,height = 5)
over55_KM=survfit(Surv(studytime,died) ~ over55,data=test_data)
ggsurvplot(over55_KM,data=test_data,legend.title = "over55",pval = TRUE,pval.method=T,palette=c("red","blue"))
ggsave("over55.png",width = 5,height = 5)

3. COX比例風(fēng)險(xiǎn)模型

用兩個(gè)變量進(jìn)行Cox-PH model炕舵,都是分類變量,當(dāng)然數(shù)值變量也可以做

cox.mod=coxph(Surv(studytime,died) ~ drug + over55)
#描述一下
summary(cox.mod)
# Call:
#   coxph(formula = Surv(studytime, died) ~ drug + over55)
# 
# n= 48, number of events= 31 
# 
# coef exp(coef) se(coef)      z Pr(>|z|)    
# drug1   -2.2632    0.1040   0.4582 -4.940 7.82e-07 ***
#   over551  0.9274    2.5278   0.3935  2.356   0.0184 *  
#   ---
#   Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# 
# exp(coef) exp(-coef) lower .95 upper .95
# drug1       0.104     9.6135   0.04238    0.2553
# over551     2.528     0.3956   1.16888    5.4668
# 
# Concordance= 0.784  (se = 0.039 )
# Likelihood ratio test= 31.03  on 2 df,   p=2e-07
# Wald test            = 26.92  on 2 df,   p=1e-06
# Score (logrank) test = 34.49  on 2 df,   p=3e-08
  • exp(coef)就是HR跟畅,0.104表示:在控制年齡的情況下咽筋,用藥的人死亡可能性是沒(méi)有用藥的人的0.104倍
  • exp(-coef)為9.6135的解釋剛好反過(guò)來(lái),表示:在控制年齡的情況下徊件,沒(méi)有用藥的人死亡可能性是用藥的人的9.6135倍
  • Concordance表示預(yù)測(cè)一致性
  • 后面有三個(gè)假設(shè):零假設(shè)是b1=b2=b3=...=b_k=0奸攻,表征的是模型整體的顯著性

4. 森林圖

一般文獻(xiàn)里面比較關(guān)心HR,我們可以用森林圖來(lái)表示

ggforest(cox.mod, main = '',data = test_data)
ggsave(filename = "cox.mod.png",device = "png",width = 20,height = 10,units = c("cm"))

有時(shí)候也能看到KM曲線里面加HR的圖庇忌,這需要結(jié)合KM的結(jié)果和COX的結(jié)果舞箍。
到這里,對(duì)于paper的畫圖已經(jīng)足夠了皆疹,如果想深入了解Cox比例風(fēng)險(xiǎn)模型疏橄,可以看看下面的內(nèi)容

5. 采用某個(gè)變量前后的模型比較

用LRT (likelihood ratio tests) 比較嵌套模型(一個(gè)模型含有另一個(gè)模型的全部變量),零假設(shè)是兩個(gè)模型沒(méi)有差異

cox.mod=coxph(Surv(studytime,died) ~ drug + over55)
cox.mod2=coxph(Surv(studytime,died) ~ over55)
anova(cox.mod2,cox.mod,test = "LRT")
# Analysis of Deviance Table
# Cox model: response is  Surv(studytime, died)
# Model 1: ~ over55
# Model 2: ~ drug + over55
# loglik  Chisq Df P(>|Chi|)    
# 1 -98.062                        
# 2 -83.994 28.136  1 1.131e-07 ***

p值很小略就,說(shuō)明有差異捎迫,所以我們不能去掉drug變量

6. cox模型也能用數(shù)值型變量

cox.mod3=coxph(Surv(studytime,died) ~ age)
summary(cox.mod3)

exp(coef)等于1.08表示:每增加1歲,風(fēng)險(xiǎn)增加0.08

7. 檢查COX PH model的假設(shè)

  1. check linearity
    模型中有數(shù)值型變量
    線性回歸里面也有這一步表牢,方法類似
  2. check the proportional hazard's assumptions
    可以簡(jiǎn)單理解為某個(gè)變量對(duì)結(jié)局事件的影響(回歸得到的系數(shù))不隨時(shí)間而改變
cox.mod4=coxph(Surv(studytime,died) ~ age)
png("Martingale_residuals.png")
plot(predict(cox.mod4),residuals(cox.mod4,type = "martingale"),
     xlab = "fitted values",ylab = "Martingale residuals",
     main = "Residual Plot",las=1)
#加水平線
abline(h=0)
#畫殘差的擬合線
lines(smooth.spline(predict(cox.mod4),residuals(cox.mod4,type = "martingale")),col="red")
dev.off()

換一種殘差檢查線性窄绒,deviance residuals

png("deviance_residuals.png")
plot(predict(cox.mod4),residuals(cox.mod4,type = "deviance"),
     xlab = "fitted values",ylab = "Deviance residuals",
     main = "Residual Plot",las=1)
abline(h=0)
lines(smooth.spline(predict(cox.mod4),residuals(cox.mod4,type = "deviance")),col="red")
dev.off()

check proportional hazards assumption
using Schoenfeld test for PH, Ho: HAZARDS are prop, Ha: HAZARDS are NOT prop
結(jié)果會(huì)返回每個(gè)變量,以及整體的p值

cox.zph(cox.mod4)
# chisq df    p
# age    0.662  1 0.42
# GLOBAL 0.662  1 0.42

p值較大可以接受原假設(shè)崔兴。

也可以看某個(gè)變量的系數(shù)(β)是不是隨著時(shí)間而改變彰导,如果是(也就是說(shuō)HR隨時(shí)間而改變)蛔翅,則說(shuō)明為non-prop hazard

par(mfrow=c(1,1))
png("cox.zph.png")
plot(cox.zph(cox.mod4)[1])
dev.off()
detach(test_data)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市位谋,隨后出現(xiàn)的幾起案子山析,更是在濱河造成了極大的恐慌,老刑警劉巖掏父,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件笋轨,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡赊淑,警方通過(guò)查閱死者的電腦和手機(jī)爵政,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)陶缺,“玉大人钾挟,你說(shuō)我怎么就攤上這事∽榱ǎ” “怎么了等龙?”我有些...
    開(kāi)封第一講書人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵处渣,是天一觀的道長(zhǎng)伶贰。 經(jīng)常有香客問(wèn)我,道長(zhǎng)罐栈,這世上最難降的妖魔是什么黍衙? 我笑而不...
    開(kāi)封第一講書人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮荠诬,結(jié)果婚禮上琅翻,老公的妹妹穿的比我還像新娘。我一直安慰自己柑贞,他們只是感情好方椎,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著钧嘶,像睡著了一般棠众。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上有决,一...
    開(kāi)封第一講書人閱讀 51,115評(píng)論 1 296
  • 那天闸拿,我揣著相機(jī)與錄音,去河邊找鬼书幕。 笑死新荤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的台汇。 我是一名探鬼主播苛骨,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼篱瞎,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了痒芝?” 一聲冷哼從身側(cè)響起奔缠,我...
    開(kāi)封第一講書人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吼野,沒(méi)想到半個(gè)月后校哎,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瞳步,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年闷哆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片单起。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡抱怔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嘀倒,到底是詐尸還是另有隱情屈留,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布测蘑,位于F島的核電站灌危,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏碳胳。R本人自食惡果不足惜勇蝙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望挨约。 院中可真熱鬧味混,春花似錦、人聲如沸诫惭。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)夕土。三九已至馆衔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間隘弊,已是汗流浹背哈踱。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留梨熙,地道東北人开镣。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像咽扇,于是被迫代替她去往敵國(guó)和親邪财。 傳聞我的和親對(duì)象是個(gè)殘疾皇子陕壹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容