前言:以前使用Matlab绘制ROC曲线常常是工具箱有就画,没有就不画,而且在想画的时候工具箱恰恰就没有,很纳闷。然后无意间发现了一篇用R语言绘制ROC曲线的文章,赶紧学了并分享出来,以备不时之需。
先通过一个例子来讲解一下参数的作用,使用的数据是大名鼎鼎的Iris数据集,R语言自带。
数据处理
第一步当然得处理一下数据。默认的Iris数据集有三类鸢尾花,我目前的理解是只有二分类才画的出ROC曲线,所以才去一定的手段处理一下数据:
- 输入
1 2 3 4 5 6 7 | # 数据准备 iris2 <- iris iris2$label[iris2$Species == 'setosa'] <- 1 iris2$label[iris2$Species == 'versicolor'] <- 2 iris2 <- iris2[-which(iris2$Species == 'virginica'), ] # 剔除类型为virginica的数据 iris2$Species <- NULL # 去除Species列 head(iris2,10) # 显示前10个数据 |
- 输出
1 2 3 4 5 6 7 8 9 10 11 12 | > head(iris2,10) Sepal.Length Sepal.Width Petal.Length Petal.Width label 1 5.1 3.5 1.4 0.2 1 2 4.9 3.0 1.4 0.2 1 3 4.7 3.2 1.3 0.2 1 4 4.6 3.1 1.5 0.2 1 5 5.0 3.6 1.4 0.2 1 6 5.4 3.9 1.7 0.4 1 7 4.6 3.4 1.4 0.3 1 8 5.0 3.4 1.5 0.2 1 9 4.4 2.9 1.4 0.2 1 10 4.9 3.1 1.5 0.1 1 |
参数设置
以label与Sepal.Length之间的ROC曲线为例:
1 | auc1 <- roc(label~Sepal.Length, data=iris2, smooth=FALSE) |
接着通过实际图形看看使用plot绘制ROC曲线的一些参数:
- 原始图形
1 | plot(auc1) |
print.auc :在图中显示AUC的值,AUC的大小等于ROC曲线下方的面积大小;
1 | plot(auc1, print.auc=TRUE) |
print.thres :在图中显示ROC曲线的阈值(threshold),大概为ROC曲线中最尖的那个点;
1 | plot(auc1, print.thres=TRUE) |
print.thres.col :设置阈值数据的颜色。
1 | plot(auc1, print.thres=TRUE, print.thres.col="blue") |
col :设置ROC曲线的颜色。
1 | plot(auc1,col="blue") |
identity.col :设置对角线的颜色。
1 | plot(auc1, identity.col="blue") |
identity.lty :设置对角线的类型,取数字。
1 | plot(auc1,identity.lty=2) |
identity.lwd :设置对角线的线宽,默认宽度为1。
1 | plot(auc1, identity.lwd=2) |
- 综合以上参数,得到如下图形
1 2 3 4 | auc1 <- roc(label~Sepal.Length, data=iris2, smooth=FALSE) plot(auc1, print.auc=TRUE, print.thres=TRUE, main="多组ROC曲线比较", col="blue", print.thres.col="blue", identity.col="blue", identity.lty=2, identity.lwd=1) |
多变量ROC曲线比较
1 2 3 4 5 6 7 8 9 10 11 | # ROC曲线的绘制 auc1 <- roc(label~Sepal.Length, data=iris2, smooth=FALSE) plot(auc1, print.auc=TRUE, print.thres=TRUE, main="多组ROC曲线比较", col="blue", print.thres.col="blue", identity.col="blue", identity.lty=2, identity.lwd=1) auc2 <- roc(label~Sepal.Width, data=iris2,smooth=FALSE) auc3 <- roc(label~Petal.Length, data=iris2,smooth=FALSE) auc4 <- roc(label~Petal.Width, data=iris2, smooth=FALSE) lines(auc2, col="red") lines(auc3,col="green") lines(auc4,col="yellow") |
ROC检验——DeLong’s Test
- 输入
1 | roc.test(auc1,auc2) |
- 输出
1 2 3 4 5 6 7 8 9 | Bootstrap test for two correlated ROC curves data: auc1 and auc2 D = 0.19387, boot.n = 2000, boot.stratified = 1, p-value = 0.8463 alternative hypothesis: true difference in AUC is not equal to 0 sample estimates: AUC of roc1 AUC of roc2 0.9326 0.9248 |
四组间整体检验
- 输入
1 | compareROCdep(iris2[,-5], iris2$label, method="auc") ##四组间整体检验 |
- 输出
1 2 3 4 5 6 7 8 9 | > compareROCdep(iris2[,-5], iris2$label, method="auc") ##四组间整体检验 In the considered database there are 50 controls and 50 cases. Method considered: AUC comparison (DeLong, DeLong and Clarke-Pearson, 1988) Progress bar: Estimation of statistic value in each variable (k = 4) |=======================================================================================================================================| 100% Error in solve.default(M) : Lapack例行程序dgesv: 系统正好是奇异的: U[3,3] = 0 |