2016-11-11 117 views
0

經過大量搜索後,我找不到解決問題的答案。我想使用for循環或sapply生成一個ROC曲線,並使用pROC pakkage。使用for循環或sapply創建ROC曲線

我的數據庫看起來像這樣(只適用於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') 

對於 '自動' 我想:

首先ROC曲線總是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') 

添加其他roc曲線(數據$ 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」,: 作業的目標擴展爲非-language object –

+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') 
} 

最後一列數打印將是一個。你可以看到正在發生的事情與列:在

str(cor.datT) 

檢查出characterfactor類的列

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

更普遍,可以檢查數據幀的所有列得相當快特定。

+0

謝謝Calimo。 dataframe cor.datT中的列的類都是數字的。用print(class(cor.datT [paste(「mn」,i,sep =「」)]))它顯示循環使它們成爲所有數據框。我怎樣才能讓他們在循環中保持數字? –

+0

好的,讓我發表一個新的答案 – Calimo