如何从TPR和FPR绘制ROC曲线

时间:2017-07-19 11:44:55

标签: r roc

我有一个案例,我只获得每个数据点的TP,FP,FN和TN(一个例子)。总共,我有24个例子(数据点)与这4个措施。我使用2种不同的方法,为每个例子(数据点)计算TP,FP,FN和TN。现在,我想通过绘制ROC曲线来比较这两种不同方法的性能。我已经计算了TPR(y轴)和FPR(x轴)并使用ggplot2绘制它们(见图link)但我不知道如何在这些数据点上拟合曲线以便它们看起来像经典/传统的ROC曲线图。所以我也可以计算auROC曲线。

有人可以指导我怎么做吗?谢谢。

使用ggplot绘图:

ggplot(data, aes(x=FPR, y=TPR)) + geom_point(aes(shape=Class, colour = Class), size=1.5) + scale_shape(solid = FALSE) + theme_update(plot.title=element_text(hjust=0.5)) + xlim(0,1) + xlab("False Positive Rate (FPR)") + ylab("True Positive Rate (TPR)")

以下是我的数据输入:

> dput(data)
structure(list(Class = structure(c(1L, 2L, 1L, 2L, 1L, 2L, 1L, 
2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 
2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 
2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L), .Label = c("Epi", 
"GE"), class = "factor"), TP = c(94L, 127L, 58L, 76L, 5L, 6L, 
34L, 47L, 14L, 20L, 113L, 136L, 32L, 36L, 78L, 102L, 51L, 58L, 
49L, 50L, 111L, 120L, 174L, 184L, 151L, 172L, 189L, 226L, 36L, 
40L, 252L, 271L, 2L, 4L, 7L, 42L, 41L, 82L, 0L, 15L, 45L, 53L, 
11L, 16L, 24L, 35L, 3L, 10L, 28L, 34L), FP = c(46L, 389L, 3L, 
254L, 3L, 7L, 13L, 57L, 7L, 88L, 55L, 220L, 21L, 87L, 23L, 245L, 
11L, 190L, 20L, 77L, 45L, 168L, 86L, 391L, 34L, 238L, 88L, 367L, 
56L, 193L, 119L, 455L, 3L, 27L, 5L, 30L, 67L, 247L, 0L, 30L, 
4L, 65L, 7L, 77L, 55L, 176L, 5L, 33L, 15L, 66L), FN = c(33L, 
0L, 18L, 0L, 1L, 0L, 13L, 0L, 6L, 0L, 23L, 0L, 4L, 0L, 24L, 0L, 
7L, 0L, 1L, 0L, 9L, 0L, 10L, 0L, 21L, 0L, 37L, 0L, 4L, 0L, 19L, 
0L, 5L, 3L, 35L, 0L, 41L, 0L, 15L, 0L, 8L, 0L, 6L, 1L, 14L, 3L, 
7L, 0L, 6L, 0L), TN = c(488L, 179L, 373L, 125L, 10L, 6L, 75L, 
32L, 119L, 38L, 247L, 83L, 97L, 37L, 400L, 179L, 295L, 132L, 
107L, 51L, 200L, 109L, 441L, 140L, 331L, 157L, 419L, 177L, 180L, 
45L, 567L, 237L, 35L, 11L, 88L, 91L, 222L, 90L, 0L, 29L, 116L, 
56L, 105L, 36L, 217L, 99L, 55L, 28L, 82L, 32L), TPR = c(0.74, 
1, 0.76, 1, 0.83, 1, 0.72, 1, 0.7, 1, 0.83, 1, 0.89, 1, 0.76, 
1, 0.88, 1, 0.98, 1, 0.92, 1, 0.95, 1, 0.88, 1, 0.84, 1, 0.9, 
1, 0.93, 1, 0.29, 0.57, 0.17, 1, 0.5, 1, 0, 1, 0.85, 1, 0.65, 
0.94, 0.63, 0.92, 0.3, 1, 0.82, 1), FPR = c(0.09, 0.68, 0.01, 
0.67, 0.23, 0.54, 0.15, 0.64, 0.06, 0.7, 0.18, 0.73, 0.18, 0.7, 
0.05, 0.58, 0.04, 0.59, 0.16, 0.6, 0.18, 0.61, 0.16, 0.74, 0.09, 
0.6, 0.17, 0.67, 0.24, 0.81, 0.17, 0.66, 0.08, 0.71, 0.05, 0.25, 
0.23, 0.73, NA, 0.51, 0.03, 0.54, 0.06, 0.68, 0.2, 0.64, 0.08, 
0.54, 0.15, 0.67)), .Names = c("Class", "TP", "FP", "FN", "TN", 
"TPR", "FPR"), class = "data.frame", row.names = c(NA, -50L))

修改

这就是数据标题的样子:

> head(data)
  Class  TP  FP FN  TN  TPR  FPR
1   Epi  94  46 33 488 0.74 0.09
2    GE 127 389  0 179 1.00 0.68
3   Epi  58   3 18 373 0.76 0.01
4    GE  76 254  0 125 1.00 0.67
5   Epi   5   3  1  10 0.83 0.23
6    GE   6   7  0   6 1.00 0.54

我将解释前两行,同样的解释适用于其余的行。我使用了两种不同的方法(名为EpiGE)来计算我的预测中的TP,FP,FN和TN的数量,大约有一个例子(用1个数据点表示)。然后我从中计算TPRFPR。类似地,我在23个示例中的其余部分应用了相同的2个方法,并且整个数据帧给出了每个示例中每个方法的TP,FP,FN和TN的值(24个数据点 - 表示一个示例的1个数据点及其TPR /通过一种方法计算的FPR率,即GE或Epi)。

0 个答案:

没有答案