使用 for 循环或 sapply 创建 ROC 曲线
Create ROC curve with for loop or sapply
经过大量搜索后,我找不到问题的答案。我想使用 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曲线'manually':
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')
对于 'automatic' 我试过:
第一个 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)
但是我得到这个错误:
Error in roc.default(cor.datT$PA, cor.datT[paste("mn", i, sep = "")],
: Predictor must be numeric or ordered.
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')
}
我检查了这些列,它们都是数字。所以也许我的脚本中的 class 出了问题?
您的其中一列不是您预期的数字。不幸的是,来自 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)
特别检查 class character
或 factor
的列。
正如您在对我的其他答案的评论中指出的那样,问题是您从提取中得到了特定的 data.frame
s。
在一个data.frame
中,用单个字符returns提取一个data.frame
。这记录在 ?Extract.data.frame:
Data frames can be indexed in several modes. When [ and [[ are used
with a single vector index (x[i] or x[[i]]), they index the data frame
as if it were a list.
并查看 ?Extract:
Recursive (list-like) objects
Indexing by [ is similar to atomic vectors and selects a list of the
specified element(s).
从文字上看不是很明显,但是为了将列提取到向量中,需要使用两个括号[[
,所以
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')
}
经过大量搜索后,我找不到问题的答案。我想使用 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曲线'manually':
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')
对于 'automatic' 我试过:
第一个 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)
但是我得到这个错误:
Error in roc.default(cor.datT$PA, cor.datT[paste("mn", i, sep = "")], : Predictor must be numeric or ordered.
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')
}
我检查了这些列,它们都是数字。所以也许我的脚本中的 class 出了问题?
您的其中一列不是您预期的数字。不幸的是,来自 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)
特别检查 class character
或 factor
的列。
正如您在对我的其他答案的评论中指出的那样,问题是您从提取中得到了特定的 data.frame
s。
在一个data.frame
中,用单个字符returns提取一个data.frame
。这记录在 ?Extract.data.frame:
Data frames can be indexed in several modes. When [ and [[ are used with a single vector index (x[i] or x[[i]]), they index the data frame as if it were a list.
并查看 ?Extract:
Recursive (list-like) objectsIndexing by [ is similar to atomic vectors and selects a list of the specified element(s).
从文字上看不是很明显,但是为了将列提取到向量中,需要使用两个括号[[
,所以
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')
}