当我将其与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”),则会发生类似的问题)
答案 0 :(得分:2)
感谢提出这个问题,它是Tuple<int, int>
中的一个错误(最新版本为1.2-2)。
问题的根源如下:partykit
取lmtree()
和formula
并从中建立data
,设置model.frame
。因此,对于drop.unused.levels = TRUE
,仅保留级别v
和"a"
,而"b"
和"c"
被丢弃。但是,在"e"
中进行了 not 的相同操作,其中调用predict.party
时未指定model.frame
,因此使用默认的drop.unused.levels
。然后,因子水平之间不匹配,从而导致随机分配。
我将与Torsten协调固定版本!在其他地方似乎也潜伏着同样的问题,因此我们首先需要做更多检查。
与此同时,避免这种情况的最佳方法是在调用FALSE
(或lmtree
中其他似乎存在相同问题的函数)之前删除未使用的级别。