使用 ggplot2 在 R 中绘制 ROC 曲线

Plot an ROC curve in R with ggplot2

我有两个变量(条件 1 和条件 2),我已经计算了它们的误报率和命中率,我想将它们绘制在同一张图上,并为条件 1 和条件 2 分别绘制曲线。这两个条件有三个点,并且都使用相同的误报率。这是我的数据框的样子:

measure <- c('False_Alarm','False_Alarm','False_Alarm', 'Hit_Rate_Condition1',
 'Hit_Rate_Condition1','Hit_Rate_Condition1', 'Hit_Rate_Condition2','Hit_Rate_Condition2',
  'Hit_Rate_Condition2')
point_on_curve<- c(1, 2, 3, 1, 2, 3, 1, 2, 3)
percentage <- c(0.11, 0.1, 0.01, 0.80, 0.50, 0.20, 0.80, 0.55, 0.25)

ROC_data <- data.frame(measure,point_on_curve, percentage)

误报应在 x 轴上,命中率应在 y 轴上。 请注意,我对 ROCR 等 ROC 包特别不感兴趣,但我认为应该可以仅使用 ggplot 来绘制它。

非常感谢!

p.s。只是为了表明我至少一直在尝试一些事情并且真的不想让堆栈交换来为我做我的博士学位,我已经尝试重铸 DF 并将两者分开以制作两个图:

 Condition_1 <- dcast(ROC_data, point_on_curve ~ measure)
 Condition_1 <- Condition_1[which(!Condition_1$measure == Hit_Rate_Condition2),]
p <- ggplot(data=Condition_1, aes(x=False_Alarm, y=Hit_Rate)) +     
  geom_point() +    
  stat_smooth(method = "lm", formula = y ~ splines::bs(x, 1), col = "red") +
  expand_limits(x = c(0, 1))

这导致了一些荒谬的线条,它不是平滑的 ROC(不是我需要的),我仍然需要将两者结合起来....无论如何,必须有一种简单的方法来制作这个情节(我需要再做18次)与原始DF一次性...

这是曲线的示例(我不是在寻找美学上相同的东西,只是相同类型的曲线!)

我认为您需要重新格式化您的数据,以便您的 x 和 y 变量(假阳性率和真阳性率)位于不同的列中,然后使用 geom_step。看看下面的代码和输出,让我知道这是否是您的目标:

ROC_data <- data.frame(measure, point_on_curve, percentage)

ROC_data = cbind(ROC_data[rep(1:3,2),], ROC_data[4:nrow(ROC_data),])
ROC_data = ROC_data[,c(3,4,6)]
names(ROC_data) = c("FP_Rate","condition","TP_Rate")

ROC_data
    FP_Rate           condition TP_Rate
1      0.11 Hit_Rate_Condition1    0.80
2      0.10 Hit_Rate_Condition1    0.50
3      0.01 Hit_Rate_Condition1    0.20
1.1    0.11 Hit_Rate_Condition2    0.80
2.1    0.10 Hit_Rate_Condition2    0.55
3.1    0.01 Hit_Rate_Condition2    0.25
ggplot(ROC_data, aes(FP_Rate,TP_Rate,colour=condition)) + 
  geom_step() +
  coord_cartesian(xlim=c(0,1), ylim=c(0,1)) +
  theme_bw()

如果想用直线连接点,可以用geom_line代替:

ggplot(ROC_data, aes(FP_Rate,TP_Rate,colour=condition)) + 
  geom_line() +
  geom_point() +
  coord_cartesian(xlim=c(0,1), ylim=c(0,1)) +
  theme_bw()