2013-07-25 215 views
0

我想使用一個特性作爲響應變量來運行RF。我無法通過一個變量傳遞一個字符串作爲RF中的響應。首先,我嘗試在通過變量傳遞的字符串上運行RF作爲響應,並得到「向量長度不同的錯誤」。在此之後,我嘗試輸入實際的字符串(特徵)作爲響應,並且它工作正常。你能否介紹一下爲什麼可變長度不同?謝謝。隨機森林可變長度不同

> colnames(Data[1]) 
[1] "feature1" 
> rf.file = randomForest(formula =colnames(Data[1])~ ., data = Data, proximity = T,  importance = T, ntree = 500, nodesize = 3) 
Error in model.frame.default(formula = colnames(Data[1]) ~ ., : 
    variable lengths differ (found for 'feature1') 

Enter a frame number, or 0 to exit 

1: randomForest(formula = colnames(Data[1]) ~ ., data = Data, proximity = T, importance = T, ntree = 500, nodesize = 3) 
2: randomForest.formula(formula = colnames(Data[1]) ~ ., data = brainDataTrim, proximity = T, importance = T, ntree = 500, nodesize = 3) 
3: eval(m, parent.frame()) 
4: eval(expr, envir, enclos) 
5: model.frame(formula = colnames(Data[1]) ~ ., data = Data, na.action = function (object, ...) 
6: model.frame.default(formula = colnames(Data[1]) ~ ., data = Data, na.action = function (object, ...) 

Selection: 0 



> rf.file = randomForest(formula =feature1~ ., data = Data, proximity = T,  importance = T, ntree = 500, nodesize = 3) 
> rf.file 

Call: 
randomForest(formula = feature1 ~ ., data = Data,  proximity = T, importance = T, ntree = 500, nodesize = 3) 
       Type of random forest: regression 
        Number of trees: 500 
No. of variables tried at each split: 3 

      Mean of squared residuals: 0.1536834 
        % Var explained: 34.21 
> 

回答

3

您只是誤解了公式是如何工作的。基本上,你的第一次嘗試不是假設工作。

公式應該由變量的名稱組成,可能是簡單的函數。例如

var1 ~ var2 
var1 ~ log(var2) 

注意缺少引號。如果你沒有引用它,它不是一個字符串,它是一個符號。

因此,避免原始字符串,奇怪的評估需求(如Data[1],或任何使用$)在您的公式。 構造字符串中的公式,粘貼在一起,然後在結果字符串上調用as.formula

請記住,公式的全部要點是您已經提供了模型的符號表示形式,然後R將查找您在提供的數據框中命名的特定列。

我認爲一些函數會對你的公式的字符串表示進行強制轉換(例如"var1 ~ var2"),但我不會指望或期待它。

+0

感謝您的迴應!我發現可以使用paste來構造字符串以便在公式中使用,並且這種方式實際上可以實現。另一種方法是使用公式(x,y)並在實際數據表中調用座標以用作x,y座標:randomForest(Data [,-1],Data [,1] ,接近度= T) –