ROC及曲线面积汇总学习

目录

ROC基础

生成模拟数据

率的计算

R语言计算测试

ROCR:

pROC

ROC绘制

单个ROC

两个ROC

Logistic回归的ROC曲线

timeROC

ROC基础

ROC曲线的横坐标是假阳性,纵坐标是真阳性需要的结果是这个率表示疾病阳性的率(而不能误算为阴性的率)

ROC阳性结果还是阴性结果?_roc曲线计算阳性阴性预测值-CSDN博客

生成模拟数据
rm(list = ls())
set.seed(1234)
#模拟数据
ca125 <- c(rnorm(10,80,20),rnorm(20,50,10))
##前10个均值为80,标准差为20的正态分布数据,后20个均值为50,标准差为10的正态分布随机数
group <- c(rep(c("肿瘤","非肿瘤"),c(10,20)))#
data <- data.frame(ca125,group)

head(data)

      ca125 group
1  55.85869  肿瘤
2  85.54858  肿瘤
3 101.68882  肿瘤
4  33.08605  肿瘤
5  88.58249  肿瘤
6  90.12112  肿瘤
率的计算
#设置ca125>60,判断为肿瘤
data$pre <- ifelse(data$ca125 > 60,"猜他是肿瘤","猜他不是肿瘤")
#列联表
table(data$group,data$pre)
                猜他不是肿瘤 猜他是肿瘤
非肿瘤           19          1
肿瘤              2          8

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

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

真阳性率 = 8 / (2+8) = 0.8  
假阳性率 = 1 / (19+1) = 0.05  

如果目标结果是确定非肿瘤患者:

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

假阳性率 = 2 / (2+8) = 0.2
真阳性率 = 19 / (19+1) = 0.95  

R语言计算测试

R语言计算AUC(ROC曲线)的注意事项_r语言auc-CSDN博客

ROCR:

ROCR默认计算顺序靠后的类别的AUC。如果提供给labels的值是有序因子型变量,则排在前面的默认是阴性结果(negtive),排在后面的默认是阳性结果(positive),默认计算阳性结果(排序靠后)的AUC。如果是无序因子、数值、字符、逻辑型变量,会按照R语言的默认排序,比如按照数字大小、首字母顺序等,也是计算排序靠后的类别的AUC。


set.seed(20220840)
ca125_1 <- c(rnorm(10,80,20),rnorm(20,50,10))
ca125_2 <- c(rnorm(10,20,20),rnorm(20,70,10))
class=c(rep(1:0,c(10,20)))
 
tumor <- c(rep(c("癌症","非癌症"),c(10,20)))
 
df <- data.frame(`class`=class,`ca125_1`=ca125_1,`ca125_2`=ca125_2,
                 `tumor`=tumor
                 )
library(ROCR)
 
pred <- prediction(predictions = ca125_1, # 预测指标
                   labels = tumor # 真实结果
                   )
 
performance(pred, "auc")@y.values[[1]]
# [1] 0.075

这里我们想计算癌症的AUC,而不是非癌症的AUC,手动指定顺序!

pred <- prediction(predictions = ca125_1, # 预测指标
                   labels = tumor # 真实结果
                   ,label.ordering = c("非癌症","癌症") # 此时就是计算癌症的AUC
                   )
 
performance(pred, "auc")@y.values[[1]]
## [1] 0.925
pROC

pROC包计算AUC也需要用来预测结果的指标以及真实结果。

这个包计算pROC略有不同,它是根据中位数来的,谁的中位数大,就计算谁的AUC,比如我们的这个例子,计算下中位数看看:

ca125_1

# 把ca125_1按照tumor的两个类别进行分组,然后分别计算中位数
tapply(ca125_1, tumor, median)
##     癌症   非癌症 
## 81.34426 49.99926(肿瘤的均值大)

library(pROC)
roc(response=tumor, predictor=ca125_1)
#Area under the curve: 0.925(计算结果为癌症的)

ca125_2:是计算非癌症的AUC。

tapply(ca125_2, tumor, median)
##     癌症   非癌症 
## 13.52771 69.69272(非肿瘤的平均数大)

roc(response=tumor, predictor=ca125_2)
Data: ca125_2 in 10 controls (tumor 癌症) < 20 cases (tumor 非癌症).
Area under the curve: 0.9

#需要设置levels和direction
# 此时计算的就是癌症的AUC
roc(response=tumor, predictor=ca125_2,
    levels=c("非癌症", "癌症"), # 这个顺序随便设定,重要的是direction
    direction = "<" # 手动设定非癌症 < 癌症
)
#Data: ca125_2 in 20 controls (tumor 非癌症) < 10 cases (tumor 癌症).
#Area under the curve: 0.1

ROC绘制

各章示例代码/Chapter13 临床诊断实验评价.R · 杨敏迪/Analysis of Medical data by R language - 码云 - 开源中国 (gitee.com)

单个ROC

数据为动脉瘤性蛛网膜下腔出血患者的检测数据和预后:s100b是一个血清指标,outcome根据格拉斯哥评分分为good(4-5分:这里最大为5) 、poor(1-3分)

rm(list = ls())
library(pROC)
data(aSAH)
roc1 <- roc(outcome ~ s100b, data = aSAH)
attributes(roc1)#查看结果包含内容
roc1$auc#
#Area under the curve: 0.7314
> #求约登指数
> roc.result <- data.frame(threshold = roc1$thresholds,
+                          sensitivity = roc1$sensitivities,
+                          specificity = roc1$specificities)
> View(roc.result)
> roc.result$youden <- roc.result$sensitivity + roc.result$specificity - 1
> head(roc.result)
  threshold sensitivity specificity      youden
1      -Inf   1.0000000  0.00000000  0.00000000
2     0.035   0.9756098  0.00000000 -0.02439024
3     0.045   0.9756098  0.06944444  0.04505420
4     0.055   0.9756098  0.11111111  0.08672087
5     0.065   0.9756098  0.13888889  0.11449864
6     0.075   0.9024390  0.22222222  0.12466125
> #找出约登指数最大的一行
> which.max(roc.result$youden)
[1] 18
> roc.result[18, ]
   threshold sensitivity specificity    youden
18     0.205   0.6341463   0.8055556 0.4397019

绘图

?plot.roc#查看参数细节
plot.roc(roc1, 
         print.auc = TRUE, 
         auc.polygon = TRUE,
         grid = c(0.1,0.2), 
         grid.col = c("green","red"),
         auc.polygon.col = "lightblue", 
         print.thres = TRUE)
#AUC的置信区间——DeLong法
ci.auc(roc1)

两个ROC
roc1 <- roc(aSAH$outcome, aSAH$s100b)
roc2 <- roc(aSAH$outcome, aSAH$ndka)
#DeLong非参数方法,Venkatraman回归模型法,bootstrap重抽样法
#默认为DeLong法
#默认为两组相关检测结果AUC的比较
#独立:参数paired = FALSE
roc.test(roc1,roc2)
#绘图
plot(roc1)
lines(roc2, col = "red")
test <- roc.test(roc1, roc2)
text(0.5,0.5, labels = paste("p-value = ",round(test$p.value, 3)))
legend("bottomright",
       legend = c("S100b", "NDKA"),
       col = c("1","red"), lwd = 2)

Logistic回归的ROC曲线

二分类变量

data = infert
#建立Logistic回归模型
fit <- glm(case ~ induced + spontaneous, family = binomial, data = infert)
library(epiDisplay)
logistic.display(fit)
#ROC绘制
lroc(fit, line.col = "red", lwd = 2)

timeROC

如何绘制时间依赖性ROC曲线? (qq.com)

参考:

1:《R语言医学数据分析实战》

2:R语言计算AUC(ROC曲线)的注意事项_r语言auc-CSDN博客

3:ROC阳性结果还是阴性结果?_roc曲线计算阳性阴性预测值-CSDN博客

4:各章示例代码/Chapter13 临床诊断实验评价.R · 杨敏迪/Analysis of Medical data by R language - 码云 - 开源中国 (gitee.com)

5:如何绘制时间依赖性ROC曲线? (qq.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/196165.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

采用NTC进行温度测量典型电路

本文介绍采用NTC进行温度测量典型电路。 采用NTC进行温度测量的电路有多种&#xff0c;典型的有恒流法和恒压法。在一般要求不高的应用场合&#xff0c;恒压法用的比较多&#xff0c;本文介绍一种采用恒压法进行NTC温度测量电路。 1.原理图 原理图如下图所示&#xff1a; 此…

springboot云HIS医院信息综合管理平台源码

满足基层医院机构各类业务需要的健康云HIS系统。该系统能帮助基层医院机构完成日常各类业务&#xff0c;提供病患挂号支持、病患问诊、电子病历、开药发药、会员管理、统计查询、医生站和护士站等一系列常规功能&#xff0c;能与公卫、PACS等各类外部系统融合&#xff0c;实现多…

QT linux下应用程序打包

一、应用程序app 1、应用程序的pro文件 2、 程序工作函数 3、app的UI界面 二、动态库lib 1、Lib类头文件 2、.cpp文件 三、对应用程序和动态库进行构建 1、对动态库进行qmake,然后进行构建 2、对应用程序进行qmake&#xff0c;然后进行构建 3、查看构建目录 四、编写脚本 …

RPA机器人如何解决非银企直联网银账户的数据自动采集?

数字时代来临&#xff0c;随着全球信息化水平的不断提升&#xff0c;企业们纷纷向自动化办公、数字化转型靠拢。财务部门作为一个企业的重要部门&#xff0c;承担着管理和监控公司所有项目的重要职责&#xff0c;因而一直被视为企业数字化转型的重要突破口。 由于企业经营理念和…

局部内部类(内部类) - Java

局部内部类 说明&#xff1a;局部内部类是定义在外部类的局部位置&#xff0c;比如方法中&#xff0c;并且有类名。 LocalInnerClass.java 非常重要的几点&#xff01;&#xff01; 局部内部类本质还是一个类&#xff0c;该有的属性方法也都可以有。【举例a.见下文】可以直接…

传奇手游白日门【纵横天下】win服务端+双端+GM后台+详细架设教程

搭建资源下载地址&#xff1a;传奇手游白日门【纵横天下】win服务端双端GM后台详细架设教程-海盗空间

C++: String类接口学习

文章目录 STL简介一. 为什么要有string类二. STL 中的 string 类介绍1. string 类描述2. 关于 basic_string 三. string 类的常用接口1. string 类的常见构造2. string 类的容量操作size 和 lengthcapacitymax_sizereserveresize 3. string 类对象的访问及遍历操作operator[] 和…

centos服务器扩容

centos服务器扩容 我的情况是&#xff0c;原服务器是一个80g磁盘&#xff0c;管理员又追加了120G到这块磁盘上&#xff0c;需要把这120G重新追加使用。 请确认你遇到的情况是否和我初始截图一致&#xff0c;再往下看&#xff0c;免得浪费时间与精力 服务器中有120G尚未使用&…

典型的SAST支持检测标准

这里我们列举了Coverity、Cobot、代码卫士、Klocwork、QAC、C test几款典型的SAST工具&#xff0c;看看他们都是支持那些C、C标准&#xff08;主要是C、C标准&#xff0c;其它语言较少&#xff09;呢&#xff1f; 这可以作为厂商研发的方向标。 &#xff08;结束&#xff09;

更高效的图片预览方案

传统的图片预览方式是什么样子的呢&#xff1f; 首先是用户选择一张图片&#xff0c;通过ajax上传到服务器&#xff0c;然后服务器返回一个访问url 然后给img标签的src属性设置这个访问url。 那这就会有一个问题&#xff0c;用户为什么要先网络上传上去再预览呢&#xff0c;我…

docker容器的生命周期管理常用命令

容器的生命周期管理命令 docker create &#xff1a;创建一个新的容器但不启动它 docker create nginx docker run :创建一个新的容器并运行一个命令 常用选项&#xff1a; 常用选项1. --add-host&#xff1a;容器中hosts文件添加 host:ip 映射记录 2. -a, --attach&#…

银行各类计算公式汇总

一、存款准备金 存款准备金&#xff0c;分为法定存款准备金和超额存款准备金&#xff08;主要构成是存放央行及现金&#xff0c;不包括存放同业资金&#xff09;。下表为目前最新的各类银行业金融机构存款准备金水平。 法定存款准备金率是指中央银行规定的&#xff0c;存款性…

python如何抓取携程酒店的价格,让工作更简单点

有时候老板没事安排点事&#xff0c;为了偷懒&#xff0c;只能使出大招&#xff0c;毕竟自己不是那么老老实实干活的人&#xff0c;整理数据这类累和繁琐的活&#xff0c;我怎么能轻易动&#xff0c;好在gpt可以帮我来实现&#xff0c;有人可能会说&#xff0c;这么点内容你还不…

深入理解main方法-Java

深入理解main方法-Java 一、语法说明二、特别说明三、动态传值 一、语法说明 public static void main(String[] args)main方法是虚拟机调用的java虚拟机需要调用类的main()方法&#xff0c;所以该方法的访问权限必须是publicjava虚拟机在执行main()方法时不必创建对象&#x…

djangorestframework modelserializer 处理关系字段

djangorestframework modelserializer 处理关系字段 1.关系 一对一、多对一、多对多 2.drf modelserializer对关系字段的处理 modelserializer默认处理关系字段为PrimaryKeyRelatedField&#xff0c;默认是id-pk。 多对一&#xff1a;直接写入id 多对多&#xff1a;写入id-lis…

科东快讯 | Intewell鸿道工业操作系统亮相丝路峰会暨中国新工业博览会

近日&#xff0c;第十六届中国工业论坛丝路峰会暨中国新工业博览会在陕西西安临空会展中心圆满落幕&#xff01; 峰会围绕“十四五”工业经济高质量发展的新使命、新担当&#xff0c;以“新工业新动能新格局”为主题&#xff0c;聚焦新兴工业领域&#xff0c;突出新工业产业集…

队列的实现

1.队列的概念及结构 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出 FIFO(First In First Out) 入队列&#xff1a;进行插入操作的一端称为队尾出队列&#xff1a;进行删除操作的一端称为队头 …

媒介盒子分享:实用软文写作技巧

信息洪流中品牌方如果想要抓住用户注意力就需要一定的技巧&#xff0c;而品牌方写软文时是不是经常面临无法与用户产生共鸣、软文没有转化率的困境。今天媒介盒子就来和大家分享&#xff1a;实用软文写作技巧。 一、 强化优势 人一定是会往自己喜欢的方向走&#xff0c;远离不…

图解系列--Web服务器,Http首部

1.用单台虚拟主机实现多个域名 HTTP/1.1 规范允许一台 HTTP 服务器搭建多个 Web 站点。。比如&#xff0c;提供 Web 托管服务&#xff08;Web Hosting Service&#xff09;的供应商&#xff0c;可以用一台服务器为多位客户服务&#xff0c;也可以以每位客户持有的域名运行各自不…

深度视觉目标跟踪进展综述

1 引言 目标跟踪旨在基于初始帧中指定的感兴趣目标( 一般用矩形框表示) &#xff0c;在后续帧中对该目标进行持续的定位。 基于深度学习的跟踪算法&#xff0c;采用的框架包括相关滤波器、分类式网络、双路网络等。 处理跟踪任务的角度&#xff0c;分为基于匹配思路的双路网…