列線圖(Alignment Diagram),也稱諾莫圖(Nomogram),絕是臨床預(yù)測模型最為常見的一種呈現(xiàn)形式。列線圖可以根據(jù)受試者的一些特征(解釋變量)來預(yù)測結(jié)局事件的發(fā)生概率或者患者的生存率等。生存資料預(yù)測模型的列線圖除了可以預(yù)測生存率,還可以預(yù)測分位數(shù)生存時(shí)間、生存時(shí)間期望均值、風(fēng)險(xiǎn)比。 生存資料預(yù)測模型的構(gòu)建絕大多數(shù)是基于COX回歸法。COX回歸屬于半?yún)?shù)法,在多因素的生存分析中幾乎是霸主般的存在,主要是因?yàn)?/span>COX回歸幾乎不需要考慮前提條件,僅要求滿足比例風(fēng)險(xiǎn)假定就可以了。除了COX回歸,參數(shù)生存模型也是生存資料非常重要的分析方法。但參數(shù)法需要數(shù)據(jù)滿足一定分布,一說到分布啥的一些理論,基本上就阻斷了大部分人繼續(xù)下去的欲望,甚至頭皮發(fā)麻惡心想吐,哪還有心思去搞清楚怎么用。但其實(shí)如果滿足適用條件,參數(shù)法可能會(huì)比非參數(shù)法更好地解釋數(shù)據(jù)。正如在比較組間效應(yīng)時(shí),如果數(shù)據(jù)滿足獨(dú)立正態(tài)同方差,我們更愿意適用t檢驗(yàn)/方差分析,而不會(huì)首選非參數(shù)檢驗(yàn)一樣,雖然使用非參數(shù)檢驗(yàn)也沒有錯(cuò)。與生存時(shí)間相關(guān)的一些重要分布有"weibull", "exponential", "gaussian", "logistic","lognormal" and "loglogistic"。 此次筆記的任務(wù)就是繪制生存資料預(yù)測模型的列線圖,包括COX回歸模型和參數(shù)生存模型。 下面直接上命令清單: 導(dǎo)入數(shù)據(jù)與因子設(shè)置 ##導(dǎo)入數(shù)據(jù) ##設(shè)置因子及因子各水平的標(biāo)簽 ##載入列線圖繪制程序包 library(rms) library(Hmisc);library(lattice);library(survival);library(Formula);library(ggplot2);library(SparseM) CoxNM<-datadist(HF) options(datadist='CoxNM') label(HF$Age.cat)<-"Age" label(HF$EF)<-"Ejection Fraction" label(HF$SCr.cat)<-"Serum Creatinine" ##建立COX回歸模型 HFDeath.cox<-cph(Surv(Time,Death==1)~Age.cat+EF+SCr.cat,data=HF,x=T,y=T,surv=T,method="breslow") #method:結(jié)(ties)的處理方式有efron、breslow和exact,默認(rèn)為efron。這里改為method="breslow"是為了得到跟SPSS一致的結(jié)果,STATA默認(rèn)的也是breslow。同樣的數(shù)據(jù)在采用R的coxph{survival}和cph{rms}的進(jìn)行Cox回歸,其結(jié)果與SPSS有略微差異,如果你像我一樣糾結(jié),可以在R中把結(jié)的處理方式改一下就可以了; #x、y、surv:這幾個(gè)參數(shù)是為了繪制后面的列線圖方便,都設(shè)置為TRUE就可以了; #time.inc:這在后期進(jìn)行模型評(píng)估中可能會(huì)用到,比如評(píng)估模型在不同時(shí)間點(diǎn)上的校準(zhǔn)度,常常用函數(shù)calibrate繪制1年、3、5年的校準(zhǔn)曲線,這時(shí)候就需要用time.inc指定時(shí)間點(diǎn),然后再calibrate函數(shù)的u參數(shù)進(jìn)行呼應(yīng)。 ##建立生存率的估計(jì)函數(shù) surv<-Survival(HFDeath.cox) surv3M<-function(x)surv(91.31,lp=x) surv0.5<-function(x)surv(182.625,lp=x) surv1<-function(x)surv(285,lp=x) #Survival函數(shù)可以對(duì)cph創(chuàng)建的對(duì)象返回一個(gè)S函數(shù),用于計(jì)算生存率的估計(jì)值。除了Survival函數(shù),Quantile()返回的S函數(shù)可用于計(jì)算生存時(shí)間的分位數(shù)(默認(rèn)為中位數(shù),可通過q來指定具體的分位數(shù));Mean()返回返回一個(gè)計(jì)算平均生存時(shí)間的函數(shù)。參數(shù)估計(jì)模型還有Hazard()用于估計(jì)風(fēng)險(xiǎn)函數(shù); #通過function函數(shù)定義了三個(gè)生存率的計(jì)算函數(shù),這些函數(shù)以一個(gè)時(shí)間點(diǎn)和線性預(yù)測器作為參數(shù),并返回該時(shí)間點(diǎn)的生存率。本例時(shí)間單位是天,用91.31天和182.62天來表示1個(gè)月和3個(gè)月,1年應(yīng)該用365.25天,但本例最長的隨訪時(shí)間是285天,如果使用大于285的數(shù)字,結(jié)果會(huì)報(bào)錯(cuò)“Error in approx(fu[s], xseq[s], fat, ties = mean) :調(diào)用內(nèi)插至少需要兩個(gè)非NA值的數(shù)”。此處僅示例。 Nom.Surv<-nomogram(HFDeath.cox,lp=T,fun=list(surv3M,surv0.5,surv1), fun.at=c('0.99','0.95','0.90','0.85',seq(0.80,0.10,by=-0.1),'0.05','0.01'),funlabel=c("3-Month Survival Prob.","Half-Year Survival Prob.","1-Year Survival Prob.")) ##列線圖繪制的主要函數(shù),參數(shù)又多又復(fù)雜又難理解,僅介紹幾個(gè)常用的、重要的 #lp:默認(rèn)設(shè)置為FALSE,即不顯示線性預(yù)測器(linear predictor)的那條坐標(biāo)軸。我們最終想預(yù)測的概率就是這個(gè)線性預(yù)測器的值通過一定的函數(shù)變換得來的。列線圖的基本原理就是根據(jù)預(yù)測變量對(duì)結(jié)局的影響大?。ɑ貧w系數(shù)),給各個(gè)預(yù)測變量的水平進(jìn)行賦分,評(píng)分之和通過函數(shù)轉(zhuǎn)化成結(jié)局事件發(fā)生概率。這個(gè)線性預(yù)測值可以理解為承接變量總評(píng)分與預(yù)測概率之間的中間變量,對(duì)列線圖的使用而言其實(shí)沒啥毛用; #fun:對(duì)線性預(yù)測值進(jìn)行轉(zhuǎn)換的函數(shù); #fun.at:預(yù)測值橫軸的刻度,本例是在坐標(biāo)軸上顯示的概率值??墒褂迷搮?shù)的默認(rèn)值,也可通過該參數(shù)改成需要顯示的值。同一個(gè)fun函數(shù)可以是使用同一個(gè)fun.at向量值,不同fun函數(shù)需要用fun.at值的向量列表標(biāo)識(shí)。本例有三個(gè)自建函數(shù),不過都是對(duì)應(yīng)生成生存率的Survival這一個(gè)函數(shù),因此三條預(yù)測概率坐標(biāo)軸刻度使用了相同的fun.at值; #funlabel:預(yù)測橫軸名稱,默認(rèn)"Predicted Value"; #conf.int: 是否顯示得分的置信區(qū)間,默認(rèn)否; #maxscale:默認(rèn)單變量最大分?jǐn)?shù)值是100分。 plot(Nom.Surv,xfrac=.25,col.grid=gray(c(0.8,0.95))) ##主要是將前面Nomogram函數(shù)的結(jié)果畫出來,一些參數(shù)可以起到美化作用 #lplabel:線性預(yù)測器橫軸的名稱,默認(rèn)"Linear Predictor"。不過這個(gè)變量我一般會(huì)在Nomogram中關(guān)掉不顯示; #fun.side:預(yù)測軸上的刻度值位置,1用于定位在軸下方(默認(rèn)值),3用于軸上方。預(yù)測橫軸的刻度值有時(shí)候會(huì)非常擁擠甚至重疊在一起,如一個(gè)軸有5個(gè)標(biāo)記標(biāo)簽值,第二個(gè)和第三個(gè)相互重疊,可該參數(shù)進(jìn)行指定:fun.side=c(1,1,3,1,1); #col.conf:置信區(qū)間的顏色設(shè)置; #xfrac:各刻度線橫軸與軸名稱之間的空白間隔所占的比例,默認(rèn)0.35。如果你覺得坐標(biāo)軸名稱與坐標(biāo)軸隔得距離太遠(yuǎn),可以把這個(gè)值設(shè)置的小一些; #cex.axis:刻度軸刻度標(biāo)簽的字符大小,默認(rèn)0.85; #cex.var:刻度軸名稱的字符大小,默認(rèn)1;刻度軸標(biāo)題默認(rèn)是變量名稱,可通過label()進(jìn)行修改; #col.grid :默認(rèn)不繪制垂直參考網(wǎng)格線。該參數(shù)若長度為1,則對(duì)主要和次要參考線使用相同的顏色,長度為2則分別對(duì)應(yīng)主要和次要參考線的顏色,常用灰色col.grid = gray(c(0.8, 0.95)); #points.label:單變量評(píng)分軸的名稱,默認(rèn)為'Points'; #total.points.label:總評(píng)分軸的名稱,默認(rèn)'Total Points'。 1.2.2帶有交互作用的列線圖繪制 模型是否存在交互作用應(yīng)在1.2步進(jìn)行考察,此處僅演示其列線圖的繪制操作。 HFDeath.cox2<-cph(Surv(Time,Death==1)~Age.cat+EF+SCr.cat+Age.cat*EF,data=HF,x=T,y=T,surv=T,method="breslow") mea<-Mean(HFDeath.cox2) surv3M<-function(x)surv(91.31,lp=x) surv0.5<-function(x)surv(182.625,lp=x) surv1<-function(x)surv(285,lp=x) mean<-function(x)mea(lp=x) #除了建立生存率預(yù)測函數(shù),還建立一個(gè)生存時(shí)間期望均值的預(yù)測函數(shù)。最后一次隨訪時(shí)結(jié)局為非刪失事件,Mean函數(shù)會(huì)有報(bào)警。由于刪失的存在,平均生存時(shí)間是一個(gè)有偏估計(jì)量,一般用生存曲線下面積或累計(jì)發(fā)病率曲線上面積表示。 #此處本來還想演示一下fun.side參數(shù)的:fun.side=list(rep(1,10),rep(3,10),rep(c(1,3),5),c(rep(1,10),3,1,3,1)),結(jié)果報(bào)錯(cuò)。單獨(dú)預(yù)測生存率或者單獨(dú)預(yù)測生存時(shí)間均值時(shí)都沒有問題,但合在一起就出現(xiàn)了錯(cuò)誤,尋因良久,未果,只得作罷。不過可以適當(dāng)對(duì)fun.at參數(shù)進(jìn)行調(diào)整來解決刻度值擁擠的問題。 #dist:可選擇的分布有weibull, exponential、gaussian、logistic、lognormal和loglogistic quan<-Quantile(HFDeath.psm) surv100D<-function(x)surv(100,lp=x) surv0.5<-function(x)surv(182.625,lp=x) surv1<-function(x)surv(285,lp=x) Q25<-function(x)quan(lp=x,q=0.25) median<-function(x)quan(lp=x) #除了建立生存率預(yù)測函數(shù),同時(shí)建立生存時(shí)間分位數(shù)的預(yù)測函數(shù)。默認(rèn)是中位值,通過q參數(shù)可指定任意分位數(shù) #本例25分位數(shù)生存時(shí)間為100天,隨訪結(jié)束時(shí)的累積生存率為57.6%,尚未到達(dá)中位生存時(shí)間 #采用默認(rèn)的fun.at,分位數(shù)預(yù)測刻度軸的標(biāo)簽會(huì)非常得擁擠,但在調(diào)整展示兩個(gè)函數(shù)(此處是生存函數(shù)和分為數(shù)函數(shù))刻度值的位置時(shí),fun.side參數(shù)再次報(bào)錯(cuò),只能使用fun.at可以進(jìn)行適當(dāng)?shù)恼{(diào)整。 Nom.Quan.psm<-nomogram(HFDeath.psm,lp=F,fun=list(Q25,median), fun.at=c(seq(20,100,by=20),seq(150,300,by=50),seq(400,1200,by=200),1800,2500), funlabel=c("Q25 Survival Time","Q50 Survival Time")) rms包幫助文件:https://cran./web/packages/rms/ Zhongheng Zhang,Michael W. Kattan.Drawing Nomograms with R: applications to categorical outcome and survival data.Ann Transl Med 2017;5(10):211. [http://dx./10.21037/atm.2017.04.01] END |
|