varimp(R 方)return 只有零

varimp (R party) return only zeros

我对派对包中 varimp() 函数的行为感到困惑。

在 Strobl 等人之后,我正在使用条件随机森林来获得可变的重要性。 2009 年推荐。

它适用于我所有的数据集,但只有一个。对于这个,我必须对我的观察进行子集化。 但是,即使条件随机森林 运行 在整个数据集上正常,它 returns 只为子集归零......而且似乎根本没有 运行 但没有错误生成。

我想知道预测变量的数量是否对少数观察结果来说太多了,我尝试只使用有限数量的预测变量,但它给了我相同的结果。 正如在其他情况下指出的那样,它似乎也不是 link 变量类型...

我显然遗漏了一些东西,但我就是想不通是什么...

如果有人知道我应该看的方向,我将不胜感激。

我的数据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)

您的子样本 CRF_West 太小,无法在森林的树木中产生任何分裂。该数据有 23 个观察值,从中为每棵树抽取了约 2/3 的 bootstrap 个样本。但是,用于拆分的节点的最小大小为 20 个观察值,最小节点大小为 7 个观察值,请参阅 ?ctree_control

要强制 trees/forest 拆分,您可以使用较小的值,例如

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

对于这个森林,您将获得非零变量重要性。不过,这是否会在如此小的样本上产生特别的 good/reliable 结果是另一个问题。

最后的评论:尝试通过设置种子来使计算可重现是好的,而且非常有用。然而,使用(不可重现的)随机数作为随机种子破坏了整个事情...