【问题标题】:R: Error "incorrect number of subscripts on matrix" when trying boot with rocR:尝试使用 roc 启动时出现错误“矩阵上的下标数不正确”
【发布时间】:2016-06-28 21:33:07
【问题描述】:

我正在使用 Rstudio,并尝试使用 roc 包中的 pROCboot 进行引导。我正在关注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


【解决方案1】:

事实证明,您不能从 boot 中的函数 statistic 返回 roc 对象。它必须是一个数值。因此,以下修改消除了错误(如问题中所编辑)

roc_boot <- function(D, d) {
  E=D[d,]
  objectROC <- roc(E$x,E$y)
  return(objectROC$auc)
}

此外,正如@Calimo 所建议的,boot 只会提高置信区间而不是实际答案。就我而言,置信区间略有改善。

【讨论】:

    猜你喜欢
    • 2017-02-20
    • 2016-04-27
    • 2020-08-10
    • 2021-01-05
    • 1970-01-01
    • 2016-10-11
    • 2020-03-05
    • 1970-01-01
    • 2019-02-20
    相关资源
    最近更新 更多