2016-01-29 42 views
2

所以我想爲我的數據集擬合隨機森林分類器。我對R很新,我想這是一個簡單的格式問題。運行randomForest時出錯:未找到對象

我在一個文本文件中讀取和轉換我的數據集因此它是這種格式:(取出信息保密)

>head(df.train,2) 

    GOLGA8A  ITPR3 GPR174 SNORA63 GIMAP8  LEF1 PDE4B LOC100507043 TGFB1I1 SPINT1 
Sample1 3.726046 3.4013711 3.794364 4.265287 -1.514573 7.725775 2.162616 -1.514573 -1.5145732 -1.514573 
Sample2 4.262779 0.9261892 4.744096 7.276971 -1.514573 4.694769 4.707387  2.031476 -0.8325444 2.615991 
... 
... 
CD8B  FECH PYCR1 MGC12916  KCNA3 resp 
Sample1 -1.514573 2.099336 3.427928 1.542951 -1.514573 1 
Sample2 -1.145806 1.204241 2.846832 1.523808 1.616791 1 

本質列是我的特點,行我的樣本,最後一列是我的反應向量,它是一列因子,

然後我用:

set.seed(1) #Set the seed in order to gain reproducibility 

RF1 = randomForest(resp~., data=df.train,ntree=1000,importance=T,mtry=3) 

只是想使用其他列的功能訓練對我的專欄resp的RF。

但我得到的錯誤:

Error in eval(expr, envir, enclos) : object 'PCNA-AS1' not found 

然而,尋找到我的訓練集,我可以清楚地發現,塔,例如有:

sort(unique(colnames(df.train)) 

所以,我真的不理解的錯誤或從哪裏去。如果我沒有以正確的方式提出問題,我表示歉意,感謝任何幫助!

+0

你可以讓這個可重複的例子(又名提供'df.train'導致錯誤的示例數據)? – josliber

回答

2

總之,這是一個非常新手的錯誤,我輸入了一個矩陣而不是導致這個錯誤的data.frame。爲什麼它抱怨那個特定的專欄(這不是第一個專欄)與另一專欄相比,我仍然不明白。 感謝您的幫助。 乾杯, 安東尼

+0

創建/鑄造data.frame時,check.names = TRUE。所以輸入data.frame可以解決問題,因爲非法col.names會被編輯。一般而言,randomForest比data.frame少得多的問題 –

3

我會懷疑這是來自您的數據框中有一個非法的變量名稱。讓我們來考慮,僅僅有一個響應變量resp名爲PCNA-AS1一個數據幀和變量(非法):

(dat <- structure(list(`PCNA-AS1` = c(1, 2, 3), resp = structure(c(2L, 2L, 1L), .Label = c("0", "1"), class = "factor")), .Names = c("PCNA-AS1", "resp"), row.names = c(NA, -3L), class = "data.frame")) 
# PCNA-AS1 resp 
# 1  1 1 
# 2  2 1 
# 3  3 0 

現在,當我們訓練隨機森林,我們得到指示的錯誤:

library(randomForest) 
mod <- randomForest(resp~., data=dat) 
# Error in eval(expr, envir, enclos) : object 'PCNA-AS1' not found 

自然解決這個問題的辦法是將你的變量名轉換爲合法的:

names(dat) <- make.names(names(dat)) 
dat 
# PCNA.AS1 resp 
# 1  1 1 
# 2  2 1 
# 3  3 0 
mod <- randomForest(resp~., data=dat) 

現在模型訓練沒有錯誤。

+0

感謝您的評論Josilber,我試圖轉換爲合法名稱,但那不是問題。這個錯誤實際上是我給了randomForest一個矩陣(而不是數據框),我認爲這並不重要,randomForest可以很容易地在兩者之間進行轉換。但我錯了,所以現在我解決了這個問題。 – AHawks

+0

@AHawks好吧,那麼更重要的是你要編輯你的問題,使其重現! (又包括複製問題所需的代碼和數據)。嘗試將數據框中的列減少到可以重現問題的最小數字,然後發佈該數據集(如果您還沒有弄清楚首先發生了什麼)。 – josliber

+0

是的,你是絕對正確的,那樣會更好,我會爲將來的問題做到這一點,只是習慣於在堆棧溢出中呈現問題,所以感謝您的建議! – AHawks