3

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?

Calimo
  • 7,510
  • 4
  • 39
  • 61
Garrus
  • 43
  • 4

2 Answers2

2

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)
}
Calimo
  • 7,510
  • 4
  • 39
  • 61
  • Thank you for the explanation and for pointing out the inconsistency. Invoking the other function worked and the code is cleaner and more readable. – Garrus Dec 01 '19 at 04:49
1

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)))
A. Suliman
  • 12,923
  • 5
  • 24
  • 37