R語言-Cox Model Assumptions
這篇筆記連標題都懶得想了(照搬教程標題。。。),繼續接上篇 ofollow,noindex" target="_blank">R語言-Cox比例風險模型 和上上篇 Survival analysis(生存分析)
先把我學習的教程放在最上面 Cox Model Assumptions
這篇主要是講述如何驗證Cox迴歸模型的有效性,主要從三個方面:
- Testing the proportional hazards assumption(檢驗Cox比例風險模型的前提假設是否成立)
- Examining influential observations (or outliers)(檢查是是否有異常值)
- Detecting nonlinearity in relationship between the log hazard and the covariates(檢測風險與協變數之間的非線性關係)
Cox比例風險模型的前提是:在某因素下,個體的風險比例在不同時間點都是定值;只有滿足這個前提,才能使用Cox迴歸模型;就像一些假設檢驗,需要資料總體滿足正態分佈才能使用一樣;本文使用Schoenfeld殘差來檢驗比例風險假設(還可以簡單的通過生存曲線是否交叉來粗略判斷下)
如果資料滿足Cox迴歸模型,那麼則Schoenfeld殘差和生存時間的秩次之間無明顯的相關性,也就是說Schoenfeld殘差與生存時間無明顯的一致變化趨勢,這裡通過survival包的 cox.zph()
函式即可判斷
library("survival") library("survminer") res.cox <- coxph(Surv(time, status) ~ age + sex + wt.loss, data =lung) test.ph <- cox.zph(res.cox) > test.ph rho chisqp age-0.0483 0.378 0.538 sex0.1265 2.349 0.125 wt.loss0.0126 0.024 0.877 GLOBALNA 2.846 0.416
這裡對年齡,性別以及體重減少這三個協變數做Cox迴歸,從test.ph結果中的三個協變數的P值可看出,檢驗均不顯著,說明每個協變數均滿足proportional hazards假設,而且模型總體(global)也不顯著,因此可得出這Cox迴歸模型的前提是成立的
此外我們還可以通過Schoenfeld殘差與時間的關係圖來診斷模型是否滿足前提,理論上如果滿足的話,Schoenfeld殘差應該與時間無明顯的趨勢,使用 ggcoxzph
函式,非常方便
ggcoxzph(test.ph)
圖中實線是散點的平滑擬合線,虛線則代表擬合線的正負兩個標準差;從圖中也很明顯的看出三個協方差均滿足proportional hazards假設(如果曲線偏離2個標準差則表示不滿足比例風險假定)
如果是分類協變數,則還可以通過繪製log(-log(S(t)))與t(或者log(t))來看是否平行來判斷是否滿足Cox假設
如果不滿足proportional hazards假設,則可以通過以下手段解決:
- Adding covariate*time interaction(增加協變數與時間的互動關係)
- Stratification(分層)
為了檢測影響模型的點,或者說是異常值,我們可以通過展示deviance residuals或者dfbeta values圖形來實現(也是一種殘差圖),主要使用 ggcoxdiagnostics
函式,type引數選擇殘差型別
ggcoxdiagnostics(res.cox, type = "dfbeta", linear.predictions = FALSE, ggtheme = theme_bw())
從上圖可看出,儘管一些dfbeta值(相對於迴歸係數的)很大,但是都不影響模型的估計值
我們還可以通過deviance殘差圖來檢查異常值
ggcoxdiagnostics(res.cox, type = "deviance", linear.predictions = FALSE, ggtheme = theme_bw())
deviance殘差一般以標準差為1對稱分佈在0附近,如果:
Deviance殘差如果大於0,提示預測結局發生的時間比實際結局發生的時間少,即風險率會高估。如果Deviance殘差小於0,則提示預測結局發生的時間比實際結局發生的時間長,即風險率會低估。得分殘差顯示了刪除某個觀測後模型中係數變化的大小,變化越大,表示該觀測對模型的影響越大。如果模型中很多觀測的殘差都較大,提示模型擬合的可能有問題
一般來說我們都假設連續協變數是呈線性的,通過繪製Martingale殘差與協變數的散點圖來檢驗非線性
Martingale殘差範圍一般在(-INF,1),如果其值接近於1則說明預測結局發生的時間比實際結局發生的時間少,即風險率會高估(died too soon);如果其值是極小的負值則說明預測結局發生的時間比實際結局發生的時間長,即風險率會低估(lived too long)
為了評估連續協變數的擬合形式,符合線性擬合形式的話則說明滿足Cox模型的假設,可以用 ggcoxfunctional()
函式來檢視協變數和martingale殘差的分佈情況
res.cox <- coxph(Surv(time, status) ~age + log(age) + sqrt(age), data = lung) ggcoxfunctional(res.cox,data = lung, point.col = "blue", point.alpha = 0.5)
從圖中可看出有略微非線性,但是整體還是有線性趨勢的