使用for循环或sapply创建ROC曲线

时间:2016-11-11 07:56:55

标签: r loops roc proc-r-package

经过大量搜索,我无法找到问题的答案。我想使用for循环或sapply生成带有pROC pakkage的ROC曲线。

我的数据库看起来像这样(只有26个列和74行):

PT Bpt PA mnT1G mnT01
1   1  1   2.3   4.5
1   2  0   1.2   3.2 
2   1  1   5.4   2.1

我可以手动制作ROC曲线':

plot.new()
roc1 <- roc(cor.datT$PA, cor.datT$mT1G, percent=TRUE, partial.auc=c(100, 90), partial.auc.correct=TRUE, 
            partial.auc.focus="sens", ci=TRUE, boot.n=100, ci.alpha=0.9, stratified=FALSE, plot=TRUE, col= 'red')
roc2 <- roc(cor.datT$PA, cor.datT$mT01, plot=TRUE, add=TRUE, percent=roc1$percent, col = 'blue')

对于&#39;自动&#39;我试过了:

第一个roc曲线总是mnT1G:

rocT1G <- roc(cor.datT$PA, cor.datT$mnT1G, percent=TRUE, partial.auc=c(100, 90), partial.auc.correct=TRUE, partial.auc.focus="sens", ci=TRUE, boot.n=100, ci.alpha=0.9, stratified=FALSE, plot=TRUE, col= 'red')

添加其他roc曲线(数据$ Img是来自另一个数据帧的所有图像名称(如T1G,T01等))。我知道他们都是蓝色的:

sapply(unique(data$Img[data$Img != "T1G"]), FUN = function(i) paste("roc",i,sep="") <- roc(cor.datT$PA, cor.datT[paste("mn",i, sep = "")], plot=TRUE, add=TRUE, percent=rocT1G$percent, col = 'blue'), simplify = FALSE)

但是我收到了这个错误:

  

roc.default出错(cor.datT $ PA,cor.datT [paste(&#34; mn&#34;,i,sep =&#34;&#34;)],   :预测变量必须是数字或有序。

for循环也是如此:

for (i in unique(data$Img[data$Img != "T1G"])){
    plot.new()
    rocT1G <- roc(cor.datT$PA, cor.datT$mnT1G, percent=TRUE, partial.auc=c(100, 90), partial.auc.correct=TRUE, partial.auc.focus="sens", ci=TRUE, boot.n=100, ci.alpha=0.9, stratified=FALSE, plot=TRUE, col= 'red')
    paste("roc",i,sep="") <- roc(cor.datT$PA, cor.datT[paste("mn",i, sep = "")], plot=TRUE, add=TRUE, percent=rocT1G$percent, col = 'blue')
}

我检查了列,它们都是数字。那么我的剧本中的课可能出了什么问题?

2 个答案:

答案 0 :(得分:0)

您的某个列不是您期望的数字。不幸的是,来自R的错误消息并没有告诉您问题发生在循环的哪个迭代,但您可以轻松地将print语句添加到循环中以找出哪个列产生问题

for (i in unique(data$Img[data$Img != "T1G"])){
    print(i)
    plot.new()
    rocT1G <- roc(cor.datT$PA, cor.datT$mnT1G, percent=TRUE, partial.auc=c(100, 90), partial.auc.correct=TRUE, partial.auc.focus="sens", ci=TRUE, boot.n=100, ci.alpha=0.9, stratified=FALSE, plot=TRUE, col= 'red')
    paste("roc",i,sep="") <- roc(cor.datT$PA, cor.datT[paste("mn",i, sep = "")], plot=TRUE, add=TRUE, percent=rocT1G$percent, col = 'blue')
}

打印的最后一列编号将是一个。您可以看到该列的内容:

class(cor.datT[paste("mn",i, sep = "")])
str(cor.datT[paste("mn",i, sep = "")])

更一般地说,您可以使用

快速检查数据框的所有列
str(cor.datT)

特别查看课程characterfactor的列。

答案 1 :(得分:0)

正如您在我对其他答案的评论中所指出的那样,问题在于您从提取中获得了data.frame

data.frame中,使用单个字符进行提取会返回data.frame。这在?Extract.data.frame

中有记录
  

数据帧可以在多种模式下编制索引。当[和[[使用   使用单个向量索引(x [i]或x [[i]]),它们索引数据帧   好像它是一个清单。

看着?Extract

  递归(类似列表)对象      

索引[类似于原子向量并选择一个列表   指定的元素。

这在文本中并不那么明显,但为了将列提取到向量中,您需要使用两个括号[[,所以

class(cor.datT[[paste("mn",i, sep = "")]])

应该是一个载体。

现在应该运行以下代码:

rocT1G <- roc(cor.datT$PA, cor.datT$mnT1G, percent=TRUE, partial.auc=c(100, 90), partial.auc.correct=TRUE, partial.auc.focus="sens", ci=TRUE, boot.n=100, ci.alpha=0.9, stratified=FALSE, plot=TRUE, col= 'red')
for (i in unique(data$Img[data$Img != "T1G"])){
    roc(cor.datT$PA, cor.datT[[paste("mn",i, sep = "")]], plot=TRUE, add=TRUE, percent=rocT1G$percent, col = 'blue')
}