2017-02-02 9 views
1

У меня есть две переменные (Условие1 & Условие 2), для которого я рассчитал ложные сигналы тревоги и скорости нажатия, и я хотел бы построить их на одном графике с отдельными кривыми для Condition1 и Condition 2. Оба этих условия имеют три точки, и оба используют одни и те же ложные сигналы тревоги. Вот что мой кадр данных выглядит следующим образом:Запланируйте кривую ROC в R с помощью ggplot2

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) 

ложные сигналы тревоги должны идти на оси х, а хит ставки должны идти на оси у. Обратите внимание, что я специально не интересуюсь пакетами ROC, такими как ROCR, но, скорее, я думаю, что это возможно, чтобы построить это, используя только 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

+0

Так вы пытались построить это самостоятельно, используя ggplot? Где именно id вы сосать? Что конкретно вы спрашиваете здесь о своем вопросе? Сейчас он читается как «пожалуйста, сделайте это для меня», который не является тем вопросом, который мы здесь поддерживаем. Возможно, вы можете отредактировать свой пост, чтобы уточнить. – MrFlick

+0

@MrFlick Я попытался построить два отдельно, но они должны быть на одном сюжете. Я пытался понять его весь день ... Я предполагаю, что проблема связана с тем, как устроен кадр данных ... Я не уверен, что вам нужно больше информации? –

+0

@MrFlick нечестно, я полностью застрял ... –

ответ

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

+0

большое спасибо за ваш удивительный и быстрый ответ! Это почти то, что мне нужно и очень элегантно сделано.Возможно ли, чтобы линии были изогнуты? (визуально визуально, если ось X уменьшена в размере) –

+0

Вместо 'geom_step' или' geom_line' вы можете использовать 'geom_smooth (method =" lm ", formula = y ~ splines :: bs (x , df = 3), se = FALSE) '. Возможно, вам придется поиграть с формулой, чтобы получить что-то подходящее. – eipi10

+0

большое спасибо! –