7.评价预测模型——Calibration校准曲线

目录

二分类资料

1. 单一模型校准曲线

lrm()函数拟合的logistic模型

glm()函数拟合的logistic模型

a.Score()函数

B.val.prob()函数

2.多模型校准曲线

lrm()拟合的logistic回归

glm()拟合的logistic回归

生存资料

​编辑

单模型单时点校准曲线

rms包cph()函数拟合的生存模型

survival包coxph()函数拟合的生存模型

单模型多时点校准曲线

多模型同时点校准曲线

cph()函数

coxph()函数


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
绘制二分类模型的校准曲线可以帮助我们评估模型的准确性置信度。Python中可以使用`sklearn.calibration.calibration_curve`函数来绘制校准曲线。以下是绘制校准曲线的步骤: 第一步,导入需要的库模块: ```python from sklearn import calibration, datasets, linear_model, metrics from sklearn.model_selection import train_test_split import matplotlib.pyplot as plt ``` 第二步,准备数据: ```python # 使用一个示例数据集 X, y = datasets.make_classification(n_samples=1000, n_features=20, random_state=42) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) ``` 第三步,构建分类模型: ```python # 假设使用一个逻辑回归分类模型 classifier = linear_model.LogisticRegression() classifier.fit(X_train, y_train) ``` 第四步,使用测试数据生成预测概率: ```python # 生成分类概率预测 y_pred_prob = classifier.predict_proba(X_test)[:, 1] ``` 第五步,绘制校准曲线: ```python # 绘制校准曲线 fraction_of_positives, mean_predicted_value = calibration.calibration_curve(y_test, y_pred_prob, n_bins=10) plt.plot(mean_predicted_value, fraction_of_positives, "s-", label="Classifier") plt.plot([0, 1], [0, 1], "k:", label="Perfectly calibrated") plt.xlabel("Mean predicted value") plt.ylabel("Fraction of positives") plt.legend() plt.show() ``` 这样就能够绘制出二分类模型的校准曲线校准曲线描述了分类器预测的正例分数与观测到的实际正例比例之间的关系。如果校准曲线与理想的理想曲线(完美校准线)越接近,表示分类模型有更好的校准性能。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值