Como determinar o melhor ponto de corte e seu intervalo de confiança usando a curva ROC em R?


51

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):

Curva ROC

Minhas perguntas são:

  1. Como determinar o ponto de corte para este teste e seu intervalo de confiança em que as leituras devem ser julgadas ambíguas?
  2. Qual é a melhor maneira de visualizar isso (usando ggplot2)?

O gráfico é renderizado usando ROCRe ggplot2pacotes:

#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

Respostas:


30

Obrigado a todos que responderam a esta pergunta. Concordo que não poderia haver uma resposta correta e os critérios dependem muito dos objetivos que estão por trás de determinado teste de diagnóstico.

Finalmente, encontrei um pacote R OptimalCutpoints dedicado exatamente a encontrar o ponto de corte nesse tipo de análise. Na verdade, existem vários métodos para determinar o ponto de corte.

  • "CB" (método custo-benefício);
  • "MCT" (minimiza o termo de custo de classificação incorreta);
  • "MinValueSp" (um valor mínimo definido para Especificidade);
  • "MinValueSe" (um valor mínimo definido para Sensibilidade);
  • "RangeSp" (um intervalo de valores definido para Especificidade);
  • "RangeSe" (um intervalo de valores definidos para Sensibilidade);
  • "ValueSp" (um valor definido para Especificidade);
  • "ValueSe" (um valor definido para Sensibilidade);
  • "MinValueSpSe" (um valor mínimo definido para especificidade e sensibilidade);
  • "MaxSp" (maximiza a especificidade);
  • "MaxSe" (maximiza a sensibilidade);
  • "MaxSpSe" (maximiza sensibilidade e especificidade simultaneamente);
  • "Max-SumSpSe" (maximiza a soma de sensibilidade e especificidade);
  • "MaxProdSpSe" (maximiza o produto de sensibilidade e especificidade);
  • "ROC01" (minimiza a distância entre o gráfico ROC e o ponto (0,1));
  • "SpEqualSe" (sensibilidade = especificidade);
  • "Youden" (índice de Youden);
  • "MaxEfficiency" (maximiza eficiência ou precisão);
  • "Minimax" (minimiza o erro mais frequente);
  • "AUC" (maximiza a concordância que é uma função da AUC);
  • "MaxDOR" (maximiza a razão de probabilidades de diagnóstico);
  • "MaxKappa" (maximiza o índice Kappa);
  • "MaxAccuracyArea" (maximiza a área de precisão);
  • "MinErrorRate" (minimiza a taxa de erros);
  • "MinValueNPV" (um valor mínimo definido para Valor Preditivo Negativo);
  • "MinValuePPV" (um valor mínimo definido para Valor preditivo positivo);
  • "MinValueNPVPPV" (um valor mínimo definido para valores preditivos);
  • "PROC01" (minimiza a distância entre o gráfico e o ponto PROC (0,1));
  • "NPVEqualPPV" (valor preditivo negativo = valor preditivo positivo);
  • "ValueDLR.Negative" (um valor definido para a Razão de verossimilhança de diagnóstico negativa);
  • "ValueDLR.Positive" (um valor definido para Proporção de verossimilhança de diagnóstico positivo);
  • "MinPvalue" (minimiza o valor de p associado ao teste estatístico do qui-quadrado, que mede a associação entre o marcador e o resultado binário obtido no uso do ponto de corte);
  • "ObservedPrev" (o valor mais próximo da prevalência observada);
  • "MeanPrev" (o valor mais próximo da média dos valores dos testes de diagnóstico);
  • "PrevalenceMatching" (o valor para o qual a prevalência prevista é praticamente igual à prevalência observada).

Portanto, agora a tarefa é reduzida para selecionar o método que melhor combina com cada situação.

Existem muitas outras opções de configuração descritas na documentação do pacote, incluindo vários métodos para determinar intervalos de confiança e descrição detalhada de cada um dos métodos.


18
O grande número de métodos é um sinal da arbitrariedade de um ponto de corte. E como é totalmente inapropriado usar pontos de corte em variáveis ​​de entrada e apenas apropriado procurar pontos de corte (se necessário) em um valor geral previsto, não está claro por que tanto esforço é gasto nisso. Se você configurar uma regra de decisão ideal da Bayes com uma função de perda, tudo será resolvido; sem curva ROC, sem probabilidades de tempo para trás, como sensibilidade e especificidade, sem pontos de corte nas variáveis ​​de entrada.
— precisa

@FrankHarrell Você poderia elaborar isso? "Se você definir uma regra de decisão ideal da Bayes com uma função de perda, tudo será resolvido". Onde posso encontrar mais literatura sobre isso?
— Black Milk

11
Veja a literatura sobre as decisões ideais de Bayes e as regras de pontuação adequadas.
— Frank Harrell

26

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


15

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.


7

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.)


11
Exatamente certo que você precisa de conhecimento externo para obter a melhor decisão. Mas a função de perda não é declarada em termos das quantidades acima, e a decisão ideal vem da probabilidade prevista do resultado para o indivíduo , juntamente com a função de perda.
— Frank Harrell

6

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.

insira a descrição da imagem aqui


11
Se você olhar mais de perto o código-fonte, eu usei este pacote e li a documentação deste pacote. Ele não tem ferramentas para determinar os pontos de corte direito e "zona cinzenta"
— Yuriy Petrovskiy

11
Definitivamente, li o seu código, mas não existe o termo "ponto de corte correto", mas o gráfico Precisão versus ponto de corte pode fornecer a visão correta. E, usando esse gráfico, você pode descobrir como encontrar pontos de corte para a máxima precisão.
— Vladimir Chupakhin

2

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.


11
O experimento ainda está em andamento, portanto, receberei mais pontos de dados. Estou interessado em metodologia (acho que é o mesmo para qualquer contagem de pontos de dados). E eu não encontrei nenhum método estatístico para determinar a "zona cinzenta" enquanto é amplamente utilizado em testes desse tipo.
— Yuriy Petrovskiy
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.