giovedì 2 agosto 2007

Receiver Operating Characteristic (ROC) Curve in ROCR and verification packages

The following VERY basic code shows how to plot a simple ROC Curve both by means of ROCR package and by verification package.

# it allows two different plots in the same frame
par(mfrow = c(1,2))
# plot a ROC curve for a single prediction run
# and color the curve according to cutoff.
library(ROCR)
data(ROCR.simple)
pred <- prediction(ROCR.simple$predictions, ROCR.simple$labels)
perf <- performance(pred,"tpr", "fpr")
plot(perf,colorize = TRUE)
# plot a ROC curve for a single prediction run
# with CI by bootstrapping and fitted curve
library(verification)
roc.plot(ROCR.simple$labels,ROCR.simple$predictions, xlab = "False positive rate",
ylab = "True positive rate", main = NULL, CI = T, n.boot = 100, plot = "both", binormal = TRUE)



23 commenti:

  1. il valore dell'Area under curve dove viene visualizzato?

    RispondiElimina
  2. For the above example you can get the Area Under the Curve (AUC) typing:
    (auc <- as.numeric(performance(pred, measure = "auc", x.measure = "cutoff")@y.values))

    For further examples:
    library(ROCR)
    demo(ROCR)

    RispondiElimina
  3. grazie paolo...sei la mia salvezza.....!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    se ti conoscessi ti farei un bel regalo!!!!!!!

    RispondiElimina
  4. E' possibile fare qualcosa di analogo per le curve di sopravvivenza?

    RispondiElimina
  5. Take a look at the survival package. The following links may be of some help:

    http://cran.r-project.org/web/views/Survival.html


    http://www.ats.ucla.edu/stat/r/examples/asa/asa_ch2_r.htm

    RispondiElimina
  6. Ciao Paolo!
    Sono stata un bel po di tempo cercando di fare una ROC con R, usando ROCR e verification. Però per me non vanno (credo!). Io non ho bisogno di predire o creare i dati, ho già i dati pronti per graficare, solo avevo bisogno di creare la graffica. Ho provato un paio di volte, usando i miei dati con quelle library, ma non sono riuscita. Lo sai se si può fare?
    Alla fine ho dovuto usare ggplot2 per creare una mia roc, però ho un problema con la leggenda...

    RispondiElimina
  7. Ciao Consu,
    Non conoscendo i dati a tua disposizione mi è difficile suggerirti qualcosa di preciso...
    Un consiglio generico può essere di generare una lista simile a quella dell'esempio (ROCR.simple) ossia

    test <- list()
    test$predictions <-prob.dati # le tue probabilità o simili
    test$labels <-dati.labels # le etichette che ritieni rappresentino le vere predizioni/caratteristiche

    e poi usare ROCR
    library(ROCR)
    pred <- prediction(test$predictions, test$labels)
    perf <- performance(pred,"tpr", "fpr")
    plot(perf,colorize = TRUE)

    HTH

    RispondiElimina
  8. Grazie per le idee Paolo, sei molto gentile. Ti spiego un po cosa faccio. Sto utilizzando un programma per modellare species habitat (http://www.cs.princeton.edu/~schapire/maxent/) Questo programma ti crea un output, dove ti da anche la ROC. Però la graffica è a colori e io volevo farla in B&W. Quindi, ho ritrovato i valori dall'output, e ho cercato di farlo con R. Quindi, ho già i valori pronti per grafficare, non devo calcolare niente. Per questo che penso che questo pred <- prediction(test$predictions, test$labels) non mi va. Penso che in realtà, è una cosa più facile... per quello ho provato con ggplot (http://img42.imageshack.us/content_round.php?page=done&l=img42/2720/roc2.png&via=mupload) Quello strano, è che mi appare quel 1 sulla leggenda, che non so da dove viene.
    I miei dati sono questi:
    'data.frame': 863 obs. of 3 variables:
    $ Fractional: num 1 1 0.999 0.997 0.996 ...
    $ mode : Factor w/ 3 levels "random","test",..: 3 3 3 3 3 3 3 3 3 3 ...
    $ training : num 1 1 1 1 1 1 1 1 1 1 ...
    mmm... cosa pensi? grazie Paolo!!

    RispondiElimina
  9. Usando la base graphics di R, fornendo le coordinate per test and training che io ho chiamato rispettivamente (1-tn,tf) e (1-tn2, tf2) e plottando il caso random con abline dovresti riuscire ad ottenere il grafico:

    plot(1-test$tn2,test$tp2,type="l",xlim=c(0,1), ylim=c(0,1), col="grey50", lwd=2, xlab="Specificity", ylab="Sensitivity")
    lines(1-test$tn,test$tp,type="l", col="grey70", lwd=2)
    abline(a=0,b=1,col="black", lwd=2)
    legend("topleft",legend=c("test","training", "random"),col=c("gray50","gray70","black"),lwd=2)

    RispondiElimina
  10. Che grande che sei Paolo!! Tantissime grazie!!! :))
    Avevo provato a fare qualcosa di simile prima, ma senza successo...
    Dal tuo script ho soltanto cambiato l'abline per un altra retta di coordinate uguali all'abline, perchè non mi piace che l'abline incomincia dall'inizio del quadro della graffica, non dal 0,0 dei dati, mi spiego?
    Comunque, fatta, grazie a te!!! :) a presto!

    RispondiElimina
  11. ciao, se con weka avressi un output di questo tipo
    inst# actual predicted error prediction
    1 1:GA3 1:GA3 1
    2 1:GA3 1:GA3 1
    3 14:ABA+alt 14:ABA+alt 0.984
    4 12:biostim 8:Eth + 1
    5 7:no 7:no 1
    6 5:citochin 5:citochin 1
    7 7:no 7:no 0.938
    8 8:Eth 1:GA3 + 0.9
    9 5:citochin 5:citochin 1

    come devo fare per ottenere una curva roc con rocr? ho cercato in giro e non hho avuto fortuna. grazie

    RispondiElimina
  12. Una soluzione consiste nell'installare il package RWeka ( install.packages(RWeka) ) ripetere la tua analisi in R e verificarne le performance con ROCR: ti basta fornire alla funzione prediction un vettore con le predizioni (le 'probabilità' associate alle singole predizioni) e un altro vettore con le labels originali (?predictions).
    Più semplicemente potresti preparare un file di testo con le predizioni in una colonna e le labels nell'altra, importarlo in R ( read.table() ) e quindi verificarne le performance con ROCR.

    RispondiElimina
  13. Non riesco a installare il package ROCR nella versione 2.15.0 di R.
    Mi esce il seguente warning: package ‘ROCR_1.0-2’ is not available (for R version 2.15.0).
    Idee alternative?
    Grazie!
    Monica

    RispondiElimina
  14. L'ultima versione di ROCR è la 1.0-4 ed è quella che ti consiglio di installare con un semplice: install.packages("ROCR"); Se preferisci compilarlo da sorgente (ma devi avere tutti gli strumenti per compilare specifici per la tua piattaforma): install.packages("ROCR", type="source"). Se questa procedura non andasse a buon fine, prova a scaricare il pacchetto (scegli il binario specifico per il tuo sistema operativo) da http://cran.r-project.org/web/packages/ROCR/index.html e da linea di comando scrivi: R CMD INSTALL ROCR_1.0-4.tar.gz

    RispondiElimina
  15. Thanks for the nice guidelines :-)

    RispondiElimina
  16. ciao ho un problema con R non riesco a calcolare la sensitivity, specificity e i valori di cutoff relativi alla mia ROC curve

    io ho il valore della proteina PCR3 e la deiscenza, variabile dicotomica.
    ho usato i seguenti comandi per calcolare AUC e fare il plot della ROC curve
    pred4=prediction(`PCT 5`, Deiscenza)
    ####Curva Roc#
    perf4=performance(pred4,"tpr","fpr")
    plot(perf4,main="PCT 5")
    abline(a=0,b=1)

    auc1=performance(pred1,"auc")

    grazie a chi mi aiuterà

    RispondiElimina
    Risposte
    1. Per questo tipo di domande (specialmente se poste in italiano) ti consiglio l'iscrizione alla mailing list della comunita' italiana di appasionati di R RANTE: http://rante.org/

      HIH

      Elimina
    2. thank you.
      How can I calculate sensitivity, specificity and the cutoff values by my ROC curve?

      Elimina