【发布时间】:2016-06-28 21:33:07
【问题描述】:
我正在使用 Rstudio,并尝试使用 roc 包中的 pROC 和 boot 进行引导。我正在关注this link 上的代码。该链接中的代码使用 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 对象,还是计算 roc 下的面积?发生错误是因为 boot 正在寻找要从 statistic 参数返回的单个值。
-
@JimM。我想返回对象。那可能吗?我已经使用 roc 对象的
$auc返回了曲线下的区域。但在这种情况下,该区域与没有引导的区域相同。我怀疑我需要传递roc对象才能由于引导而得到一些改进。我将编辑问题以添加此内容。 -
作为对代码的改进,我建议根据数据的可变性将引导程序的数量增加到 1000 左右。与仅返回 auc 统计数据相比,简单地通过引导 roc 对象不会导致改进(更高的 auc?)。如果你查看你的引导对象
b,它会告诉你引导的平均值和在原始数据集上计算的 auc 之间的差异,也就是偏差。 -
你想达到什么目的? Bootstrapping 可以衡量统计数据的不确定性。这不是直接在 ROC 曲线上定义的,这就是您需要 AUC 的原因。
-
顺便说一句,编辑后的代码对我来说似乎工作正常,并按预期为 AUC 提供了偏差和 std.error。 “没有改善”是什么意思?自举不会改善您的统计数据,它只会报告其不确定性。
标签: r runtime-error roc statistics-bootstrap