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
Yuriy Petrovskiy
fonte

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.

Yuriy Petrovskiy
fonte
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

Boscovich
fonte
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.

Frank Harrell
fonte
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.)

cbeleites suporta Monica
fonte
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

Vladimir Chupakhin
fonte
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.

Patrick Caldon
fonte
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