代码之家  ›  专栏  ›  技术社区  ›  MassCorr

树可疑行为与因素

  •  1
  • MassCorr  · 技术社区  · 6 年前

    当我将lmtree函数与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”),则会出现类似的问题。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Achim Zeileis    6 年前

    谢谢你提出这个问题,这是一个错误 partykit (最新版本1.2-2)。

    问题的根源如下: lmtree() 接受 formula data 并建立一个 model.frame 从这些,设置 drop.unused.levels = TRUE .因此,对于 v 仅级别 "a" "b" 保留和 "c" "e" 下降。然而,同样的情况是 在中完成 predict.party 在哪里? 模型框架 在未指定的情况下调用 drop.unused.levels 因此使用默认值 FALSE .然后因子水平之间存在不匹配,导致随机分配。

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

    同时,避免这种情况的最好方法是在调用之前降低未使用的级别。 lmtree (或其他功能 第六部分 似乎也有同样的问题)。