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()
使用 formula
和 data
并从中构建一个 model.frame
,设置 drop.unused.levels = TRUE
.因此,对于 v
,仅保留级别 "a"
和 "b"
,而删除 "c"
和 "e"
。但是,在 predict.party
中 not 也是如此,其中调用 model.frame
时未指定 drop.unused.levels
,因此使用默认值 FALSE
。然后因素水平之间存在不匹配,导致随机分配。
我会和Torsten协调一个固定的版本!同样的问题似乎潜伏在其他地方所以我们需要先做更多的检查。
同时,避免这种情况的最佳方法是在调用 lmtree
(或 partykit
中似乎有相同问题的其他函数)之前删除未使用的级别。
当我将 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()
使用 formula
和 data
并从中构建一个 model.frame
,设置 drop.unused.levels = TRUE
.因此,对于 v
,仅保留级别 "a"
和 "b"
,而删除 "c"
和 "e"
。但是,在 predict.party
中 not 也是如此,其中调用 model.frame
时未指定 drop.unused.levels
,因此使用默认值 FALSE
。然后因素水平之间存在不匹配,导致随机分配。
我会和Torsten协调一个固定的版本!同样的问题似乎潜伏在其他地方所以我们需要先做更多的检查。
同时,避免这种情况的最佳方法是在调用 lmtree
(或 partykit
中似乎有相同问题的其他函数)之前删除未使用的级别。