关于ROC曲线的内容很重要,无论是在医学统计、机器学习,还是临床预测模型中,都是很重要的内容,大家务必要掌握!

大家都知道ROC曲线的横坐标是假阳性率,纵坐标是真阳性率,根据数据,我们可以计算很多个假阳性率和真阳性率,然后就可以在坐标轴上画出很多个点,把这些点连接成线就是ROC曲线了。

那这些横纵坐标的值到底是怎么计算的呢?

假如,我想根据ca125的值判定一个人到底有没有肿瘤,找了10个肿瘤患者,20个非肿瘤患者,都给他们测一下ca125,这样就得到了30个ca125的值。

set.seed(20220840)
ca125_1 <- c(rnorm(10,80,20),rnorm(20,50,10))# 30个人的ca125的值如下
ca125_1
##  [1]  51.88470  82.45907 113.66834  63.49476  98.29077  63.27374  74.25079
##  [8]  80.22945  83.01740  99.17105  42.52889  54.56804  48.88383  65.67865
## [15]  44.73153  45.99028  55.82554  42.79242  60.84917  64.80764  51.11468
## [22]  43.40118  47.03850  44.75943  68.34163  60.83829  53.32599  59.92225
## [29]  46.46360  30.02914

假定前10个人是肿瘤,后20个人是非肿瘤。

outcome <- c(rep(c("肿瘤","非肿瘤"),c(10,20)))
outcome
##  [1] "肿瘤"   "肿瘤"   "肿瘤"   "肿瘤"   "肿瘤"   "肿瘤"   "肿瘤"   "肿瘤"
##  [9] "肿瘤"   "肿瘤"   "非肿瘤" "非肿瘤" "非肿瘤" "非肿瘤" "非肿瘤" "非肿瘤"
## [17] "非肿瘤" "非肿瘤" "非肿瘤" "非肿瘤" "非肿瘤" "非肿瘤" "非肿瘤" "非肿瘤"
## [25] "非肿瘤" "非肿瘤" "非肿瘤" "非肿瘤" "非肿瘤" "非肿瘤"
df <- data.frame(`outcome`=outcome,`ca125`=ca125_1)
psych::headtail(df)
##     outcome  ca125
## 1      肿瘤  51.88
## 2      肿瘤  82.46
## 3      肿瘤 113.67
## 4      肿瘤  63.49
## ...    <NA>    ...
## 27   非肿瘤  53.33
## 28   非肿瘤  59.92
## 29   非肿瘤  46.46
## 30   非肿瘤  30.03

现在如果我们设置ca125>60,判断为肿瘤,ca125≤50判断为非肿瘤,就能得到如下的结果:

df1 <- transform(df, pred = ifelse(ca125>60,"猜他是肿瘤","猜他不是肿瘤"))
df1
##    outcome     ca125         pred
## 1     肿瘤  51.88470 猜他不是肿瘤
## 2     肿瘤  82.45907   猜他是肿瘤
## 3     肿瘤 113.66834   猜他是肿瘤
## 4     肿瘤  63.49476   猜他是肿瘤
## 5     肿瘤  98.29077   猜他是肿瘤
## 6     肿瘤  63.27374   猜他是肿瘤
## 7     肿瘤  74.25079   猜他是肿瘤
## 8     肿瘤  80.22945   猜他是肿瘤
## 9     肿瘤  83.01740   猜他是肿瘤
## 10    肿瘤  99.17105   猜他是肿瘤
## 11  非肿瘤  42.52889 猜他不是肿瘤
## 12  非肿瘤  54.56804 猜他不是肿瘤
## 13  非肿瘤  48.88383 猜他不是肿瘤
## 14  非肿瘤  65.67865   猜他是肿瘤
## 15  非肿瘤  44.73153 猜他不是肿瘤
## 16  非肿瘤  45.99028 猜他不是肿瘤
## 17  非肿瘤  55.82554 猜他不是肿瘤
## 18  非肿瘤  42.79242 猜他不是肿瘤
## 19  非肿瘤  60.84917   猜他是肿瘤
## 20  非肿瘤  64.80764   猜他是肿瘤
## 21  非肿瘤  51.11468 猜他不是肿瘤
## 22  非肿瘤  43.40118 猜他不是肿瘤
## 23  非肿瘤  47.03850 猜他不是肿瘤
## 24  非肿瘤  44.75943 猜他不是肿瘤
## 25  非肿瘤  68.34163   猜他是肿瘤
## 26  非肿瘤  60.83829   猜他是肿瘤
## 27  非肿瘤  53.32599 猜他不是肿瘤
## 28  非肿瘤  59.92225 猜他不是肿瘤
## 29  非肿瘤  46.46360 猜他不是肿瘤
## 30  非肿瘤  30.02914 猜他不是肿瘤

这样就能得出一个四格表:

xtabs(~outcome+pred,data = df1)
##         pred
## outcome  猜他不是肿瘤 猜他是肿瘤
##   非肿瘤           15          5
##   肿瘤              1          9

根据这个四格表我们就能算出目前的真阳性率和假阳性率:

真阳性率:猜他是肿瘤猜对的人数 / 所有肿瘤人数
假阳性率:猜他是肿瘤猜错的人数 / 所有非肿瘤人数

真阳性率 = 9 / (1+9) = 0.9
假阳性率 = 5 / (15+5) = 0.25

一个阈值就能算出1个真阳性率和假阳性率,多找几个阈值就能算出多个率,把这些率画在坐标轴里,再连成线,就是ROC曲线了。

此时,我们计算的是确定是肿瘤的真阳性率和假阳性率,画出来的也是确定是肿瘤的ROC曲线。

现在大家可以思考一个问题,如果我想知道的是确定不是肿瘤的能力,那算出来的东西还一样吗?

反过来可以吗?

一般情况下我们感兴趣的是确定是肿瘤的能力,此时真阳性率和假阳性率的计算如下:

# 首先是获得四格表
xtabs(~outcome+pred,data = df1)
##         pred
## outcome  猜他不是肿瘤 猜他是肿瘤
##   非肿瘤           15          5
##   肿瘤              1          9

真阳性率:猜他是肿瘤猜对的人数 / 所有肿瘤人数

假阳性率:猜他是肿瘤猜错的人数 / 所有非肿瘤人数

真阳性率 = 9 / (1+9) = 0.9

假阳性率 = 5 / (15+5) = 0.25

但是如果我们感兴趣的是确定为非肿瘤的能力呢?

# 此时四格表还是这个四格表
xtabs(~outcome+pred,data = df1)
##         pred
## outcome  猜他不是肿瘤 猜他是肿瘤
##   非肿瘤           15          5
##   肿瘤              1          9

但是真阳性率和假阳性率的计算已经变了!

假阳性率:猜他不是肿瘤猜错的人数 / 所有肿瘤人数
真阳性率:猜他不是肿瘤猜对的人数 / 所有非肿瘤人数

假阳性率 = 1 / (1+9) = 0.1
真阳性率 = 15 / (15+5) = 0.75

此时再多取几个阈值,画出来的就是阴性结果的ROC曲线。

不知道大家平时有没有关注过这个问题呢?

在R语言中很多画ROC曲线的包都会提供一个参数,让你可以自由选择ROC哪一个结果,一般默认都是阳性结果的ROC,比如这里的有肿瘤,如果你不放心,可以手动指定,想计算谁就计算谁!


咨询交流等,欢迎加入

ROC阳性结果还是阴性结果?相关推荐

  1. 统计学中的真阳性(TP),假阴性(FN),假阳性(FP),真阴性(TN)怎么理解?

    举个例子,假如要在一个地区进行1000人的疾病检测,我们站在上帝视角,知道这1000人中,有10人是疾病感染者,占比1%. 但实际的检测结果可能存在误差,误差包括两种情况 疾病感染者,被错误诊断为健康 ...

  2. 真阳性假阳性假阴性分割可视化

    1.分割掩码二值化 分割掩码转化为图像格式时会在分割边界处有很多灰度像素点,这将导致后续利用分割掩码和预测分割掩码进行处理时会在边界处出现很多噪声点,因此利用阈值将分割掩码转换为二值图,消除边界上的灰 ...

  3. R语言计算AUC(ROC曲线)的注意事项

    之前的推文中介绍了ROC曲线的本质以及两面性: ROC阳性结果还是阴性结果? 并详细介绍了如何手动计算真阳性率/假阳性率,以及怎样计算多个,并把点连接成线,变成ROC曲线:ROC曲线纯手工绘制 这些现 ...

  4. 阳性,阴性,假阳性,假阴性,敏感度,特异性

    一般从医学角度说,阳性(positive),代表有病或者有病毒,阴性(negative),代表正常. 假阳性(false positive)是指因为种种原因把不具备阳性症状的人检测出阳性的结果.其实就 ...

  5. 机器学习基础(一)混淆矩阵,真阳性(TP),真阴性(TN),假阳性(FP),假阴性(FN)以及敏感性(Sensitivity)和特异性(Specificity)

    机器学习基础(一) 混淆矩阵 真阳性,真阴性,假阳性,假阴性 敏感性,特异性 混淆矩阵 混淆矩阵如下图:这里以是否有心脏病举例(二分类举例),列代表机器学习算法所做的预测,有心脏病还是没有心脏病,行代 ...

  6. Recall(召回率) Precision(准确率) F-Measure E值 sensitivity(灵敏性) specificity(特异性)漏诊率 误诊率 ROC AUC

    Berkeley Computer Vision page Performance Evaluation 机器学习之分类性能度量指标 : ROC曲线.AUC值.正确率.召回率 True Positiv ...

  7. ROC 曲线/准确率、覆盖率(召回)、命中率、Specificity(负例的覆盖率)

      欢迎关注博主主页,学习python视频资源 sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频教程) https://study.163.com/course/introduction.ht ...

  8. 精确度,召回率,真阳性,假阳性

    已知如图: 查看全文 http://www.taodudu.cc/news/show-2815838.html 相关文章: TP真阳性, FP假阳性, FN假阴性, TN真阴性 统计学中的真阳性(TP ...

  9. 模式识别学习笔记——第2章—2.4 两类错误率、Neyman-Pearson决策与ROC曲线

    上一节学习了决策表,这一节我们在只有两类情况的决策表中继续深入研究.假设现在我们有两类状态分别是阳性和阴性.可以绘制出如下的决策表: 截至<模式识别(第三版)>阳性阴性状态与决策的可能性关 ...

最新文章

  1. 无人驾驶矿山赛道单笔最大融资:踏歌智行完成2亿元B轮融资
  2. 综述 | 森林微生物组:多样性,复杂性和动态变化(IF:11.3)
  3. XamarinSQLite教程添加测试数据
  4. 面向对象技术-设计模式的图
  5. Prim和Dijkstra算法的区别
  6. Java NIO:浅析I/O模型
  7. MyBatis】MyBatis一级缓存和二级缓存
  8. Oreo易支付程序开源源码分享发行版V1.3
  9. 使用 Kustomize 帮你管理 kubernetes 应用(二): Kustomize 的使用方法
  10. Mysql 解决emoji表情处理问题 - Incorrect string value: ‘\xF0\x9F\x92\x94‘ for column
  11. 返回空的list集合*彻底删除删除集合*只是清空集合
  12. mui.ajax ie8,IE8+MVVM的适配方案尝试
  13. adjoint-io bulletpoofs 性能测试结果
  14. 如何通过vin及发动机号查询车辆出险、理赔、事故记录
  15. 超市网店营销与接口测试
  16. xp计算机workgroup无法访问,弹出“Workgroup无法访问”的提示?XP 工作组没有权限的解决办法...
  17. 芝麻信用分800+的技巧,get!
  18. P4839 P哥的桶 题解
  19. 电脑可以连接网络,但是无Internet访问权限问题排查
  20. linux igb网卡,网卡驱动程序igb ixgbe

热门文章

  1. ASP.NET MVC #8211; 视图
  2. 【2022修复版】社群扫码进群活码引流完整运营源码/对接免签约支付接口/推广正常绑定下级/带视频搭建教程
  3. Superset系列8- 制作饼图
  4. c++类与对象(一)
  5. Gensim:word2vec(jieba分词,去停用词)
  6. 行业思考 | 互联网对传统行业的降维打击
  7. FTT暴雷加密熊市雪上加霜?如何对抗系统风险
  8. MatLab实现的ftt大数乘法
  9. WIN7中文专业版安装日文语言包的方法
  10. JavaSE探赜索隐三<接口>