В R как вычислить значение p для площади под ROC

12

Я изо всех сил пытаюсь найти способ вычислить значение p для области под характеристикой оператора приемника (ROC). У меня есть непрерывная переменная и результат диагностического теста. Я хочу посмотреть, является ли AUROC статистически значимым.

Я нашел много пакетов, имеющих дело с кривыми ROC: pROC, ROCR, caTools, верификация, Epi. Но даже после многих часов, потраченных на чтение документации и тестирование, я не мог найти, как. Я думаю, что я просто пропустил это.

user32530
источник
1
Что это может означать для области под кривой быть «значительным»?
gung - Восстановить Монику
Я хотел сказать, тестирование, если значение AUC статистически отличается от 0,5
user32530
Откуда взялась ваша кривая ROC? Предположительно, вы хотите проверить это (например, есть значение p для модели логистической регрессии, взятой в целом).
gung - Восстановить Монику
Ну, мои данные похожи на следующие, у меня есть стандартный тест, который делает группировку с / без болезни, и я хочу найти предельное значение для биологического определения из образца крови. Кроме того, мне нужна площадь под кривой. Так что нет, у меня нет никакой модели регрессии
user32530
Итак, у вас есть тест, который проводится на образце крови, взятом у пациента, который дает вам номер; и вы захотите использовать это число для классификации, если у пациента есть заболевание. В настоящее время у вас есть набор цифр из этого теста для группы пациентов, для которых вы знаете их истинное заболевание. Это все правильно?
gung - Восстановить Монику

Ответы:

12

В вашей ситуации было бы хорошо построить кривую ROC и рассчитать площадь под этой кривой, но это следует рассматривать как дополнение к вашему основному анализу, а не самому первичному анализу. Вместо этого вы хотите использовать модель логистической регрессии .

Модель логистической регрессии будет стандартна с тестом модели в целом. (На самом деле, поскольку у вас есть только одна переменная, это p-значение будет таким же, как и p-значение для вашей переменной результата теста.) Это p-значение - это то, что вам нужно. Модель позволит вам рассчитать прогнозируемую вероятность того, что наблюдение будет болезненным. Receiver Operating характеристика говорит вам , как чувствительность и специфичность будут балансировать, если вы используете различные пороговые значения для преобразования прогнозируемой вероятности в предсказанной классификацию. Так как прогнозируемая вероятность будет функцией вашей переменной результата теста, она также сообщит вам, как они компенсируются, если вы используете разные значения результата теста в качестве порога.


Если вы не очень хорошо знакомы с логистической регрессией, в Интернете доступны некоторые ресурсы (помимо страницы Википедии, ссылки на которую приведены выше):

Gung - Восстановить Монику
источник
Это было очень поучительно. Спасибо! Поэтому мне подходит логистическая модель glm binomial (логит). Затем я сравниваю его с нулевой моделью, и этот тест дает мне значение p, которое я ищу?
user32530
Да, это должно сделать это для вас. LR сделает возможным и многое другое, но это может быть все, что вам нужно.
gung - Восстановить Монику
Таким образом, код будет выглядеть следующим образом? GLM.1 <- glm (группа ~ непрерывное_вариант, семейство = биномиальное (логит), данные = диагностические данные) (GLM.1) GLM.2 <- glm (группа ~ 1, семейство = биномиальное (логит), данные = диагностические данные) anova (GLM.2, GLM.1, test = "Chisq")
user32530
summary(GLM.1)должен дать вам то, что вам нужно, и я думаю, anova(GLM.1)что проверю это на нулевой модели без вашей необходимости. Но ваш путь обязательно сработает, да.
gung - Восстановить Монику
9

В основном вы хотите проверить H0 = "AUC равен 0,5".

Это фактически эквивалентно высказыванию H0 = «Распределение рангов в двух группах одинаково».

Последнее является нулевой гипотезой критерия Манна-Уитни (Уилкоксона) (см., Например, Gold, 1999 ).

Другими словами, вы можете безопасно использовать тест Манна-Уитни-Уилкоксона, чтобы ответить на ваш вопрос (см., Например, Mason & Graham, 2002 ). Это именно то, что делает пакет проверки, упомянутый Franck Dernoncourt.

Calimo
источник
Почему было бы интересно показать, что прогнозы не случайны? Это не оценивает полезность.
Фрэнк Харрелл
1
@FrankHarrell Потому что во многих случаях ваши прогнозы могут быть не лучше случайных - в этом случае полезность, о которой вы сообщаете, фактически равна нулю. Несомненно, сообщение о доверительном интервале мер полезности (чувствительность и специфичность) было бы более полезным. Но тестирование различий между двумя группами, по крайней мере, является обычным явлением в клинической литературе (и фактически там группы часто не различаются), и я видел рецензентов, специально спрашивающих об этом.
Calimo
Это мало смысла ИМХО. Я хочу знать, насколько полезно что-то, не лучше ли это, чем просто подбрасывать монету.
Фрэнк Харрелл
Если это не лучше, чем подбрасывание монеты, тогда зачем вам проделывать всю эту работу? Просто подбрось монету.
Скотт
4

Вы можете использовать roc.area () из проверки пакета :

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)

Он вернется $p.value [1] 0.0069930071

Франк Дернонкур
источник
Большое спасибо, но у меня нет значений c и d. У меня есть стандартный тест, который делает группирование с / без болезни, и я хочу найти предельное значение для биологического определения из образца крови. Кроме того, мне нужна площадь под кривой. Так что нет, у меня нет никаких регрессов. У меня есть двоичная переменная stdtest и непрерывная переменная биологического значения
user32530
о хорошо, я думал, что у вас есть д, так как я предполагал, что у вас уже есть кривая ROC.
Франк Дернонкур
3
Обычно является ошибкой добиваться произвольного отключения, когда истинная связь с вероятностью заболевания является гладкой. Кроме того, проверка нулевой гипотезы о том, что площадь ROC равна 0,5, является довольно скучной гипотезой. Для большинства прогнозов вас волнует, насколько хорош прогноз, а не случайный.
Фрэнк Харрелл
Нет проблем, и спасибо, Фрэнк Демонкур, может быть, есть способ получить d.
user32530
В медицинской сфере иногда им нужны эти предельные точки для создания диагностических тестов. С теми, кого они хотят выяснить, болен ли субъект или нет, не предсказать что-либо. Иногда им необходимо сократить расходы с помощью более дешевого решения для определения статуса заболевания.
user32530
0

Две кривые ROC можно сравнить с помощью pROC roc.test(). Это также производит р-значение. Кроме того, использование roc(..., auc=TRUE, ci=TRUE)даст вам более низкие и более высокие доверительные интервалы вместе с AUC в выходных данных при создании объекта ROC, что может быть полезно.

Ниже приведен пример рабочего кода, который проверяет, являются ли мили на галлон или вес автомобиля лучшим индикатором типа трансмиссии, которой он оснащен (автоматический или ручной):

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

Кажется, вес значительно лучше предсказывает, чем расход топлива. Однако здесь сравниваются две кривые, а не одна кривая с таким числом, как 0,5. Глядя на доверительный интервал, чтобы увидеть, содержит ли оно число 0,5, мы узнаем, существенно ли оно отличается, но не дает p-значения.

НОКС
источник
Предоставляет ли он также значение p?
Майкл Р. Черник
Хотя вопрос задается конкретно с точки зрения R, наша общая политика заключается в том, что мы являемся сайтом вопросов и ответов по статистике (машинное обучение и т. Д.). Таким образом, для Q необходимо иметь статистическое содержание, и настоятельно рекомендуется, чтобы As не были представлены только в определенных программных терминах. В свете этого, можете ли вы рассказать больше о том, что представляет собой этот тест и как он работает, помимо упоминания о том, что он существует в R, и показать код R для него?
gung - Восстановить Монику
Хорошо, я
обновлю