2016-11-11 13 views
0

После многих поисков я не смог найти ответ на свою проблему. Я хотел бы генерировать ROC-кривую с pKK-pakkage, используя цикл for или sapply.Создайте кривую ROC с помощью цикла или sapply

Моя база данных выглядит следующим образом (только с 26 colums и 74 строк):

PT Bpt PA mnT1G mnT01 
1 1 1 2.3 4.5 
1 2 0 1.2 3.2 
2 1 1 5.4 2.1 

я могу сделать кривую ROC 'вручную':

plot.new() 
roc1 <- roc(cor.datT$PA, cor.datT$mT1G, percent=TRUE, partial.auc=c(100, 90), partial.auc.correct=TRUE, 
      partial.auc.focus="sens", ci=TRUE, boot.n=100, ci.alpha=0.9, stratified=FALSE, plot=TRUE, col= 'red') 
roc2 <- roc(cor.datT$PA, cor.datT$mT01, plot=TRUE, add=TRUE, percent=roc1$percent, col = 'blue') 

Для 'автоматический' Я пробовал:

Первая Рух кривая всегда mnT1G:

rocT1G <- roc(cor.datT$PA, cor.datT$mnT1G, percent=TRUE, partial.auc=c(100, 90), partial.auc.correct=TRUE, partial.auc.focus="sens", ci=TRUE, boot.n=100, ci.alpha=0.9, stratified=FALSE, plot=TRUE, col= 'red') 

Добавить другие кривые (данные $ Img - это все имена изображений (например, T1G, T01 и т. Д.) Из другого фрейма данных). Я понимаю, все они будут синими:

sapply(unique(data$Img[data$Img != "T1G"]), FUN = function(i) paste("roc",i,sep="") <- roc(cor.datT$PA, cor.datT[paste("mn",i, sep = "")], plot=TRUE, add=TRUE, percent=rocT1G$percent, col = 'blue'), simplify = FALSE) 

Но я получаю эту ошибку:

Error in roc.default(cor.datT$PA, cor.datT[paste("mn", i, sep = "")], : Predictor must be numeric or ordered.

То же самым происходит с циклом:

for (i in unique(data$Img[data$Img != "T1G"])){ 
    plot.new() 
    rocT1G <- roc(cor.datT$PA, cor.datT$mnT1G, percent=TRUE, partial.auc=c(100, 90), partial.auc.correct=TRUE, partial.auc.focus="sens", ci=TRUE, boot.n=100, ci.alpha=0.9, stratified=FALSE, plot=TRUE, col= 'red') 
    paste("roc",i,sep="") <- roc(cor.datT$PA, cor.datT[paste("mn",i, sep = "")], plot=TRUE, add=TRUE, percent=rocT1G$percent, col = 'blue') 
} 

Я проверил столбцы и все они числовые , Может, что-то пойдет не так с классом в моем скрипте?

+0

редактировать свой вопрос, чтобы иметь код отображается правильно. Вы можете найти конкретные варианты в верхней части окна редактирования –

ответ

0

Как вы отметили в комментарии к моему другому ответу, проблема в том, что вы получаете конкретно data.frame s из вашей добычи.

В data.frame извлечение одним символом возвращает data.frame. Это отражено в ?Extract.data.frame:

Data frames can be indexed in several modes. When [ and [[ are used with a single vector index (x[i] or x[[i]]), they index the data frame as if it were a list.

И глядя на ?Extract:

Recursive (list-like) objects

Indexing by [ is similar to atomic vectors and selects a list of the specified element(s).

Это не так очевидно из текста, но для того, чтобы извлечь столбец в вектор, вам нужно использовать два кронштейны [[, так

class(cor.datT[[paste("mn",i, sep = "")]]) 

должен быть вектором.

Теперь следующий код должен работать:

rocT1G <- roc(cor.datT$PA, cor.datT$mnT1G, percent=TRUE, partial.auc=c(100, 90), partial.auc.correct=TRUE, partial.auc.focus="sens", ci=TRUE, boot.n=100, ci.alpha=0.9, stratified=FALSE, plot=TRUE, col= 'red') 
for (i in unique(data$Img[data$Img != "T1G"])){ 
    roc(cor.datT$PA, cor.datT[[paste("mn",i, sep = "")]], plot=TRUE, add=TRUE, percent=rocT1G$percent, col = 'blue') 
} 
+0

Спасибо! Это работает!! Однако следующая проблема, в соответствии с последней, генерирует объекты roc. При этом вручную класс объекта rocT1G, rocT01 является «roc». В цикле класс является «символом». Как получить цикл для создания правильного класса? –

+0

Это ошибка: Ошибка в пасте ("roc", i, sep = "") <- roc (cor.datT $ PA, cor.datT [[paste ("mn",: target присваивания расширяется до -язычный объект –

+0

Да, вы не можете назначить кривую ROC для строки, но вам нужно ее вообще назначить? Позвольте мне попытаться отредактировать мой ответ – Calimo

0

Один из ваших столбцов не является числовым, как вы ожидаете. К сожалению, сообщение об ошибке от R не говорит вам, на какой итерации цикла проблема возникает, но вы можете легко добавить print заявление в свой цикл, чтобы выяснить, какой столбец дает проблемой номер

for (i in unique(data$Img[data$Img != "T1G"])){ 
    print(i) 
    plot.new() 
    rocT1G <- roc(cor.datT$PA, cor.datT$mnT1G, percent=TRUE, partial.auc=c(100, 90), partial.auc.correct=TRUE, partial.auc.focus="sens", ci=TRUE, boot.n=100, ci.alpha=0.9, stratified=FALSE, plot=TRUE, col= 'red') 
    paste("roc",i,sep="") <- roc(cor.datT$PA, cor.datT[paste("mn",i, sep = "")], plot=TRUE, add=TRUE, percent=rocT1G$percent, col = 'blue') 
} 

Последняя колонка напечатанный будет одним. Вы можете увидеть, что происходит с колонкой:

class(cor.datT[paste("mn",i, sep = "")]) 
str(cor.datT[paste("mn",i, sep = "")]) 

В целом вы можете проверить все столбцы фрейма данных довольно быстро с

str(cor.datT) 

Выездом для столбцов класса character или factor в конкретный.

+0

Спасибо Калимо. Классы столбцов в dataframe cor.datT являются численными. С print (class (cor.datT [paste ("mn", i, sep = "")])) это показывает, что цикл делает их все dataframes. Как я могу заставить их оставаться численными в цикле? –

+0

Хороший улов, позвольте мне опубликовать новый ответ – Calimo