目錄
基本知識(shí)
1. C指數(shù)
2. NRI、IDI
二分類資料
1. C指數(shù)
C指數(shù)計(jì)算
比較兩個(gè)模型C指數(shù)
2. NRI
3. IDI
生存資料
1. rms包擬合的生存曲線
C指數(shù)
比較兩個(gè)模型的C指數(shù)
2. survival包擬合的生存曲線
C指數(shù)
NRI計(jì)算
IDI
基本知識(shí)
1. C指數(shù)
C指數(shù):
C指數(shù),又稱為一致性指數(shù),可評(píng)價(jià)模型的預(yù)測(cè)能力,尤其是評(píng)估COX回歸模型的判別能力。C指數(shù)是指所有病人對(duì)子中,預(yù)測(cè)結(jié)果與實(shí)際結(jié)果一致的對(duì)子數(shù)占總子數(shù)的比例,表示預(yù)測(cè)結(jié)果與實(shí)際結(jié)果相一致的概率。
C指數(shù)的評(píng)價(jià):
C指數(shù)的范圍為0.5-1,若C指數(shù)為0.5,為完全隨機(jī),說(shuō)明該模型沒有預(yù)測(cè)作用;C指數(shù)為1,說(shuō)明完全一致。C指數(shù)在0.5-0.7之間的精度較低,C指數(shù)在0.71-0.90之間為中等準(zhǔn)確度,C指數(shù)在0.90以上為高準(zhǔn)確度。
C-index與AUC的關(guān)系:
對(duì)于二元logistic回歸模型,C指數(shù)可以簡(jiǎn)化為:預(yù)測(cè)患有某種疾病的患者出現(xiàn)疾病的概率大于預(yù)測(cè)該疾病本身的概率。結(jié)果表明,二元Logistic回歸的C指數(shù)等價(jià)于AUC。AUC主要反映二元Logistic回歸模型的預(yù)測(cè)能力,而C-index可以評(píng)價(jià)各種模型預(yù)測(cè)結(jié)果的準(zhǔn)確性。
Cox模型的C指數(shù)計(jì)算概述:
(1)方法一:直接運(yùn)用生存包中的coxph()函數(shù)輸出結(jié)果。95%CI可以通過(guò)C加減1.96*Se得到。
(2)方法二:在rms包中cph()函數(shù)和validate()函數(shù),非調(diào)整的偏置調(diào)整的C-index都能得到。
2. NRI、IDI
凈重新分類指數(shù) NRI,綜合判別改善指數(shù) IDI可用于不同預(yù)測(cè)模型的比較。
C指數(shù)進(jìn)行模型比較的缺點(diǎn):
- C指數(shù)不夠敏感,在舊模型中增加新變量,C指數(shù)提升程度有限;
- 從臨床角度,C指數(shù)不易被理解。
凈重新分類改善指數(shù)(Net Reclassification Index,NRI)
原理:首先將研究對(duì)象按照金標(biāo)準(zhǔn)分為患病和未患病組,然后分別在這兩組中,新、舊模型對(duì)研究對(duì)象進(jìn)行分類,整理成兩個(gè)四格表。最后根據(jù)患病組和未患病組中在新、舊模型下的差別來(lái)計(jì)算凈重新分類指數(shù)NRI。
在table3中,c1是原來(lái)模型沒有預(yù)測(cè)對(duì),新模型預(yù)測(cè)對(duì)的,同樣的道理,b1是原來(lái)模型預(yù)測(cè)對(duì),但新模型給預(yù)測(cè)錯(cuò)的,于是(c1 ? b1)/N1便是疾病組或者event組增加的重分類的正確比。
同樣我們可以得到非疾病組中(table 4)中增加的重分類正確比為(b2 ? c2)/N2。
NRI = (c1 ? b1)/N1 + (b2 ? c2)/N2
結(jié)果解讀:NRI表示的是重分類的正確個(gè)案占比的增加量,所以若NRI>0,則為正改善,說(shuō)明新模型比舊模型的預(yù)測(cè)能力有所改善;若NRI<0,則為負(fù)改善,新模型預(yù)測(cè)能力下降;若NRI=0,則認(rèn)為新模型沒有改善。
計(jì)算方法:預(yù)測(cè)模型NRI計(jì)算首選nricens包。
綜合判別改善指數(shù)IDI(Integrated discrimination improvement, IDI)
原理:在疾病組,模型預(yù)測(cè)陽(yáng)性的概率要盡可能大,在非疾病組模型預(yù)測(cè)陽(yáng)性的概率要盡可能小,通過(guò)模型的預(yù)測(cè)概率差值依然可以得到一個(gè)評(píng)價(jià)指數(shù)。如果新模型比原模型:在陽(yáng)性組,預(yù)測(cè)陽(yáng)性的概率比舊模型的大;在陰性組,預(yù)測(cè)陽(yáng)性的概率比舊模型的小。那么就可以說(shuō)明新模型比舊模型好。
IDI = (Pnew,events–Pold,events) – (Pnew,non-events – Pold,non-events)
Pnew,events表示在疾病組新模型的預(yù)測(cè)陽(yáng)性概率,Pold,non-events表示在非疾病組舊模型的預(yù)測(cè)陽(yáng)性概率。
IDI就等于疾病組新舊模型的預(yù)測(cè)陽(yáng)性概率的差值減去非疾病組新舊模型預(yù)測(cè)陽(yáng)性概率的差值(因?yàn)閷?duì)于非疾病組模型預(yù)測(cè)陽(yáng)性的概率應(yīng)該是越小越好,所以中間是減號(hào))
結(jié)果解讀:IDI越大越說(shuō)明新模型比舊模型預(yù)測(cè)效果更好。若IDI>0,則為正改善,說(shuō)明新模型比舊模型的預(yù)測(cè)能力有所改善,若IDI<0,則為負(fù)改善,新模型預(yù)測(cè)能力下降,若IDI=0,則認(rèn)為新模型沒有改善。
二分類資料
案例:預(yù)測(cè)肺動(dòng)脈栓塞風(fēng)險(xiǎn)
library(readxl)
data <- read_excel("data.xlsx")
data<-na.omit(data)
data<-as.data.frame(data)
?創(chuàng)建Logistic預(yù)測(cè)模型
#建立模型公式
form.bestglm<-as.formula(group~age+BMI+ToS+CA153+CDU+transfusion+stage)
form.all<-as.formula(group~.)
#打包
library(rms)
dd=datadist(data)
options(datadist="dd")
#Logistic模型擬合
fit.glm<- lrm(formula=form.bestglm,data=data,x=TRUE,y=TRUE)
#計(jì)算預(yù)測(cè)值
data$predvalue<-predict(fit.glm)
1. C指數(shù)
C指數(shù)計(jì)算
因?yàn)镃指數(shù)在logistic回歸二分類中等價(jià)于ROC,所以:
方法一:ROC計(jì)算
library(pROC)
modelROC <- roc(data$group,data$predvalue)
auc(modelROC)
ci(auc(modelROC))
提取出fit.glm中的預(yù)測(cè)值,然后利用roc()函數(shù)進(jìn)行ROC擬合。auc()提取模型的ROC值,ci()提取ROC的95%CI。
輸出的結(jié)果可以顯示AUC為0.8063,95%CI為0.7582-0.8544。所以模型的C指數(shù)為0.8063。
方法二:Hmisc包中somers2()函數(shù)
library(Hmisc)
somers2(data$predvalue, data$group)
注意:區(qū)別于roc()函數(shù)的順序,roc()函數(shù)中輸入的是實(shí)際值,預(yù)測(cè)值;在somers2中輸入的是預(yù)測(cè)值,后是實(shí)際值。
以上兩者方法計(jì)算的C指數(shù)都是非校正的C指數(shù)
方法三:校正C指數(shù)的計(jì)算(validate()函數(shù))
對(duì)模型進(jìn)行bootstrap,次數(shù)為1000,dxy設(shè)置為TRUE
v<-validate(fit.glm, method="boot", B=1000, dxy=TRUE)
?分別提取bootstrap后的模型中的原始Dxy和校正的Dxy,然后根據(jù)C-index=Dxy/2+0.5,計(jì)算C指數(shù):
orig_Dxy = v[rownames(v)=="Dxy", colnames(v)=="index.orig"]
corrected_Dxy = v[rownames(v)=="Dxy", colnames(v)=="index.corrected"]
orig_C_index <- abs(orig_Dxy)/2+0.5
bias_corrected_C_index <- abs(corrected_Dxy)/2+0.5
顯示C指數(shù)結(jié)果
cbind("C指數(shù)"=orig_C_index,"校正C指數(shù)"=bias_corrected_C_index)
方法四:rcorrcens()函數(shù)計(jì)算95%CI
c<-rcorrcens(formula=group~predvalue,data=data)
c
需要在formula中指定實(shí)際值與預(yù)測(cè)值,指定數(shù)據(jù)集data。
C指數(shù)為0.806,根據(jù)SD計(jì)算95%CI
c[1,1]-1.96*c[1,4]/2
c[1,1]+1.96*c[1,4]/2
與ROC法計(jì)算的可信區(qū)間有一定細(xì)微差別。
比較兩個(gè)模型C指數(shù)
一般使用ROC法,等價(jià)于比較兩個(gè)ROC曲線是否存在差異:
rm(list = ls())
library(readxl)
data <- read_excel("data.xlsx")
data<-na.omit(data)
data<-as.data.frame(data)
#建立模型公式
form.bestglm<-as.formula(group~age+BMI+ToS+CA153+CDU+transfusion+stage)
form.all<-as.formula(group~.)
#打包
library(rms)
dd=datadist(data)
options(datadist="dd")
#Logistic模型擬合
fit.glm<- lrm(formula=form.bestglm,data=data,x=TRUE,y=TRUE)
fit2.glm<- lrm(formula=form.all,data=data,x=TRUE,y=TRUE)
#計(jì)算模型預(yù)測(cè)值
data$predvalue <- predict(fit.glm)
data$predvalue2<-predict(fit2.glm)
#ROC擬合
modelROC <- roc(data$group,data$predvalue)
modelROC2 <- roc(data$group,data$predvalue2)
roc.test(modelROC,modelROC2 )
檢驗(yàn)統(tǒng)計(jì)量Z為-1.6774,p值為0.09346,不存在統(tǒng)計(jì)學(xué)差異。
2. NRI
構(gòu)建兩個(gè)模型:
form.new<-as.formula(group~age+BMI+ToS+CA153+CDU+transfusion+stage)
form.old<-as.formula(group~ age+BMI+ToS+CDU+transfusion+stage)
mstd = glm(formula=form.old, family = binomial(), data=data, x=TRUE)
mnew = glm(formula=form.new, family = binomial(), data=data, x=TRUE)
計(jì)算分類NRI(nricens包中nribin()函數(shù)):
#install.packages("nricens")
library(nricens)
set.seed(123)
cg<-nribin(mdl.std =mstd,
mdl.new = mnew,
cut = c(0.2,0.4),
niter = 1000,
updown = 'category')
在計(jì)算之前需要指定種子數(shù),種子數(shù)不同,結(jié)果會(huì)稍有差異。
nribin()函數(shù)中mdl.std指定舊模型,mdl.new指定新模型,cut設(shè)置截?cái)帱c(diǎn),截?cái)帱c(diǎn)的設(shè)置至關(guān)重要,通過(guò)不同的截?cái)嘀涤?jì)算出的NRI結(jié)果可能有很大差異,結(jié)合臨床進(jìn)行截?cái)嘀档脑O(shè)置。本案例中,將截?cái)嘀翟O(shè)置為0.2,0.4,截?cái)嘀?lt;0.2為低風(fēng)險(xiǎn),截?cái)嘀?gt;0.4為高風(fēng)險(xiǎn)。niter設(shè)置bootstrap次數(shù),updown設(shè)置“category”表示計(jì)算分類NRI。
從結(jié)果可以看到總?cè)藬?shù)515,病例數(shù)87,對(duì)照組428人。
Reclassification Table for all subjects中的針對(duì)所有人的研究結(jié)果。根據(jù)設(shè)置的截?cái)嘀?,將病人分為了低,中,高風(fēng)險(xiǎn)。第一行new表示新模型的分類情況,standard表示舊模型的分類情況。理解即為343人在新舊模型中被認(rèn)為是低風(fēng)險(xiǎn),21在新模型中為中風(fēng)險(xiǎn),舊模型中為低風(fēng)險(xiǎn),1人在新模型中高風(fēng)險(xiǎn),舊模型中低風(fēng)險(xiǎn),以此類推。
Point estimates中表示分類NRI的點(diǎn)估計(jì)值。其中NRI表示所有研究對(duì)象的分類NRI的點(diǎn)估計(jì)值,NRI+表示病例組的分類NRI的點(diǎn)估計(jì)值,NRI-表示對(duì)照組中的分類NRI點(diǎn)估計(jì)值。
Point & Interval estimates表示NRI的置信區(qū)間。
紅色表示病例組,黑色表示對(duì)照組,虛線表示截?cái)嘀担?/p>
計(jì)算NRI之間的P值:
z=abs(cg$nri$Estimate/cg$nri$Std.Error)
cg$nri$pvalue<-(1-pnorm(z))*2
cg$nri
?P值均大于0.05,說(shuō)明不存在統(tǒng)計(jì)學(xué)差異,即新舊模型相較,從分類NRI角度沒有差異。
連續(xù)性NRI計(jì)算
set.seed(123)
cf<-nribin(mdl.std =mstd ,
mdl.new = mnew,
cut =0,
niter = 1000,
updown = 'diff')
cut設(shè)置為0,updown設(shè)置為“diff”表示計(jì)算連續(xù)型NRI
計(jì)算NRI的p值
z=abs(cf$nri$Estimate/cf$nri$Std.Error)
cf$nri$pvalue<-(1-pnorm(z))*2
cf$nri
?通過(guò)P值可以看到在連續(xù)型NRI,NRI-的P值小于0.05,存在統(tǒng)計(jì)學(xué)差異,即新模型相較舊模型好,對(duì)于人群提升0.395048,對(duì)于對(duì)照組提升0.4065;NRI+并無(wú)統(tǒng)計(jì)學(xué)意義。
3. IDI
提取出模型中的預(yù)測(cè)值fitted.values
pstd = mstd$fitted.values
pnew = mnew$fitted.values
利用PredictABEL包中的函數(shù)reclassification計(jì)算
#install.packages("PredictABEL")
library(PredictABEL)
reclassification(data=as.matrix(data),
cOutcome = 1,
predrisk1 = pstd,
predrisk2 = pnew,
cutoff = c(0,0.2,0.4,1))
需要將data處理為矩陣,cOutcome設(shè)置因變量位于矩陣的第幾列;選項(xiàng)predrisk1指定舊模型,predrisk2指定新模型,cutoff值設(shè)置截?cái)帱c(diǎn)。
%reclassified表示重分類百分比。
輸出的最后三行分別給出了分類NRI,連續(xù)NRI,IDI的結(jié)果,以及對(duì)應(yīng)的p值。從IDI角度,IDI為0.0203,95%CI為0.0041-0.0365,p值<0.05,存在統(tǒng)計(jì)學(xué)差異,新模型較舊模型提高了0.0203,為正改善。
PredictABL包還可以繪制calibration曲線:
plotCalibration(data=as.matrix(data), cOutcome=1, predRisk=pstd, groups=10, rangeaxis=c(0,1)) plotCalibration(data=data, cOutcome=1, predRisk=pnew, groups=10, rangeaxis=c(0,1))
ROC曲線:
plotROC(data=data, cOutcome=1, predrisk=cbind(pstd,pnew), labels=c("Model Old","Model New"))
預(yù)測(cè)風(fēng)險(xiǎn)分布圖:
plotRiskDistribution(data=data, cOutcome=1, risks=pnew, interval=0.05, plottitle=maintitle, rangexaxis=c(0,1), rangeyaxis=c(0,30), xlabel="Predicted risk", ylabel="Percentage", labels=c("Without outcome", "With outcome"))
生存資料
案例:原發(fā)性膽汁性肝硬化研究
1. rms包擬合的生存曲線
C指數(shù)
載入數(shù)據(jù)
load("pbc.Rdata")
pbc<-na.omit(pbc)
library(rms)
dd=datadist(pbc)
options(datadisk="dd")
fit.cox <- cph(formula=Surv(days,status) ~ascites+edema+bili+albumin+copper+prothrombin+chol,
data=pbc,
x=TRUE,y=TRUE,surv=TRUE)
計(jì)算C-index(pec包中的cindex()函數(shù))
set.seed(123)
library(pec)
c_index<-cindex(object=list(fit.cox),
formula=Surv(days,status) ~1,
eval.times=c(365,365*3,365*5,365*10),
cens.model = "marginal",
splitMethod = "bootcv",
B=1000)
c_index
object指定模型,formula指定為Surv(生存時(shí)間,生存結(jié)局)~1,cens.model必須為“marginal”(如果formula中的公式帶有自變量,則cens.model需要為cox,結(jié)果也略有不同。)
eval.times設(shè)置需要計(jì)算的時(shí)間點(diǎn)的C指數(shù);
cens.medol指定截尾數(shù)據(jù)的逆概率加權(quán)方法;
splitMethod表示才用的重抽樣的方法行交叉驗(yàn)證;B為抽樣次數(shù)。
Appcindex是指未經(jīng)校正的C指數(shù);BootCVCindex表示交叉驗(yàn)證的C指數(shù)。
繪制Time—C-index曲線
plot(c_index,
xlim = c(0,4000),
legend=FALSE)
比較兩個(gè)模型的C指數(shù)
load("pbc.Rdata")
pbc<-na.omit(pbc)
library(rms)
dd=datadist(pbc)
options(datadisk="dd")
fit.cox <- cph(formula=Surv(days,status) ~ascites+edema+bili+albumin+copper+prothrombin+chol,
data=pbc,
x=TRUE,y=TRUE,surv=TRUE)
fit2.cox <- cph(formula=Surv(days,status) ~treatment+age+sex+ascites+hepatom+
spiders+edema+bili+chol+albumin+copper+alk+sgot+trig+
platelet+prothrombin+stage,
data=pbc,
x=TRUE,y=TRUE,surv=TRUE)
predvalue <- predict(fit.cox)
predvalue2 <- predict(fit2.cox)
模型比較:
#install.packages("compareC")
library(compareC)
compareC(timeX=pbc$days, statusX=pbc$status, scoreY=-predvalue, scoreZ=-predvalue2)
?模型1的C指數(shù)為0.8272,模型2的C指數(shù)為0.8485859,差值為-0.021,統(tǒng)計(jì)檢驗(yàn)Z統(tǒng)計(jì)量為-2.414,p值為0.0158,說(shuō)明兩個(gè)模型之間存在統(tǒng)計(jì)學(xué)差異。
2. survival包擬合的生存曲線
C指數(shù)
survival包中coxph會(huì)自動(dòng)計(jì)算出C指數(shù):
library(survival)
fit2.cox<-coxph(formula=Surv(days,status) ~ascites+edema+bili+albumin+copper+prothrombin+chol,
data=pbc)
summary(fit2.cox)
c_index<-summary(fit2.cox)$concordance
c_index
可信區(qū)間:
c_index["C"]-1.96*c_index["se(C)"]
c_index["C"]+1.96*c_index["se(C)"]
其他方法:
方法一:
BiocManager::install("survcomp") library(survcomp) cindex <- concordance.index(x=predvalue, surv.time=pbc$days, surv.event =pbc$status, method = "noether") cindex$c.index cindex$lower cindex$upper
方法二:
c_index <- survConcordance(formula=Surv(days,status)~predict(fit.cox,data=pbc), data = pbc)$concordance
方法三:
v <- validate(fit.cox, dxy=TRUE, B=1000) orig_Dxy = v[rownames(v)=="Dxy", colnames(v)=="index.orig"] corrected_Dxy = v[rownames(v)=="Dxy", colnames(v)=="index.corrected"] orig_c_index <- abs(orig_Dxy)/2+0.5 bias_corrected_c_index <- abs(corrected_Dxy)/2+0.5 orig_c_index;bias_corrected_c_index
NRI計(jì)算
創(chuàng)建新舊兩個(gè)生存模型:
library(survival)
m.old = coxph(formula=Surv(days,status)~bili+albumin,
data=pbc,
x=TRUE)
m.new = coxph(formula=Surv(days,status)~bili+albumin+copper,
data=pbc,
x=TRUE)
計(jì)算分類NRI:
library(nricens)
set.seed(123)
nricens(mdl.std = m.old,
mdl.new = m.new,
t0 = 365*10,
cut = c(0.2, 0.4),
updown = "category",
niter = 1000)
t0指定需要計(jì)算的時(shí)間,cut設(shè)置截?cái)嘀?,updown設(shè)置為分類,niter設(shè)置bootstrap的次數(shù)。
針對(duì)于全部研究對(duì)象,分類變量NRI=0.136,新模型較舊模型重新分類正確比例提高了13.6%;
針對(duì)于病例組,分類NRI=0.022,新模型較舊模型重新分類正確比例提高了2.2%;
針對(duì)于對(duì)照組,分類NRI=0.115,新模型較舊模型重新分類正確比例提高了1.1%。
計(jì)算連續(xù)型NRI:
set.seed(123)
nricens(mdl.std = m.old,
mdl.new = m.new,
t0 = 365*10,
cut = 0,updown = "diff",
niter = 1000)
輸出的結(jié)果中 of subjects with "p.new-p.std>cut" for all, case, control:93 54 6 表示在時(shí)點(diǎn)3650天,新模型的概率減去舊模型的概率大于截?cái)帱c(diǎn)(0)的人數(shù)。
IDI
surv<-pbc[,c("days","status")]
x.old = pbc[,c("bili", "albumin")]
x.new = pbc[,c("bili", "albumin","copper")]
因變量賦值給surv,自變量賦值給x.old和x.new。
#install.packages("survIDINRI")
library(survIDINRI)
set.seed(123)
IDI<-IDI.INF(indata=surv,
covs0=x.old,
covs1=x.new,
t0=3650,
npert=1000)
IDI.INF.OUT(IDI)
indata指定因變量,即是生存時(shí)間和生存結(jié)局;covs0指定舊模型的自變量,covs1指定新模型的自變量,t0指定計(jì)算時(shí)間點(diǎn),npert指定bootstrap次數(shù)。
IDI.INF.OUT()函數(shù)讀取出結(jié)果
M1表示IDI,IDI為0.039,其可信區(qū)間為(-0.001,0.097),p值為0.062>0.05,無(wú)統(tǒng)計(jì)學(xué)意義。M2表示連續(xù)NRI;M3表示中位數(shù)差異。
圖形展示:
IDI.INF.GRAPH(IDI)
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-859564.html
紅色區(qū)域?yàn)镮DI的情況,面積越大,新模型越優(yōu)于原來(lái)的舊模型。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-859564.html
到了這里,關(guān)于7.評(píng)價(jià)預(yù)測(cè)模型——C指數(shù),NRI,IDI計(jì)算的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!