lmtree 怀疑行为与因素

lmtree suspect behavior with factors

当我将 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函数和predict函数之间颠倒因子的顺序(从levels=c("a","b")到levels=c("b","a"))

感谢您提出这个问题,这是 partykit 中的一个错误(直到当前版本 1.2-2)。

问题的根源如下:lmtree() 使用 formuladata 并从中构建一个 model.frame,设置 drop.unused.levels = TRUE .因此,对于 v,仅保留级别 "a""b",而删除 "c""e"。但是,在 predict.partynot 也是如此,其中调用 model.frame 时未指定 drop.unused.levels,因此使用默认值 FALSE。然后因素水平之间存在不匹配,导致随机分配。

我会和Torsten协调一个固定的版本!同样的问题似乎潜伏在其他地方所以我们需要先做更多的检查。

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