Garrus
Garrus

Reputation: 43

Calculating multiple ROC curves in R using a for loop and pROC package. What variable to use in the predictor field?

I am using the pROC package and I want to calculate multiple ROC curve plots using a for loop. My variables are specific column names that are included as string in a vector and I want pROC to read sequentially that vector and use the strings in the field "predictor" that seems to accept text/characters. However, I cannot parse correctly the variable, as I am getting the error:

'predictor' argument should be the name of the column, optionally quoted.

here is an example code with aSAH dataset:

ROCvector<- c("s100b","ndka")
for (i in seq_along(ROCvector)){
  a<-ROCvector[i]
pROC_obj <- roc(data=aSAH, outcome, as.character(a))

#code for output/print#

}

I have tried to call just "a" and using the functions print() or get() without any results. Writing manually the variable (with or without quoting) works, of course. Is there something I am missing about the type of variable I should use in the predictor field?

Upvotes: 3

Views: 1126

Answers (2)

Calimo
Calimo

Reputation: 7959

By passing data=aSAH as first argument, you are triggering the non-standard evaluation (NSE) of arguments, dplyr-style. Therefore you cannot simply pass the column name in a variable. Note the inconsistency with outcome that you pass unquoted and looks like a variable (but isn't)? Fortunately, functions with NSE in dplyr come with an equivalent function with standard evaluation, whose name ends with _. The pROC package follows this convention. You should usually use those if you are programming with column names.

Long story short, you should use the roc_ function instead, which accepts characters as column names (don't forget to quote "outcome"):

pROC_obj <- roc_(data=aSAH, "outcome", as.character(a))

A slightly more idiomatic version of your code would be:

for (predictor in ROCvector) {
    pROC_obj <- roc_(data=aSAH, "outcome", predictor)
}

Upvotes: 2

A. Suliman
A. Suliman

Reputation: 13125

roc can accept formula, so we can use paste0 and as.formula to create one. i.e.

library(pROC)
ROCvector<- c("s100b","ndka")
for (i in seq_along(ROCvector)){
    a<-ROCvector[i]
    pROC_obj <- roc(as.formula(paste0("outcome~",a)), data=aSAH)
    print(pROC_obj)
    #code for output/print#

}

To can get the original call i.e. without paste0 wich you can use for later for downstream calculations, use eval and bquote

pROC_obj <- eval(bquote(roc(.(as.formula(paste0("outcome~",a))), data=aSAH)))

Upvotes: 1

Related Questions