手动绘制logistic回归预测模型校准曲线(Calibration curve)(1)

校准曲线图表示的是预测值和实际值的差距,作为预测模型的重要部分,目前很多函数能绘制校准曲线。
一般分为两种,一种是通过Hosmer-Lemeshow检验,把P值分为10等分,求出每等分的预测值和实际值的差距
在这里插入图片描述
在这里插入图片描述
另外一种是calibration函数重抽样绘制连续的校准图
在这里插入图片描述
今天我们来演示第一种,手动绘制的好处在于加深你对绘图的理解,而且能个性化的进一步处理图形。第一种绘图本质就是我们的折线图,上一章《R语言绘制带误差和可信区间的折线图》我们已经介绍了怎么绘制折线图,只要求出相关数据就可以了。
我们先导入数据,继续使用我们的早产数据,

library(ggplot2)
library(rms)
bc<-read.csv("E:/r/test/zaochan.csv",sep=',',header=TRUE)

在这里插入图片描述
这是一个关于早产低体重儿的数据(公众号回复:早产数据,可以获得该数据),低于2500g被认为是低体重儿。数据解释如下:low 是否是小于2500g早产低体重儿,age 母亲的年龄,lwt 末次月经体重,race 种族,smoke 孕期抽烟,ptl 早产史(计数),ht 有高血压病史,ui 子宫过敏,ftv 早孕时看医生的次数,bwt 新生儿体重数值。
我们先把分类变量转成因子

bc$race<-ifelse(bc$race=="black",1,ifelse(bc$race=="white",2,3))
bc$smoke<-ifelse(bc$smoke=="nonsmoker",0,1)
bc$race<-factor(bc$race)
bc$ht<-factor(bc$ht)
bc$ui<-factor(bc$ui)

建立回归方程

fit<-glm(low ~ age + lwt + race + smoke + ptl + ht + ui + ftv,
         family = binomial("logit"),
         data = bc)

得出预测概率

pr1 <- predict(fit,type = c("response"))#得出预测概率
p = pr1

使用order函数对P值排序,这里注意一下,order§排的是位置

sor <- order(p)

在这里插入图片描述
P值按order来排列

p <- p[sor]

Y值也按order来排列

y = bc[, "low"]
y <- y[sor]

把P值分为10个等分区间

groep <- cut2(p, g = 10)

计算每个等分的P值和Y值

meanpred <- round(tapply(p, groep, mean), 3)
meanobs <- round(tapply(y, groep, mean), 3)

绘图

plot(meanpred, meanobs)

在这里插入图片描述
修饰一下,好像稍微好看了点

plot(meanpred, meanobs,xlab = "Predicted risk", 
     ylab = "Observed risk", pch = 16, ps = 2, xlim = c(0, 1), 
     ylim = c(0, 1), cex.lab = 1.2, cex.axis = 1.1, 
     las = 1)
abline(0, 1, col = "grey", lwd = 1, lty = 1)

在这里插入图片描述
我们还可以和上一篇文章《R语言绘制带误差和可信区间的折线图》一样算出它的标准误,以便进一步计算可信区间
在这里插入图片描述
计算可信区间后可以进一步绘图

ggplot(matres, aes(x=meanpred, y=meanobs)) + 
  geom_errorbar(aes(ymin=meanobs-1.96*se, ymax=meanobs+1.96*se), width=.02)

在这里插入图片描述
添加对角线

ggplot(matres, aes(x=meanpred, y=meanobs)) + 
  geom_errorbar(aes(ymin=meanobs-1.96*se, ymax=meanobs+1.96*se), width=.02)+
  annotate(geom = "segment", x = 0, y = 0, xend =1, yend = 1)+
  expand_limits(x = 0, y = 0) + 
  scale_x_continuous(expand = c(0, 0)) + 
  scale_y_continuous(expand = c(0, 0))+
  geom_point()+
  xlab("预测概率")+
  ylab("实际概率")

在这里插入图片描述
进一步修饰

ggplot(matres, aes(x=meanpred, y=meanobs)) + 
  geom_errorbar(aes(ymin=meanobs-1.96*se, ymax=meanobs+1.96*se), width=.02)+
  annotate(geom = "segment", x = 0, y = 0, xend =1, yend = 1)+
  expand_limits(x = 0, y = 0) + 
  scale_x_continuous(expand = c(0, 0)) + 
  scale_y_continuous(expand = c(0, 0))+
  geom_point(size=3, shape=21, fill="white")+
  xlab("预测概率")+
  ylab("实际概率")

在这里插入图片描述

使用PredictABEL包的plotCalibration函数来验证一下我们计算的正确性

library(PredictABEL)
plotCalibration(data = bc,
                cOutcome = 2,#结果在第几行就选几
                predRisk = pr1,
                groups = 10,
                rangeaxis = c(0,1))

在这里插入图片描述
和我们手工计算完全一致,证明我们算得没有问题。目前也比较流行使用重抽样的方法获取可信区间,将在今后章节介绍。OK,本期到此结束。需要全部代码的请公众号回复:代码。

  • 1
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
在R中,calibrate函数是rms包中的一个函数,用于绘制logistic回归模型的校正曲线。校正曲线用于评估模型的预测准确性,并显示观测值的平均预测概率与实际发生的事件之间的关系。 下面是使用calibrate函数绘制logistic回归的校正曲线的简单示例: ```R library(rms) # 假设你已经拟合了一个logistic回归模型,命名为"model" # model <- lrm(formula, data) # 使用calibrate函数绘制校正曲线 calibration <- calibrate(model, method = "boot", B = 200) plot(calibration) ``` 上述代码中,你需要先拟合一个logistic回归模型,并将其命名为"model"。然后使用calibrate函数来计算校正曲线,其中method参数指定了计算校正曲线的方法,这里选择了"boot",表示使用自助法(bootstrap)进行计算。B参数指定了bootstrap重采样的次数。 最后,使用plot函数绘制校正曲线图形。 绘制完成后,你将会得到一个校正曲线图形。该图形将显示出观测值的平均预测概率与实际发生事件之间的关系。你可以通过观察曲线是否接近理想的对角线来评估模型的预测准确性。如果曲线与对角线接近,表示模型的预测准确性较好。如果曲线偏离对角线,表示模型存在预测偏差。 此外,你还可以通过观察图形中的曲线上的点来获取更多信息。这些点表示不同的预测概率区间,并显示实际发生事件的比例。在理想情况下,这些点应该在对角线上均匀分布。 根据校正曲线的形状和点的分布,你可以进一步解读模型的预测准确性和潜在的偏差。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天桥下的卖艺者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值