ROC曲线是临床中常用的统计分析之一,R中可以绘制ROC曲线的包也有很多,pROC
包就是其中的佼佼者。
pROC包可以计算AUC和95%置信区间,可以可视化、平滑和比较ROC曲线。
pROC
包中的常用缩写
缩写 | 解释 |
---|---|
ROC曲线 | 受试者操作特征曲线 |
AUC | ROC曲线下面积 |
pAUC | 部分ROC曲线下面积 |
CI | 置信区间 |
SP | 特异度specificity |
SE | 灵敏度sensitivity |
今天来学习下怎么使用pROC
包来计算ROC曲线的各种统计数值。
目 录
- 1. 安装和加载R包
- 2. 读取内置数据集
- 3. 建立拟合曲线
- 4. 计算AUC和95%CI
- 5. 计算和可视化pAUC
- 5.1 计算pAUC
- 5.2 可视化pAUC
- 6. 亚组ROC分析
- 7. 比较两ROC曲线有无差异
- 8. auc()函数
- 9. ci()函数
1. 安装和加载R包
install.packages("pROC") # 安装pROC包
library(pROC) # 加载pROC包
2. 读取内置数据集
使用pROC包自带的aSAH
数据集来演示。该数据集包括了113例动脉瘤蛛网膜下腔出血患者的临床和实验室资料。
data(aSAH) # 加载内置数据集
View(aSAH) # 查看数据集

3. 建立拟合曲线
在pROC包中,使用roc()函数来建立ROC对象。默认情况下roc()函数会输出AUC的值。
roc1 <- roc(aSAH$outcome, aSAH$s100b,
levels=c("Good", "Poor"))
roc2 <- roc(aSAH$outcome, aSAH$ndka,
levels=c("Good", "Poor"))
roc1;roc2

如果在roc()函数中添加参数ci=TRUE
,则可以输出AUC的置信区间。
roc3 <- roc(aSAH$outcome, aSAH$s100b,
levels=c("Good", "Poor"),
ci=TRUE) # 输出95%置信区间
roc3

4. 计算AUC和95%CI
在前面roc()函数创建的ROC对象中已经包含了AUC信息,但是还可以使用auc()
函数来计算AUC和pAUC,使用ci()
函数或ci.auc()
函数来计算AUC和pAUC的95%置信区间。
auc(roc1)
ci(roc1, of = "auc") # ci.auc(roc1) 等效
auc(roc2)
ci(roc2, of = “auc”) # ci.auc(roc2) 等效
输出roc1结果:
# Area under the curve: 0.7314
# 95% CI: 0.6301-0.8326 (DeLong)
roc1的曲线下面积为0.731,95%CI为(0.630-0.833)
输出roc2结果:
# Area under the curve: 0.612
# 95% CI: 0.5012-0.7227 (DeLong)
roc2的曲线下面积为0.612,95%CI为(0.501–0.723)
5. 计算和可视化pAUC
5.1 计算pAUC
auc(roc1, # 前面构建的roc1对象
partial.auc=c(1, 0.8), # 指定计算pAUC的坐标轴范围
partial.auc.focus="sp", # 根据哪根轴来计算,这里指定特异度范围(x轴)来计算
partial.auc.correct = FALSE)
输出结果:
# Corrected pAUC (specificity 1-0.8): 0.08059。
5.2 可视化pAUC
plot(roc1,
print.auc=TRUE, # 图像上输出AUC值
print.auc.x=0.5,print.auc.y=0.5, # AUC值的坐标位置为(x,y)
auc.polygon=TRUE, # 将ROC曲线下面积转化为多边形
auc.polygon.col="skyblue", # 设置多边形填充颜色为skyblue
partial.auc=c(1, 0.8), # 指定计算pAUC的坐标轴的范围
partial.auc.focus="sp", # 根据哪根轴来计算,这里指定特异度范围(x轴)来计算
reuse.auc=F)

根据灵敏度(y轴)来计算,如partial.auc.focus = "se"
,其他代码不变。

6. 亚组ROC分析
选取男性进行分析。
roc4 <- roc(outcome ~ s100b,
data=aSAH,
subset=(gender == "Male"))
roc4
输出结果:
# Call:
# roc.formula(formula = outcome ~ s100b, data = aSAH, subset = (gender == "Male"))
# Data: s100b in 22 controls (outcome Good) < 20 cases (outcome Poor).
# Area under the curve: 0.7727
选取女性进行分析。
roc5 <- roc(outcome ~ s100b,
data=aSAH,
subset=(gender == "Female"))
roc5
输出结果:
# Call:
# roc.formula(formula = outcome ~ s100b, data = aSAH, subset = (gender == "Female"))
# Data: s100b in 50 controls (outcome Good) < 21 cases (outcome Poor).
# Area under the curve: 0.72
7. 比较两ROC曲线有无差异
roc.test()
函数可以比较两条ROC曲线有没有统计学差异。
roc.test(roc1, roc2, method = "delong")
# 默认使用delong法
# 其他两种比较方法为"bootstrap"或"venkatraman";
# 三种方法可以使用首字母来表示,如"d"、"b"、"v"。
输出结果
# DeLong's test for two correlated ROC curves
# data: roc1 and roc2
# Z = 1.3908, p-value = 0.1643
# alternative hypothesis: true difference in AUC is not equal to 0
# sample estimates:
# AUC of roc1 AUC of roc2
# 0.7313686 0.6119580
从输出结果可知,p-value = 0.1643>0.05
,两条ROC曲线无统计学差异。另外结果还输出了两条ROC曲线的AUC。
8. auc()函数
auc()函数可以用来计算ROC曲线下面积。默认计算AUC,但是也可以计算pAUC。
函数调用方法:
auc(roc,
partial.auc=FALSE,
partial.auc.focus=c("specificity","sensitivity"),
partial.auc.correct=FALSE,
allow.invalid.partial.auc.correct = FALSE, ...)
## 参数解释
roc # 通过roc()函数建立的ROC对象
partial.auc # 逻辑词,默认为FALSE,计算AUC;
# 如果要计算pAUC,则输入长度为2的数值向量;
# 如果图形坐标轴范围为0-1,则输入如partial.auc=c(1, 0.8);
# 如果图形坐标轴范围为0-100,则输入如partial.auc=c(100, 80)。
partial.auc.focus # 如果partial.auc = FALSE,则忽略这个参数;
# 如果为TRUE,且需要计算pAUC,则指定是根据特异度(默认)还是灵敏度来计算pAUC;
# 可以使用缩写 spec/sens 或者 sp/se 来表示特异度和灵敏度。
9. ci()函数
ci()函数是用来计算ROC曲线的置信区间,函数中的参数of
控制要计算的CI类型,CI类型包括auc
、thresholds
、sp
、se
或coords
。注意:平滑后的ROC曲线不能计算thresholds
的置信区间。
函数调用方法:
ci(roc, # 通过roc()函数创建的ROC对象
of = c("auc", "thresholds", "sp", "se", "coords"),
# 通过参数of,控制计算的CI类型
...)
pROC包是目前功能最全面的ROC曲线专业绘制包,可以多探索探索。