查找ROC曲线列表外壳的代码(曲线集的上限和下限)

查找ROC曲线列表外壳的代码(曲线集的上限和下限),r,confidence-interval,roc,R,Confidence Interval,Roc,我已经编写了计算我在问题中要求的两行代码,如下图所示(所需的行为红色) 编辑:这是使用我的代码片段生成ROC曲线的预期图形(至少我很确定这是正确的): 问题是,所说的代码非常难看(太长,甚至不能在这里发布),而且我提出的过程对我来说非常乏味。但我似乎想不出更好的办法 下面是一个快速片段,用于生成ROC曲线的输入列表 library(MASS) library(dplyr) simple_roc <- function(labels, scores){ labels <- la

我已经编写了计算我在问题中要求的两行代码,如下图所示(所需的行为红色)

编辑:这是使用我的代码片段生成ROC曲线的预期图形(至少我很确定这是正确的):

问题是,所说的代码非常难看(太长,甚至不能在这里发布),而且我提出的过程对我来说非常乏味。但我似乎想不出更好的办法

下面是一个快速片段,用于生成ROC曲线的输入列表

library(MASS)
library(dplyr)

simple_roc <- function(labels, scores){
  labels <- labels[order(scores, decreasing=TRUE)]
  return(rbind(c(0,0,0),data.frame(TPR=cumsum(labels)/sum(labels), FPR=cumsum(!labels)/sum(!labels), labels)))
}

diab_data=rbind(data.frame(Pima.tr),data.frame(Pima.te))

roc_curves_list_logisitic=list()

for (k in 1:100) {

  #Set a fixed seed for reproducibility
  set.seed(k)

  # sampled_rows <- createDataPartition(diab_data$type, p = .7, list = FALSE)

  sampled_rows <- sample(1:nrow(diab_data), size=floor(0.7*nrow(diab_data)))

  diab_data_train=diab_data[sampled_rows,]
  diab_data_test=diab_data[-sampled_rows,]
  diab_data_train[,1:7]=scale(diab_data_train[,1:7])
  diab_data_test[,1:7]=scale(diab_data_test[,1:7])

  diab_data_train[,"type"]=as.numeric(as.character(recode_factor(diab_data_train[,"type"],`Yes` = "1", `No` = "0")))

  diab_data_test[,"type"]=as.numeric(as.character(recode_factor(diab_data_test[,"type"],`Yes` = "1", `No` = "0")))


  logistic_model_simple=glm(data=diab_data_train,as.formula(paste(colnames(diab_data_train)[8], "~",
                                                                  paste(colnames(diab_data_train)[-8], collapse = "+"),
                                                                  sep = "")),family=binomial(link = "logit"))

  roc_curves_list_logisitic[[k]]=simple_roc(diab_data_test[,"type"], 
                                            ifelse(predict(logistic_model_simple,diab_data_test,type='response')>0.5,1,0))

}
库(MASS)
图书馆(dplyr)

simple_roc我有一个带有
data.table
zoo
的解决方案。第一步是在所有曲线之间有一个公共FPR。能够绘制所有曲线的最大值和最小值。为此:

library(data.table)
library(zoo)

FPRlist <- unique(rbindlist(lapply(roc_curves_list_logisitic,function(ROC){
  rccurve <- as.data.table(ROC)
  rccurve[,.(FPR = FPR)]
})))
然后,我计算每个FPR步骤的所有ID(所有ROC曲线)的最大值和最小值

resultmax <- results[,.(TPR = max(TPR)),by = FPR]
resultmin <- results[,.(TPR = min(TPR)),by = FPR]

我让
dplyr
翻译成
dplyr
用户,因为我不习惯

编辑 我修改了我的绘图,以便与所有原始ROC曲线的绘图进行比较,而不进行任何合并或
na.locf
。可以看出,我建议的红线确实遵循所有曲线的最大值和最小值。第二个图如下所示:

results2 <- rbindlist(lapply(seq(roc_curves_list_logisitic),function(idx){
  rccurve <- as.data.table(roc_curves_list_logisitic[[idx]])
  rccurve[,ID := idx] # I create an ID
  rccurve
}))

p2 <- ggplot()+
  geom_line(data = results2,aes(FPR,TPR,color = as.factor(ID)))+
  theme_light() %+replace% theme(legend.position = "none")

results2 Hey Denin谢谢你的快速回答,很遗憾,我认为我不能接受,因为我认为它没有给出期望的结果。除非我遗漏了什么,否则红线并不与船体的每一处都对应。我将发布我问题中代码片段中ROC曲线给出的预期结果。你会发现你的红线和我的不同。不过,谢谢你的代码!我可以试着为你的答案工作,以达到预期的结果。由于我对data.table没有太多/没有太多的经验,所以您使用的函数对我来说绝对是有帮助和有趣的/zoo@JoelH我看不出你的图和我的图有什么区别,比如0,0点。你能描述一下你到底想要什么吗?我觉得你想要所有roc曲线的最大值和最小值,我的代码实际上给出了这个结果。上面的曲线对于FPR=0有一个非零的TPR,因为您的一条ROC曲线对于FPR=0有一个值TPR=0.21。在你的例子中,你所有曲线的实际最大值不是从0开始的。我对我的初始问题进行了编辑,显示了我认为你的部分红线是错误的(我相信还有更多)。我不是在说FPR=0的部分。@JoelH我也做了编辑。我不认为我错了,我认为你没有使用你为你的图表提供的数据。看我的图表,如果我在没有红线的情况下绘制原始数据。你可以清楚地看到你所错的部分确实出现在你提供的数据中,但不在你的图表中。我提供了第二个图形的绘图代码。
ggplot()+
  geom_line(data = results,aes(FPR,TPR,color = as.factor(ID)))+
  theme_light() %+replace% theme(legend.position = "none")+
  geom_line(data = resultmax,aes(FPR,TPR),color = "red",size = 1)+
  geom_line(data = resultmin,aes(FPR,TPR),color = "red",size = 1)
results2 <- rbindlist(lapply(seq(roc_curves_list_logisitic),function(idx){
  rccurve <- as.data.table(roc_curves_list_logisitic[[idx]])
  rccurve[,ID := idx] # I create an ID
  rccurve
}))

p2 <- ggplot()+
  geom_line(data = results2,aes(FPR,TPR,color = as.factor(ID)))+
  theme_light() %+replace% theme(legend.position = "none")