2016-09-11 2 views
0

Я работаю над оценкой скринингового теста на остеопороз, и у меня есть большой набор данных, где мы измеряли значения плотности костной ткани. Мы классифицировали индивидов как «позитивные по болезни» для остеопороза, если у них был перелом позвонков, присутствующий на изображениях, когда мы приняли меру плотности кости.Проблема с кривой ROC, где «положительный результат теста» ниже определенного порога

«Болезнь положительная» имеет более низкое распределение непрерывного значения, чем отрицательная группа болезни.

Мы хотим определить, какой порог для непрерывной переменной лучше всего подходит для определения того, обладает ли человек более высоким риском для будущих переломов. Мы обнаружили, что чем ниже значение, тем выше риск. Я использовал Stata для создания некоторых таблиц для расчета чувствительности и специфичности с несколькими разными порогами. Опять же, человек является «положительным испытанием», если их значение равно ниже порог. I made this table here:

Мы хотели показать это в графической форме, поэтому я решил сделать кривую ROC, и я использовал пакет ROCR для этого. Вот код, который я использовал в R:

library(ROCR) 
prevalentfx <- read.csv("prevalentfxnew.csv", header = TRUE)  

pred <- prediction(prevalentfx$l1_hu, prevalentfx$fx) 
perf <- performance(pred, "tpr", "fpr") 

plot(perf, print.cutoffs.at = c(50,90,110,120), points.pch = 20, points.col = "darkblue", 
     text.adj=c(1.2,-0.5)) 

И вот что выходит: Not what I expected!

Это не имеет смысла для меня, потому что в соответствии с несколькими порогами, где я вычисленных чувствительность и специфичность вручную (в таблице), 50 HU - это наименьший чувствительный порог и 120 - это самый чувствительный. Кроме того, я чувствую, что кривая перевернута вдоль диагональной оси. Я знаю, что этот тест не , что плохой.

Я понял, что этот вопрос был вызван тем, что человек является «положительным испытанием», если значение ниже порог, а не выше них. Итак, я просто создал новый вектор значений, где я перевернул двоичную классификацию и заново создал график ROC, и получил цифру, которая намного лучше согласуется с данными. Однако пороговые значения все еще противоположны тому, что они должны быть.

Есть ли что-то принципиально неправильное в отношении того, как я смотрю на это? Я дважды проверял наши данные несколько раз, чтобы убедиться, что я не просчитываю значения чувствительности и специфичности, и все выглядит правильно. Благодарю.

EDIT:

Вот рабочий пример:

library(ROCR) 

low <- rnorm(200, mean = 73, sd = 42) 
high<- rnorm(3000, mean = 133, sd = 51.5) 

measure <- c(low, high) 
df = data.frame(measure) 

df$fx <- rep.int(1, 200) 
df$fx[201:3200] <- rep.int(0,3000) 

pred <- prediction(df$measure, df$fx) 
perf <- performance(pred, "tpr", "fpr") 

plot(perf,print.cutoffs.at=c(50,90,110,120), points.pch = 20, points.col = "darkblue", 
    text.adj=c(1.2,-0.5)) 
+2

предоставьте воспроизводимый пример –

+0

Добро пожаловать в StackOverflow! Если бы вы могли просто 'dput()' данные, это было бы здорово. Для тега R наше правило (по описанию тега) равно * «Пожалуйста, добавьте свой вопрос с минимальным воспроизводимым примером. Используйте' dput() 'для данных и укажите все не-базовые пакеты с вызовами библиотеки. * * –

ответ

1

Самое простое решение (хотя безвкусный) может быть использовать отрицательные значения (а не задним ходом вашей классификации):

pred <- prediction(-df$measure, df$fx) 
perf <- performance(pred, "tpr", "fpr") 
plot(perf, 
    print.cutoffs.at=-c(50,90,110,120), 
    cutoff.label.function=`-`, 
    points.pch = 20, points.col = "darkblue", 
    text.adj=c(1.2,-0.5)) 

enter image description here

+0

Спасибо! Я использовал это, и закончил только редактирование фотографий отрицательных знаков из финальной фигуры. Я могу связаться с автором пакета ROCR, чтобы узнать, есть ли у него другое решение, которое не требовало бы этого последнего шага. – ambroise

+0

Я только заметил, что метод 'plot' для объекта' performance' имеет аргумент 'cutoff.label.function', который позволяет применять любую функцию к меткам cutoff. В этом случае '-' будет делать трюк, поэтому вам не придется выполнять пост-обработку сюжета. Я обновил свой ответ соответственно. –

Смежные вопросы