На кривой ROC отсутствуют 3 из 5 точек

#r #roc

Вопрос:

Я пытаюсь построить кривую ROC с точками, но отображаются только 2 из 5 точек, и я не уверен, почему? Что я упускаю? Я неправильно рассчитал объем.значение 3 переменных?( roc_max_inf_vol , roc_med_adult_vol , и roc_med_inf_vol не появляются). Я строю график ( 1 - prop.adults ) против ( 1 - prop.infants ). Каждая точка должна соответствовать volume.value одной из следующих переменных ( roc_max_diff и roc_a1_i только 2 точки отображаются правильно).:

Эти 2 отображаются правильно:

 roc_max_diff <- volume.value[which.max(smooth.difference)]
roc_a1_i <- volume.value[volume.value > max(mydata[mydata$CLASS == "A1" amp; mydata$TYPE == "I", "VOLUME"])]
 

Эти 3 не отображаются:

 roc_max_inf_vol <- volume.value[max(mydata$VOLUME[mydata$TYPE == "I"])] 
roc_med_adult_vol <- volume.value[median(mydata$VOLUME[mydata$TYPE=="ADULT"])]
roc_med_inf_vol <- volume.value[median(mydata$VOLUME[mydata$TYPE=="I"])]
 

Вот что у меня есть:

 cuts <- which(volume.value %in% c(roc_max_inf_vol, roc_med_adult_vol, max_diff, a1_i, roc_med_inf_vol))

ggplot(mapping = aes((1 - prop.infants), (1 - prop.adults)))   
    geom_line(color = 'darkblue', size = 1)   

geom_abline(intercept = 0, slope = 1, color = 'darkred', linetype = 2)  
  geom_point(mapping = aes((1 - prop.infants[cuts]), (1 - prop.adults[cuts])),
             shape = 21, size = 3)  
  annotate("text", label = paste('Median infant nvol =', round(med_inf_vol, 1)),
           x = 0.58, y = 0.90, size = 3)  
  annotate("text", label = paste('Zero A1 infants nvol =', round(a1_i, 1)), 
           x = 0.25, y = 0.90, size = 3)  
  annotate("text", label = paste('Max difference nvol =', round(max_diff, 1)), 
           x = 0.25, y = 0.68, size = 3)  
  annotate("text", label = paste('Median adult nvol =', round(med_adult_vol, 1)), 
           x = 0.12, y = 0.46, size = 3)  
  annotate("text", label = paste('Protect all infants nvol =', round(max_inf_vol, 1)),
           x = 0.09, y = 0.20, size = 3)  
  labs(title = "ROC curve of adult and infant harvest proportions",
       x = "Infant harvest proportion", y = "Adult harvest proportion")   
  theme(axis.text.y = element_text(angle = 90, vjust = 0.5, hjust = 0.5))
 

Для справки, вот исходные данные, которые я использую: https://raw.githubusercontent.com/pandahappy204/Sample/main/mydata.csv

И вот некоторые фоновые переменные, которые, я думаю, необходимы, чтобы понять вышесказанное (например, проп.младенцы и проп.взрослые). Мы очень ценим любую помощь.

 mydata$TYPE <- factor(ifelse(mydata$SEX == "I", "I", "ADULT"))
mydata$TYPE[mydata$CLASS == "A4" | mydata$CLASS == "A5"] <- "ADULT"

idxi <- mydata$TYPE == "I"
idxa <- mydata$TYPE == "ADULT"

max.v <- max(mydata$VOLUME)
min.v <- min(mydata$VOLUME)
delta <- (max.v - min.v)/10000
prop.infants <- numeric(10000)
prop.adults <- numeric(10000)
volume.value <- numeric(10000)

total.infants <- sum(idxi)  
total.adults <- sum(idxa)

for (k in 1:10000) { 
    value <- min.v   k*delta
    volume.value[k] <- value
    prop.infants[k] <- sum(mydata$VOLUME[idxi] <= value)/total.infants
    prop.adults[k] <-  sum(mydata$VOLUME[idxa] <= value)/total.adults
}

y.loess.a <- loess(1 - prop.adults ~ volume.value, span = 0.25,
    family = c("symmetric"))
y.loess.i <- loess(1 - prop.infants ~ volume.value, span = 0.25,
    family = c("symmetric"))
smooth.difference <- predict(y.loess.a) - predict(y.loess.i)
 

Комментарии:

1. Джо, я бы хотел помочь, но огромное количество вещей, которые мне нужно переделать, чтобы решить вашу (основную) проблему, просто ошеломляет. Если вы хотите построить график из 5 точек, почему бы не извлечь тот конечный кадр данных, который вы используете для построения своей ggplot? Это позволяет сразу определить вашу проблему (или даже вас самих). Он также ответит, правильно ли вы что-то рассчитали. Как правило, ggplot() работает с кадрами данных. Ваши prop.младенцы/взрослые должны быть столбцами в предоставляемом вами фрейме данных (несмотря на то, что вы можете предоставлять векторы для ggplot в определенных вызовах слоев). Надеюсь, это поможет вам начать.

2. Добро пожаловать на этот сайт, Джо! Очень сложно запустить ваш код, так как он отображается не по порядку… и его нужно запускать снизу вверх. Но настоящая проблема в том, что даже тогда он не запускается. Например, я все еще получаю ошибку: Error in which.max(smooth.difference) : object 'smooth.difference' not found . Убедитесь, что код, который вы включаете, воспроизводим 😉

3. Извини за это, Калимо! Я добавил объект smooth.difference, так что, надеюсь, он запустится, если вы сможете попробовать еще раз. Спасибо за вашу помощь.