1

经过大量搜索,我找不到我的问题的答案。我想使用 for 循环或 sapply 使用 pROC 包生成 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')

对于“自动”,我尝试过:

第一条 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 曲线(data$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("mn", i, sep = "")], 中的错误:预测器必须是数字或有序的。

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')
}

我检查了这些列,它们都是数字的。所以也许我的脚本中的类出了点问题?

4

2 回答 2

0

正如您在对我的其他答案的评论中指出的那样,问题是您特别data.frame从提取中得到了 s。

在 adata.frame中,使用单个字符提取会返回 a 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')
}
于 2016-11-11T15:25:00.860 回答
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特别是列。

于 2016-11-11T10:02:01.563 回答