用Rgplot2绘制R中的ROC曲线

时间:2017-02-02 16:24:44

标签: r plot ggplot2 roc

我有两个变量(Condition1& Condition 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一起去......

这是曲线应该如何的一个例子(我不是在寻找美学上相同的东西,只是同一种曲线!) enter image description here

1 个答案:

答案 0 :(得分:3)

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

enter image description here

如果您想用直线连接点,可以改为使用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()

enter image description here