Thie1e / cutpointr

Optimal cutpoints in R: determining and validating optimal cutpoints in binary classification
https://cran.r-project.org/package=cutpointr
86 stars 13 forks source link

Plot a the ROC curve with manual settings #47

Closed jo1511 closed 3 years ago

jo1511 commented 3 years ago

Sorry, but I'm quite a newbie here and I don't know if this is really the right place to ask.

I wanted to just plot the ROC curve with the cutpoint and a vertival and horizontal line at the cutpoint. In addition, I wanted to change the appearance of the cutpoint and the lines (ROC, vline, hline) with regard to type, size/with and color. I also wanted to print the AUC value and the cutpoint values into the graph.

However, I failed and finally I don't have any idea what to do with the tibbles. Can anyone help me please!

Many thanks in advance!

Jo1511

Thie1e commented 3 years ago

Hi, the easiest way to do that is probably to just take the ROC curve values from the result of cutpointr and plot the ROC curve manually with ggplot. cutpointr returns all the necessary values. Maybe something like this?

library(cutpointr)
library(tidyverse)

cp <- cutpointr(suicide, dsi, suicide) 
#> Assuming the positive class is yes
#> Assuming the positive class has higher x values

res_unnested <- cp %>% 
    unnest(cols = roc_curve)
annotation <- paste0("AUC: ", round(cp$AUC, 2), "\n", 
                     "Cutpoint: ", round(cp$optimal_cutpoint, 2))
ggplot(res_unnested, aes(x = 1 - tnr, y = tpr)) +
    xlab("1 - Specificity") +
    ylab("Sensitivity") +
    theme_bw() +
    theme(aspect.ratio = 1) +
    geom_line(color = "blue") +
    geom_vline(xintercept = 1 - cp$specificity, linetype = 2) +
    geom_hline(yintercept = cp$sensitivity, linetype = 2) +
    annotate("text", x = 0.85, y = 0.05, label = annotation) +
    ggtitle("ROC curve",  "with custom styling and annotation")

Created on 2021-11-01 by the reprex package (v2.0.0)

jo1511 commented 3 years ago

Great, many thanks for your fast reply, everything worked well with my data!!!

Just one, probably easy question, if you don't mind. I used the youden metric with OptimalCutpoints and cutpointr and they gave the same results. However, when I used the MinValueSp metric with OptimalCutpoints I was not quite sure which metric to use in cutpointr. I tried spec_constrain and minimize_metric, but that did not give the same results.

Again sorry for my stupidity:-(

Jo1511

Thie1e commented 3 years ago

Hi, no problem. I think it is the other way around:

If you want to maximize sensitivity given a minimum value for specificity in cutpointr that would be something like:

cutpointr(suicide, dsi, suicide, 
                metric = sens_constrain, 
                method = maximize_metric,
                pos_class = "yes", direction = ">=",
                constrain_metric = specificity, min_constrain = 0.8)
jo1511 commented 3 years ago

Ok, got it, and worked well! Many thanks again, you made my day!

jo1511