目录
Calibration校准曲线:就是将实际发生率和预测发生率绘制的散点图。是对Hosmer-Lemeshow拟合优度检验的结果可视化。
基本原理:
首先利用列线图预测每位研究对象的预测值,并将其按从低到高的顺序排列,根据四分位数将队列分为4组(或者根据其他分位数分组),然后分别计算每组研究对象的预测值和相应的实际值得均值,并将两者结合起来作图得到4个校准点,最后将这4个校准点连接起来得到预测校准曲线。
二分类资料
1. 单一模型校准曲线
lrm()函数拟合的logistic模型
使用rms包中的lrm()函数拟合logistic模型,然后使用calibrate()函数拟合校准曲线,并使用plot()绘图
案例:肺动脉栓塞模型
#载入数据
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)
进行校准曲线拟合
cal.glm<-calibrate(fit.glm,method = "boot",B=1000)
method设置抽样的方法为bootstrap,B设置bootstrap的次数为1000。
绘制校准曲线
par(mar=c(5,5,2,1))
plot(cal.glm,
xlim = c(0,1),
ylim = c(0,1),
xlab = "Predicted Probability",
ylab="Observed Probability",
xaxs = "i",
yaxs = "i",
legend =FALSE,
subtitles = FALSE,#不显示副标题
cex=1.5,
cex.axis=1.5,
cex.lab=1.5)
abline(0,1,col="blue",lty=2,lwd=2) #绘制参考线
#调用cal.glm中的“calibrated.orig",即未校正的曲线,设置为实线,红色
lines(cal.glm[,c("predy","calibrated.orig")],type="l",lwd=2,col="red")
#调用cal.glm中的"calibrated.corrected",即校准的曲线,实线绿色
lines(cal.glm[,c("predy","calibrated.corrected")],type="l",lwd=2,col="green")
legend(x=0.55,y=0.35,
legend=c("Ideal","Apparent","Bias-corrected"),
lty = c(2,1,1),
lwd = c(2,1,1),
col = c("blue","red","green"),
bty="n",
cex=1.5)
横坐标为预测值,纵坐标为实际值,45°Ideal线为参考线,Apparent线表示预测值与实际值的拟合情况,Bias-corrected实线表示校正之后的预测值与实际值的拟合情况。
若Bias-corrected线或Apparent线越接近Ideal线,说明预测值与实际值的一致性越好。
glm()函数拟合的logistic模型
a.Score()函数
拟合logistic模型
library(riskRegression)
fit.glm = glm(formula=form.bestglm,data=data,family=binomial())
进行校准曲线拟合(跟ROC一样)
xb <-Score(object=list(fit.glm),
formula=group~1,
plots=c("calibration","ROC"),
metrics = c("auc", "brier"),
B=1000,M=50,
data=data)
绘制校准曲线:
plotCalibration(x=xb,
xlab="Predictd Risk",
ylab = "Observed Frequency",
col="black",
brier.in.legend=FALSE,
auc.in.legend=FALSE)
不显示brier的得分和AUC的值
横坐标为预测值,纵坐标为实际值,灰色斜线为参考线,黑色的曲线为预测值与实际值的拟合情况。若黑色线越靠近参考线,说明预测值与实际值的一致性好。
对X轴进行分段处理,绘制频率图
plotCalibration(x=xb,
ylab = "Frequency",
bars=TRUE,
q=7,
show.frequencies=TRUE)
bars表示绘制条图,q=7表示x轴的风险大小分成为7段;show=T表示显示频率
纵观七个频段风险,可以发现预测值与实际值之间较为接近,说明预测值和实际值的一致性好。
B.val.prob()函数
fit.glm = glm(formula=form.bestglm,data=data,family=binomial())
pred.logit<-predict(fit.glm)
phat <- 1/(1+exp(-pred.logit))
利用predict()函数预测模型fit.glm的线性预测值,然后将其转化为概率值phat。
绘制校准曲线
val.prob(p=phat,y=data$group,m=150