Eu tenho os dados de um teste que poderia ser usado para distinguir células normais e tumorais. De acordo com a curva ROC, parece bom para esse propósito (a área sob a curva é 0,9):
Minhas perguntas são:
- Como determinar o ponto de corte para este teste e seu intervalo de confiança em que as leituras devem ser julgadas ambíguas?
- Qual é a melhor maneira de visualizar isso (usando
ggplot2
)?
O gráfico é renderizado usando ROCR
e ggplot2
pacotes:
#install.packages("ggplot2","ROCR","verification") #if not installed yet
library("ggplot2")
library("ROCR")
library("verification")
d <-read.csv2("data.csv", sep=";")
pred <- with(d,prediction(x,test))
perf <- performance(pred,"tpr", "fpr")
auc <-performance(pred, measure = "auc")@y.values[[1]]
rd <- data.frame(x=perf@x.values[[1]],y=perf@y.values[[1]])
p <- ggplot(rd,aes(x=x,y=y)) + geom_path(size=1)
p <- p + geom_segment(aes(x=0,y=0,xend=1,yend=1),colour="black",linetype= 2)
p <- p + geom_text(aes(x=1, y= 0, hjust=1, vjust=0, label=paste(sep = "", "AUC = ",round(auc,3) )),colour="black",size=4)
p <- p + scale_x_continuous(name= "False positive rate")
p <- p + scale_y_continuous(name= "True positive rate")
p <- p + opts(
axis.text.x = theme_text(size = 10),
axis.text.y = theme_text(size = 10),
axis.title.x = theme_text(size = 12,face = "italic"),
axis.title.y = theme_text(size = 12,face = "italic",angle=90),
legend.position = "none",
legend.title = theme_blank(),
panel.background = theme_blank(),
panel.grid.minor = theme_blank(),
panel.grid.major = theme_line(colour='grey'),
plot.background = theme_blank()
)
p
data.csv contém os seguintes dados:
x;group;order;test
56;Tumor;1;1
55;Tumor;1;1
52;Tumor;1;1
60;Tumor;1;1
54;Tumor;1;1
43;Tumor;1;1
52;Tumor;1;1
57;Tumor;1;1
50;Tumor;1;1
34;Tumor;1;1
24;Normal;2;0
34;Normal;2;0
22;Normal;2;0
32;Normal;2;0
25;Normal;2;0
23;Normal;2;0
23;Normal;2;0
19;Normal;2;0
56;Normal;2;0
44;Normal;2;0
fonte
Na minha opinião, existem várias opções de corte. Você pode ponderar a sensibilidade e a especificidade de maneira diferente (por exemplo, talvez para você seja mais importante fazer um teste de alta sensibilidade, mesmo que isso signifique ter um teste específico baixo. Ou vice-versa).
Se a sensibilidade e a especificidade tiverem a mesma importância para você, uma maneira de calcular o corte é escolher esse valor que minimize a distância euclidiana entre sua curva ROC e o canto superior esquerdo do gráfico.
Outra maneira é usar o valor que maximiza (sensibilidade + especificidade - 1) como ponto de corte.
Infelizmente, não tenho referências para esses dois métodos, pois os aprendi com professores ou outros estatísticos. Eu só ouvi falar desse último método como o 'índice de Youden' [1]).
[1] https://en.wikipedia.org/wiki/Youden%27s_J_statistic
fonte
Resista à tentação de encontrar um ponto de corte. A menos que você tenha uma função de utilidade / perda / custo pré-especificada, um ponto de corte será prejudicado pela tomada de decisão ideal. E uma curva ROC é irrelevante para esse problema.
fonte
Matematicamente falando, você precisa de outra condição para resolver o corte.
Você pode traduzir o ponto de @ Andrea para: "use conhecimento externo sobre o problema subjacente".
Condições de exemplo:
para esta aplicação, precisamos de sensibilidade> = x, e / ou especificidade> = y.
um falso negativo é 10 vezes mais ruim que um falso positivo. (Isso daria a você uma modificação do ponto mais próximo do canto ideal.)
fonte
Visualize precisão versus ponto de corte. Você pode ler mais detalhes na documentação do ROCR e uma apresentação muito agradável do mesmo.
fonte
O que é mais importante - há muito poucos pontos de dados por trás dessa curva. Quando você decidir como fará a troca de sensibilidade / especificidade, recomendo fortemente que você inicie a curva e o número de corte resultante. Você pode achar que há muita incerteza no seu melhor corte estimado.
fonte