【问题标题】:Writing a function in R to plot ROC curve using pROC在 R 中编写函数以使用 pROC 绘制 ROC 曲线
【发布时间】:2019-11-13 16:31:20
【问题描述】:

我正在尝试编写一个函数来根据不同的评分系统绘制 ROC 曲线,我必须预测结果。

我有一个数据框 data_all,其中包含“score_1”和“Threshold.2000”列。我根据需要生成 ROC 曲线:

plot.roc(data_all$Threshold.2000, data_all$score_1)

我的目标是为许多不同的结果(例如 Threshold.1000)和分数(score_1、score_2 等)生成 ROC 曲线,但我最初试图为不同的分数设置它。我的功能如下:

roc_plot <- function(dataframe_of_interest, score_of_interest) {
plot.roc(dataframe_of_interest$Threshold.2000, dataframe_of_interest$score_of_interest)}

我收到以下错误: roc.default(x, predictor, plot = TRUE, ...) : 未提供有效数据。

如果有人能找出我的功能不起作用的原因,我将不胜感激!我是一名 python 编码员,对 R 来说是新人,但尝试了许多不同的事情并没有太多运气。非常感谢。

编辑: 这是与 mtcars 相同的示例,因此可以重现:

data(mtcars)
plot.roc(mtcars$vs, mtcars$mpg) # --> makes correct graph
roc_plot <- function(dataframe_of_interest, score_of_interest) {
plot.roc(dataframe_of_interest$mpg, dataframe_of_interest$score_of_interest)}

结果: roc.default(x, predictor, plot = TRUE, ...) 中的错误:未提供有效数据。 roc_plot(mtcars, vs)

【问题讨论】:

  • 请提供您的数据样本,因为错误是基于您的数据。您可以为此使用head()dput()。如果您不允许共享数据,请尝试使用 mtcars 等基本数据集重现您的错误
  • 谢谢,我已经编辑它以包含 mtcars 作为示例
  • 这是一个基本的理解问题。函数声明如下:roc_plot &lt;- function(x, y) {plot.roc(x, y)},然后在调用它时填充x,yroc_plot(mtcars$vs, mtcars$mpg)。实际上它与python中的相同。当您使用 $ 时,您尝试调用数据框的列名。此外,如果您想始终调用同一列,则可以通过过滤来实现。
  • 当您想始终调用相同的列时:roc_plot &lt;- function(dataframe_of_interest, score_of_interest) { plot.roc(dataframe_of_interest$vs, dataframe_of_interest$mpg)} roc_plot(mtcars, mtcars) 请注意,您在mtcars 示例中使用了错误的变量名称。您将第一个调用更改为$mpg$,但第二个仍然是score_of_interest,因为没有这样的列,所以您收到错误
  • 非常感谢您的帮助!我很感激

标签: r function rstudio proc


【解决方案1】:

这是一种可以按需要工作的解决方案(即让用户为score_of_interest 指定不同的值):

library(pROC)
data(mtcars)

plot.roc(mtcars$vs, mtcars$mpg) # --> makes correct graph

# expects `score_of_interest` to be a string!!!
roc_plot <- function(dataframe_of_interest, score_of_interest) {
    plot.roc(dataframe_of_interest$vs, dataframe_of_interest[, score_of_interest])
}

roc_plot(mtcars, 'mpg')
roc_plot(mtcars, 'cyl')

请注意,您的错误不是由不正确的列名引起的,而是由不正确地使用 data.frame 类引起的。注意一个更简单的函数会发生什么:

foo <- function(x, col_name) {
    head(x$col_name)
}
foo(mtcars, mpg)
## NULL

这将返回 NULL。因此,在您的原始函数中,当您尝试为 plot.roc 提供 dataframe_of_interest$score_of_interest 时,您实际上是在喂 plot.rocNULL

data.frame 存储在对象中时,有几种方法可以通过列名从列名中提取列(当您将其作为参数传递给函数时,您正在执行此操作)。也许最简单的方法是记住data.frame 就像一个二维数组类型对象,因此我们可以使用熟悉的object[i, j] 语法,但我们要求所有行并按名称指定列,例如mtcars[, 'mpg'] .如果我们将字符串 'mpg' 分配给一个对象,这仍然有效:

x <- 'mpg'
mtcars[, x]

这就是我提出解决方案的方式。更进一步,不难想象如何同时提供score_of_interestthreshold_of_interest

roc_plot2 <- function(dataframe_of_interest, threshold_of_interest, score_of_interest) {
    plot.roc(dataframe_of_interest[, threshold_of_interest], 
             dataframe_of_interest[, score_of_interest])
}

roc_plot2(mtcars, 'vs', 'mpg')

【讨论】:

  • 非常感谢,这非常有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-19
  • 1970-01-01
  • 2019-02-27
  • 2011-12-11
  • 1970-01-01
  • 2020-08-15
  • 2019-02-05
相关资源
最近更新 更多