【问题标题】:Plot an ROC curve in R with ggplot2使用 ggplot2 在 R 中绘制 ROC 曲线
【发布时间】:2017-06-19 19:48:24
【问题描述】:

我有两个变量(条件 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 轴上。 请注意,我特别对 ROC 包(如 ROCR)不感兴趣,但我认为应该可以仅使用 ggplot 来绘制它。

非常感谢!

附言只是为了表明我至少一直在尝试一些事情并且真的不想让堆栈交换来为我攻读博士学位,我尝试重铸 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 一次完成......

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

【问题讨论】:

  • 那么您是否尝试使用 ggplot 自己绘制此图?你到底在哪里糟透了?您在这里问的具体问题是什么?现在它读起来就像“请为我做这件事”的帖子,这不是我们在这里鼓励的问题类型。也许你可以编辑你的帖子来澄清一下。
  • @MrFlick 我尝试单独绘制两个,但它们需要在一个情节上。我整天都在试图弄清楚...我猜问题可能与数据框的排列方式有关...我不确定您还需要什么信息?
  • @MrFlick 不公平,我完全被卡住了......
  • 好吧,如果您制作了单独的图并且只需要帮助组合它们,请显示您编写的用于制作两个单独的图的代码。这样就可以更容易地看到您正在尝试做什么。
  • @MrFlick 完成,但单独的情节有问题,无论如何必须有更简单的方法。

标签: r plot ggplot2 roc


【解决方案1】:

我认为您需要重新格式化您的数据,以便您的 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()

【讨论】:

  • 非常感谢您的快速响应!这几乎正​​是我所需要的,而且做得非常优雅。线条可以弯曲吗? (如果 x 轴尺寸减小,视觉上会更有意义)
  • 您可以使用geom_smooth(method="lm", formula=y ~ splines::bs(x, df=3), se=FALSE),而不是geom_stepgeom_line。您可能必须使用公式来获得合适的东西。
猜你喜欢
  • 1970-01-01
  • 2019-02-27
  • 1970-01-01
  • 2020-08-15
  • 2019-02-05
  • 2018-12-26
  • 2013-08-10
  • 2017-09-11
  • 2016-12-26
相关资源
最近更新 更多