使用ctree {partykit}的R多路分裂树

时间:2015-12-17 20:12:31

标签: r decision-tree

我想使用来自partykit的ctree函数使用条件推理树分析我的数据。我特意选择了这个功能,因为 - 如果我理解正确的话 - 它是唯一允许多路分裂的人之一。我需要这个选项,因为我的所有变量都是多级(无序)分类变量。

但是,尝试使用ctree_control启用多向分割会出现以下错误:

aufprallentree <- ctree(case ~., data = aufprallen,
  control = ctree_control(minsplit = 10, minbucket = 5, multiway = TRUE))
## Error in 1:levels(x) : NA/NaN argument
## In addition: Warning messages:
## 1: In 1:levels(x) :
##   numerical expression has 4 elements: only the first used
## 2: In partysplit(as.integer(isel), index = 1:levels(x)) :
##   NAs introduced by coercion

任何人都知道如何解决这个问题?或者,如果我错了,ctree不允许多路分割?

为清楚起见,我的数据概述:(没有NAs)

str(aufprallen)
## 'data.frame':    299 obs. of  10 variables:
##  $ prep          : Factor w/ 6 levels "an","auf","hinter",..: 2 2 2 2 2 2 1 2 2 2 ...
##  $ prep_main     : Factor w/ 2 levels "auf","other": 1 1 1 1 1 1 2 1 1 1 ...
##  $ case          : Factor w/ 2 levels "acc","dat": 1 1 2 1 1 1 2 1 1 1 ...
##  $ sense         : Factor w/ 3 levels "crashdown","crashinto",..: 2 2 1 3 2 2 1 2 1 2 ...
##  $ PO_type       : Factor w/ 4 levels "object","region",..: 4 4 3 1 4 4 3 4 3 4 ...
##  $ PO_type2      : Factor w/ 3 levels "object","region",..: 1 1 3 1 1 1 3 1 3 1 ...
##  $ perfectivity  : Factor w/ 2 levels "imperfective",..: 1 1 2 2 1 1 1 1 1 1 ...
##  $ mit_Körperteil: Factor w/ 2 levels "n","y": 1 1 1 1 1 1 1 1 1 1 ...
##  $ PP_place      : Factor w/ 4 levels "back","front",..: 4 1 1 1 1 1 1 1 1 1 ...
##  $ PP_place_main : Factor w/ 3 levels "marked","rel",..: 2 3 3 3 3 3 3 3 3 3 ...

提前致谢!

1 个答案:

答案 0 :(得分:1)

几句话:

  • 1:levels(x)的错误是ctree中的错误。代码应该是1:nlevels(x)。我刚刚在R-Forge上修复了这个问题 - 所以如果你想使用选项,你可以从那里检查SVN并手动安装包。 (如果您需要更多详细信息,请与我联系。)Torsten可能会在接下来的几周内发布新的CRAN。

  • 另一个可以通过多路分割学习二进制分类树的函数是glmtree包中的partykit。代码为glmtree(case ~ ., data = aufprallen, family = binomial, catsplit = "multiway", minsize = 5)。它使用参数不稳定性测试而不是条件推断来进行关联,以确定分裂变量并采用形式似然。但在许多情况下,结果与ctree非常相似。

  • 在两种算法中,多路分割都是非常基本的:如果选择分类变量进行分割,则根本不进行分割选择。相反,所有类别都会获得自己的子节点。有些算法尝试使用数据驱动的子节点数(在2和类别数之间)确定最佳类别分组。

  • 即使您有超过两个级别的分类预测变量,也不会需要多路分割。许多算法只使用二进制分割,因为任何多路分割都可以用一系列二进制分裂来表示。然而,在许多数据集中,事实证明,不分离所有而只分离分裂因子中的一些类别是有益的。

总的来说,我的建议是从标准条件推理树开始,仅使用二进制拆分。只有当事实证明这导致了同一因素中的许多二进制分裂时,我才会继续探索多路分裂。