Em R, como calcular o valor p para a área sob ROC

12

Eu luto para encontrar uma maneira de calcular o valor-p da área sob uma característica de operador de receptor (ROC). Eu tenho uma variável contínua e um resultado de teste de diagnóstico. Quero ver se o AUROC é estatisticamente significativo.

Encontrei muitos pacotes que tratam de curvas ROC: pROC, ROCR, caTools, verificação, Epi. Mas mesmo depois de muitas horas lendo a documentação e os testes, não consegui descobrir como. Eu acho que acabei de errar.

user32530
fonte
1
O que poderia significar para a área sob a curva ser "significativa"?
gung - Restabelece Monica
Eu queria dizer a testar se o valor AUC é estatisticamente diferente de 0,5
user32530
De onde veio a sua curva ROC? Presumivelmente, você quer um teste disso (por exemplo, existe um valor p para um modelo de regressão logística tomado como um todo).
gung - Restabelece Monica
Bem, meus dados são os seguintes, eu tenho um teste padrão que agrupa com / sem doença e quero encontrar um valor de corte para uma determinação biológica de uma amostra de sangue. Além disso, preciso da área sob a curva. Portanto, não, eu não tenho nenhum modelo de regressão
User32530 10/10
Então você tem algum teste que é realizado em uma amostra de sangue coletada de um paciente, o que fornece um número; e você deseja usar esse número para classificar se o paciente tem a doença. Atualmente, você tem um conjunto de números deste teste para um conjunto de pacientes em que conhece o verdadeiro estado da doença. Tudo isso está correto?
gung - Restabelece Monica

Respostas:

12

Na sua situação, seria bom plotar uma curva ROC e calcular a área sob essa curva, mas isso deve ser pensado como suplementar à sua análise principal, e não à análise primária em si. Em vez disso, você deseja ajustar um modelo de regressão logística .

O modelo de regressão logística virá como padrão com um teste do modelo como um todo. (Na verdade, como você tem apenas uma variável, esse valor p será o mesmo da variável de resultado do teste.) Esse valor p é o que você procura. O modelo permitirá calcular a probabilidade prevista de uma observação estar doente. Uma característica de operação do receptor informa como a sensibilidade e a especificidade serão trocadas, se você usar limites diferentes para converter a probabilidade prevista em uma classificação prevista. Como a probabilidade prevista será uma função da variável de resultado do teste, também será informado como eles serão trocados se você usar diferentes valores de resultado do teste como seu limite.


Se você não está muito familiarizado com a regressão logística, existem alguns recursos disponíveis na internet (além da página da Wikipedia vinculada acima):

Repor a Monica
fonte
Isso foi muito esclarecedor. Obrigado! Então, eu ajustei um modelo logístico glm binomial (logit). Então eu comparo com um modelo nulo e esse teste me dá o valor de p que estou procurando?
user32530
Sim, isso deve fazer isso por você. O LR também possibilitará muitas outras coisas, mas isso pode ser tudo o que você precisa.
gung - Restabelece Monica
Então o código seria o seguinte? Resumo GLM.1 <- glm (Grupo ~ continuVar, família = binomial (logit), dados = diagnósticoDados) resumo (GLM.1) GLM.2 <- glm (Grupo ~ 1, família = binomial (logit), dados = diagnosticData) anova (GLM.2, GLM.1, test = "Chisq")
user32530 13/11/13
summary(GLM.1)deve fornecer o que você precisa, e acho anova(GLM.1)que o testará contra o modelo nulo sem que você realmente precise ajustá-lo. Mas seu caminho definitivamente funcionará, sim.
gung - Restabelece Monica
8

Basicamente, você deseja testar H0 = "A AUC é igual a 0,5".

Isso é de fato equivalente a dizer H0 = "A distribuição das classificações nos dois grupos é igual".

Esta última é a hipótese nula do teste de Mann-Whitney (Wilcoxon) (ver, por exemplo , Gold, 1999 ).

Em outras palavras, você pode usar com segurança um teste de Mann-Whitney-Wilcoxon para responder sua pergunta (ver, por exemplo, Mason & Graham, 2002 ). É exatamente isso que o pacote de verificação mencionado por Franck Dernoncourt faz.

Calimo
fonte
Por que seria interessante mostrar que as previsões não são aleatórias? Isso não avalia utilidade.
Frank Harrell
@FrankHarrell Porque, em muitos casos, suas previsões podem não ser melhores do que aleatórias - nesse caso, a utilidade que você denuncia é realmente nula. Certamente, relatar um intervalo de confiança das medidas de utilidade (sensibilidade e especificidade) seria mais útil. Mas testar a diferença entre dois grupos é pelo menos comum na literatura clínica (e, de fato, os grupos geralmente não diferem) e vi revisores solicitando isso especificamente.
Calimo 31/01
Isso faz pouco sentido IMHO. Quero saber o quanto algo é útil, não se é melhor do que apenas jogar uma moeda.
Frank Harrell
Se não é melhor do que jogar uma moeda, por que você passaria por todo esse trabalho? Apenas jogue a moeda.
Scott Scott
4

Você pode usar roc.area () na verificação do pacote :

install.packages("verification")
library("verification")

# Data used from Mason and Graham (2002).
a<- c(1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990,
 1991, 1992, 1993, 1994, 1995)
d<- c(.928,.576, .008, .944, .832, .816, .136, .584, .032, .016, .28, .024, 0, .984, .952)

A<- data.frame(a,d)
names(A)<- c("year", "p2")

# For model without ties
roc.area(A$event, A$p2)

Vai voltar $p.value [1] 0.0069930071

Franck Dernoncourt
fonte
Muito obrigado, mas não tenho nenhum valor c e d. Eu tenho um teste padrão que agrupa com / sem doença e quero encontrar um valor de corte para uma determinação biológica de uma amostra de sangue. Além disso, preciso da área sob a curva. Então não, eu não tenho nenhuma regressão. Tenho a variável binária stdtest e biologicalvalue contínua variável
user32530
oh ok, eu pensei que você tinha, como eu assumi que você já tinha uma curva ROC.
Franck Dernoncourt 11/11/2013
3
Geralmente, é um erro buscar um corte arbitrário quando a verdadeira relação com a probabilidade da doença é suave. Além disso, testar a hipótese nula de que a área ROC é 0,5 é uma hipótese bastante chata. Para a maioria das previsões, você se importa com o quão boa é a previsão, não se é aleatória.
precisa
Sem problemas, e obrigado, Frank Demoncourt, talvez haja uma maneira de obter d.
user32530
Às vezes, na área médica, eles precisam desses pontos de corte para criar testes de diagnóstico. Com aqueles que querem descobrir se o sujeito está doente ou não, não prever algo. Às vezes, eles precisam cortar custos com uma determinação mais barata para identificar o status da doença.
user32530
0

Duas curvas ROC podem ser comparadas no pROC usando roc.test(). Isso também produz um valor-p. Além disso, o uso roc(..., auc=TRUE, ci=TRUE)fornecerá intervalos de confiança mais altos e mais baixos, juntamente com a AUC na saída, ao criar o objeto ROC, o que pode ser útil.

A seguir, é apresentado um exemplo de código que testa se as milhas por galão ou o peso de um carro são um melhor indicador do tipo de transmissão com a qual vem equipado (automático ou manual):

library(pROC)
roc_object_1 <- roc(mtcars$am, mtcars$mpg, auc=T, ci=T) #gives AUC and CI
roc_object_2 <- roc(mtcars$am, mtcars$wt, auc=T, ci=T) #gives AUC and CI

roc.test(roc_object_1, roc_object_2) #gives p-value

O peso é um indicador significativamente melhor do que o consumo de combustível, ao que parece. No entanto, isso está comparando duas curvas, e não uma única curva contra um número como 0,5. Observar o intervalo de confiança para ver se ele contém o número 0,5 nos diz se é significativamente diferente, mas não produz um valor-p.

naco
fonte
Também fornece o valor p?
Michael R. Chernick
Embora a pergunta seja feita especificamente em termos de R, nossa política geral aqui é que somos um site de perguntas e respostas sobre estatísticas (aprendizado de máquina, etc.). Portanto, é necessário que um Q tenha conteúdo estatístico, e é altamente preferido que o As não seja fornecido apenas em termos específicos de software. À luz disso, você pode dizer mais sobre o que é esse teste e como ele funciona, além de apenas mencionar que ele existe no R & mostrando o código R para ele?
gung - Restabelece Monica
Ok, eu vou atualizar a minha resposta para refletir algum fundo estatística
naco