我正在使用 Rstudio,并尝试使用
roc
包中的 pROC
和 boot
进行引导。我正在关注此链接上的代码。该链接中的代码使用另一个带有 boot
的函数,效果很好。但是当我尝试roc
时,它给出了错误。
下面是我的代码:(在输出中,我打印了样本的尺寸,以查看重新采样完成了多少次。这里
R=5
,采样完成了 6 次,然后出现错误)。
library(boot)
roc_boot <- function(D, d) {
E=D[d,]
print(dim(E))
return(roc(E$x,E$y))
}
x = round(runif(100))
y = runif(100)
D = data.frame(x, y)
b = boot(D, roc_boot, R=5)
输出:
[1] 100 2
[1] 100 2
[1] 100 2
[1] 100 2
[1] 100 2
[1] 100 2
Error in boot(D, roc_boot, R = 5) :
incorrect number of subscripts on matrix
这里有什么问题?
如果我将
roc
替换为 sum
等其他函数,那么它可以完美运行(它可以打印 6 行,没有任何错误)。多次启动时它也会给出不同的答案(同时保持 D
相同)。
请注意,错误是在所有重新采样完成后发生的。我找不到这个特定错误的根源。我看过其他答案,例如this,但它们似乎不适用于我的案例。有人还可以解释一下为什么会出现此错误以及它通常意味着什么吗?
编辑: 我使用以下函数仅返回曲线下的面积:
roc_boot <- function(D, d) {
E=D[d,]
objectROC <- roc(E$x,E$y)
return(objectROC$auc)
}
这给出了曲线下面积的答案,但它与没有引导的答案相同,这意味着没有改进。由于引导,我需要传递整个
roc
对象才能得到改进。
事实证明,您无法从
roc
中的函数 statistic
返回 boot
对象。它必须是一个数值。因此,以下修改消除了错误(如问题中编辑的那样)
roc_boot <- function(D, d) {
E=D[d,]
objectROC <- roc(E$x,E$y)
return(objectROC$auc)
}
此外,正如@Calimo 所建议的,
boot
只提高了置信区间,而不是实际的答案。就我而言,置信区间略有改善。