2016-04-21 119 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有一个对应部门(西部和东部)的双峰重新分区... 至于种子,我知道。我随机设置种子只是为了测试不同的种子是否会导致不同的结果。老师建议我这样做一次...... –