校准曲线图表示的是预测值和实际值的差距,作为预测模型的重要部分,目前很多函数能绘制校准曲线。
一般分为两种,一种是通过Hosmer-Lemeshow检验,把P值分为10等分,求出每等分的预测值和实际值的差距


另外一种是calibration函数重抽样绘制连续的校准图

我们既往文章《手动绘制logistic回归预测模型校准曲线》已经进行了手动绘制logistic回归预测模型校准曲线,有粉丝后台问怎么进行外部数据的校准曲线验证,其实外部数据主要是数据和P值不同,其他都是一样的,绘制起来非常简单,今天我们来演示一下。
我们先导入数据,继续使用我们的早产数据,

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)

外部验证需要外部数据,我们没有外部数据,这里把数据分为2部分,一部分建模,另一部当外部数据来验证。

set.seed(123)
tr1<- sample(nrow(bc),0.6*nrow(bc))##随机无放抽取
bc_train <- bc[tr1,]#60%数据集
bc_test<- bc[-tr1,]#40%数据集

这样我们就生成了bc_train,bc_test这2个数据集,我们用bc_train来建模,bc_test来验证模型。

建立模型

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

生成概率

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

外部数据生成概率

pr2 <- predict(fit,newdata= bc_test,type = c("response"))

生成两个数据的结局变量

y1<-bc_train[, "low"]
y2<-bc_test[, "low"]

OK,生成了概率和结局变量就可以绘图了,参照我上篇文章的方法就可以了,这里直接走下代码,因为是外部验证,所以用的是pr2和y2

p<-pr2
y =y2
sor <- order(p)
p <- p[sor]
y <- y[sor]
groep <- cut2(p, g = 10)
meanpred <- round(tapply(p, groep, mean), 3)
meanobs <- round(tapply(y, groep, mean), 3)
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)


这样外部验证的校准曲线就生成了,如果想偷懒一点可以使用我自己编写的一个小程序,绘制校准曲线还算方便,函数的主体为

gg2<-function(data,p,y,group=1,leb)

名字乱取的,不要在意这些小细节,这个函数有5个输出,可以用来进行单独的和分类的校准曲线,如果我们绘制单独的校准曲线需要data, p, y 这3个指标,就是:数据集,预测概率和结果变量,
我们操作一下,先做出bc_train建模数据的校准曲线

plot1<-gg2(bc_train,pr1,y1)

生成了一个plot1的数据,

把plot1填入下方代码中,其他都不用改,当然你想自己调整也是可以的

ggplot(plot1, 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("实际概率")


bc_test验证数据的校准曲线

plot2<-gg2(bc_test,pr2,y2)

也是把plot2填入ggplot就可以了,其他不用改,当然你想自己调整也是可以的

ggplot(plot2, 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("实际概率")


这样,外部数据的校准曲线也出来了,可以看出验证能力差了很多。
如果你想再懒一点,直接使用我的升级版gg3程序直接出图也可以

gg3(bc_train,pr1,y1)

gg3(bc_test,pr2,y2)


其实gg3就是 gg2把ggplot的绘图部分添加了进来,虽然可以直接绘图,但是减弱了你对图形的修改,我建议还是使用gg2比较好,使用了gg3其实和使用其他R包绘制校准曲线也没什么不同了。还有一点这两个程序都需要rms包和ggplot2包支持,这两个包要加载进来。
OK,本章结束,需要我的自定义函数的请公众号回复:代码。
下期说下怎么绘制这种图

更多精彩文章,请关注公众号:零基础说科研。

手动绘制R语言Logistic回归模型的外部验证校准曲线(Calibration curve)(2)相关推荐

  1. R语言Logistic回归模型亚组分析森林图(forest plot)绘制

    R语言Logistic回归模型亚组分析森林图(forest plot)绘制 目录 R语言Logistic回归模型亚组分析森林图(forest plot)R语言Logistic回归模型亚组分析森林图

  2. R语言Logistic回归模型案例(绘制列线图、校正曲线):研究低出生体重婴儿的核心影像因素

    R语言Logistic回归模型案例(绘制列线图.校正曲线):研究低出生体重婴儿的核心影像因素 目录

  3. R语言Logistic回归模型案例基于AER包的affair数据分析

    R语言Logistic回归模型案例基于AER包的affair数据 目录 R语言Logistic回归模型案例基于AER包的affair数据 #数据加载及目标变量二值化

  4. R语言Logistic回归模型案例:低出生婴儿体重的影响因素分析(列线图、校准曲线)

    R语言Logistic回归模型案例:低出生婴儿体重影响因素分析(列线图.校准曲线) 目录 R语言Logistic回归模型案例:低出生婴儿体重影响因素分析(列线图.校准曲线ÿ

  5. R语言Logistic回归模型案例:分析吸烟、饮酒与食管癌的关系

    R语言Logistic回归模型案例:分析吸烟.饮酒与食管癌的关系 目录 R语言Logistic回归模型案例分析吸烟.饮酒与食管癌的关系 #样例数据

  6. r语言结构方程模型可视化_R语言Logistic回归模型深度验证以及Nomogram绘制

    01 研究背景 本章将常用的基于R语言实现二元Logistic回归模型临床预测模型的构建和验证,以及诺曼图的绘制记录下来,更为复杂的生存分析中的Cox回归将在后续章节介绍.临床预测模型的思路总结如下: ...

  7. R语言cox回归模型案例(绘制列线图、校正曲线):放疗是否会延长胰脏癌手术患者的生存时间

    R语言cox回归模型案例(绘制列线图.校正曲线):放疗是否会延长胰脏癌手术患者的生存时间 目录

  8. r语言解释回归模型的假设_模型假设-解释

    r语言解释回归模型的假设 Ever heard of model assumptions? What are they? And why are they important? A model is ...

  9. R语言构建回归模型并进行模型诊断(线性关系不满足时)、进行变量变换(Transforming variables)、使用car包中的boxTidwell函数对预测变量进行Box–Tidwell变换

    R语言构建回归模型并进行模型诊断(线性关系不满足时).进行变量变换(Transforming variables).使用car包中的boxTidwell函数对预测变量进行Box–Tidwell变换 目 ...

最新文章

  1. Linux内存管理优化技巧集锦
  2. 加密解密php,2个比较经典的PHP加密解密函数分享
  3. useradd、adduser和userdel在使用时的注意事项
  4. 《Linux内核设计与实现》读书笔记(十七)- 设备与模块
  5. C#(WinForm)上传图片保存到数据库和从数据库读取图片显示到窗体
  6. 粒子文字特效css,CSS3 粒子效果
  7. android 端口进程号,Android中如何根据端口号寻找对应的进程
  8. Java中的enum详细解析------全面掌握Java的enum类
  9. 网上书店软件测试,网上书店测试用例.doc
  10. 微星主板更新BIOS能识别U盘但读取不到BIOS文件
  11. 什么是RS232串口RS232电平
  12. 2018蓝桥杯 明码 解题方法
  13. Encryption raised an exception
  14. FineReport 爬坑之路
  15. Axure RP中后台管理系统通用原型模板
  16. Arduino造轮子—FlashSRAM优化代码
  17. MES入门.浅谈ISA-88
  18. 用词误导:无症状指的是无肺炎症状,发烧40度、很疼痛都是无症状
  19. 利用switch实现春夏秋冬
  20. hdu4514 并查集+树直径

热门文章

  1. 三国志战略版:Daniel_S6新武锋_司马魏枪
  2. 四川麻将必胜攻略笔记(入门篇1)
  3. 物联网安全与隐私保护之物联网安全体系
  4. cocos2dx打包APK
  5. 武汉星起航跨境——中东电商蓬勃发展,亚马逊中东站点如何发货?
  6. 用python轻松实现数据分析中的RFM建模
  7. Oracle 字符集 原理及问题解决 (全)
  8. Word中孤行控制解释
  9. DNS劫持及网页跳转到莫名站点时应该怎么办?(DNS劫持和HTTP劫持及解决方法)
  10. 领悟鸿蒙时空法则,第一章 成为掌控者的办法