2016-04-21 120 views
0

我對派對包中的varimp()函數的行爲感到困惑。varimp(R方)僅返回零

我使用條件隨機森林來獲得變量的重要性後Strobl等人。 2009年的建議。

它適用於我所有的數據集,但只有一個。我必須將我的觀察歸納爲這一個。 但是,即使條件隨機森林正常運行在整個數據集上,它只會返回該子集的零......並且似乎根本不運行,但不會生成錯誤。

我想知道預測變量的數量是否太多,只有很少的觀測值,並且只用有限數量的預測變量來嘗試,但它給了我相同的結果。 這似乎也不是鏈接,因爲它是在其他情況下指出變量的類型......

我顯然失去了一些東西,但我不能找出...

如果有人有對我應該看到的方向有所瞭解,我會非常感激。我的數據here

VarforCRF <- read.csv("Data.csv",sep=";",dec=",",row.names=1) 
library(party) 
set.seed(round(runif(1,0,1)*10000)) 

# Run just fine with the entire dataset 
cRF <- cforest(Syrph_pred~.,data = VarforCRF, control = cforest_unbiased(ntree=100)) 
varimp(object = cRF,conditional = T) 


CRF_West <- subset(VarforCRF,Sector == "West") 

# Does not seem to run at all with subset and return zeros 
cRF_W <- cforest(Syrph_pred~.,data = CRF_West, control = cforest_unbiased(ntree=100)) 
varimp(object = cRF_W,conditional = T) 
+0

您的數據以奇怪的格式下載。你是否將它保存爲分號分隔符,因爲這不是一種存儲數據的好方法。 – Jason

+0

是的。對不起,法文版Excel保存帶分號的.csv默認爲 –

+0

由於Excel在不同的系統上表現不同,R提供了'read.csv()'(原始的逗號分隔格式)和'read.csv2()' (以分號分隔的格式)。在你的情況下,只需使用:'read.csv2(「Data.csv」,row.names = 1)'。 –

回答

0

你的子樣品CRF_West太小,不能在森林的樹木中產生任何分裂。這些數據有23個觀察值,每個樹的引導樣本約爲2/3。然而,分裂節點的最小尺寸是20個觀測值,最小節點尺寸爲7個觀測值,見?ctree_control

要強制樹木/森林分割,可以使用較小的值,例如,

cRF_W <- cforest(Syrph_pred~.,data = CRF_West, 
    control = cforest_unbiased(ntree=100, minsplit = 15, minbucket = 5)) 

對於這個森林,您將獲得非零變量重要性。不管這樣做是否會導致這樣一個小樣本特別好或可靠的結果是一個不同的問題。

最後的評論:試圖通過設置一個種子來重現計算是非常有用的。然而,對隨機種子使用(不可重複的)隨機數會破壞整個事物...

+0

非常感謝!我發現樣本量太小,但我無法理解爲什麼。我正試圖找到另一種方式來處理這些數據,而不需要進行修改。事情是,Syrph_pred有一個對應部門(西部和東部)的雙峯重新分區... 至於種子,我知道。我隨機設置種子只是爲了測試不同的種子是否會導致不同的結果。老師建議我這樣做一次...... –