lmtree可疑行为与因素

时间:2018-06-26 13:16:01

标签: r partitioning party

当我将其与factor一起使用时,我注意到partykit包中lmtree函数的行为异常。如果数据集中未包含某些级别(此处为“ c”和“ e”),则预测会随机变化...

我想这意味着lmtree仅使用数据集中存在的因素(在此示例中为“ a”和“ b”)构建模型,而预测函数会考虑所有因素(“ a”,“ b”,“ c“,” e“)。

那么我如何在lmtree模型中安全使用因子?

library(partykit)

df<-data.frame(x=runif(100),y=runif(100),v=sample(c("a","b"),100,replace=T))
df$z<-with(df,ifelse(v=="a",2*y+x,3*x-y))
df$v<-factor(df$v,levels=c("c","e","a","b"))

lmt<-lmtree(z~x+y|v,df)

for (i in 1:10) print(predict(lmt,df,type="node")[1])

如果在lmtree函数和预测函数之间因子的顺序颠倒(从level = c(“ a”,“ b”)变为level = c(“ b”,“ a”),则会发生类似的问题)

1 个答案:

答案 0 :(得分:2)

感谢提出这个问题,它是Tuple<int, int>中的一个错误(最新版本为1.2-2)。

问题的根源如下:partykitlmtree()formula并从中建立data,设置model.frame。因此,对于drop.unused.levels = TRUE,仅保留级别v"a",而"b""c"被丢弃。但是,在"e"中进行了 not 的相同操作,其中调用predict.party时未指定model.frame,因此使用默认的drop.unused.levels。然后,因子水平之间不匹配,从而导致随机分配。

我将与Torsten协调固定版本!在其他地方似乎也潜伏着同样的问题,因此我们首先需要做更多检查。

与此同时,避免这种情况的最佳方法是在调用FALSE(或lmtree中其他似乎存在相同问题的函数)之前删除未使用的级别。