使用 pROC 包发布计算 AUC

Issue computing AUC with pROC package

我正在尝试使用调用 R 中的 pROC 包的函数来计算许多不同结果的曲线下面积。

# Function used to compute area under the curve
proc_auc <- function(outcome_var, predictor_var) {
            pROC::auc(outcome_var, predictor_var)}

为此,我打算在向量中引用结果名称(如下所示)。

# Create a vector of outcome names 
outcome <- c('outcome_1', 'outcome_2')

但是,我在定义要输入到该函数中的变量时遇到问题。当我这样做时,我会生成错误:“roc.default(响应、预测变量、auc = TRUE,...)中的错误:'response' 必须有两个级别”。但是,我不知道为什么,因为我认为我只有两个级别...

如果有人能帮助我,我会很高兴!

这是 R 中鸢尾花数据集的可重现代码。

library(pROC)
library(datasets)
library(dplyr)

# Use iris dataset to generate binary variables needed for function
df <- iris %>% dplyr::mutate(outcome_1 = as.numeric(ntile(Sepal.Length, 4)==4), 
                 outcome_2 = as.numeric(ntile(Petal.Length, 4)==4))%>%
                 dplyr::rename(predictor_1 = Petal.Width)

# Inspect binary outcome variables 
df %>% group_by(outcome_1) %>% summarise(n = n()) %>% mutate(Freq = n/sum(n))
df %>% group_by(outcome_2) %>% summarise(n = n()) %>% mutate(Freq = n/sum(n))

# Function used to compute area under the curve
proc_auc <- function(outcome_var, predictor_var) {
            pROC::auc(outcome_var, predictor_var)}

# Create a vector of outcome names 
outcome <- c('outcome_1', 'outcome_2')

# Define variables to go into function
outcome_var <- df %>% dplyr::select(outcome[[1]])
predictor_var <- df %>% dplyr::select(predictor_1)


# Use function - first line works but not last line! 
proc_auc(df$outcome_1, df$predictor_1)
proc_auc(outcome_var, predictor_var)

outcome_varpredictor_var 是具有一列的数据框,这意味着它们不能直接用作 auc 函数中的参数。

只需指定列名即可。

proc_auc(outcome_var$outcome_1, predictor_var$predictor_1)

您必须熟悉 dplyr 的 non-standard evaluation,这使得编程变得非常困难。特别是,您需要意识到传递变量名是一种 间接 ,并且有一种特殊的语法。

如果你想继续使用管道/非标准评估,你可以使用 roc_ 函数,它遵循以前的函数命名约定,将变量名作为输入而不是实际的列名。

proc_auc2 <- function(data, outcome_var, predictor_var) {
    pROC::auc(pROC::roc_(data, outcome_var, predictor_var))
}

此时您可以将实际的列名传递给这个新函数:

proc_auc2(df, outcome[[1]], "predictor_1")
# or equivalently:
df %>% proc_auc2(outcome[[1]], "predictor_1")

也就是说,对于大多数用例,您可能希望遵循@druskacik 的回答并使用标准 R 评估。