如何将标签添加到ctree(包方)的终端节点?

时间:2012-04-23 14:56:32

标签: r decision-tree party

我使用ctree创建了一个二元分类树。我希望每个终端节点包含与该节点关联的行名称。我怎么能做到这一点?

例如,对于下面的数据集,我希望最左边的节点列出所有年龄<23岁(Abner到Abudemio)和最右边的Abundiantus到Acelin的人的姓名。

      names       age height young   
1     Abner       18   76.1   yes
2     Abraham     19   77.0   yes
3     Abram       20   78.1   yes
4     Abrasha     21   78.2   yes
5     Absalom     22   78.8   yes
6     Abudemio    23   79.7   yes
7     Abundiantus 24   79.9    no
8     Acacio      25   81.1    no
9     Acario      26   81.2    no
10    Accursius   27   81.8    no
11    Ace         28   82.8    no
12    Acelin      29   83.5    no

enter image description here

1 个答案:

答案 0 :(得分:5)

这是一个hacky解决方案。它只涉及party包中绘图函数的原始源代码中的很少修改。通过阅读源代码,我注意到有一个terminal_panel在结果是一个因素的情况下调用node_barplot。 (如果您安装了源包,则所有内容都位于R/plot.R函数中。)我们可以修改后者以在默认条形图中显示自定义标签。

只需在R提示符下发出以下命令:

fixInNamespace("node_barplot", pos="package:party")

然后,开始添加我们想要的内容:

  1. labels = NULL, gp = NULL添加到该函数的现有参数列表中。
  2. 在函数体末尾附近grid.rect(gp = gpar(fill = "transparent"))之后,添加以下行:

    if (!is.null(labels)) {
      labs <- as.character(labels[ctreeobj@where==node$nodeID])
      len <- length(labs)
      x <- unit(rep(0.5, len), "npc")
      y <- unit(0.5:len/len, "npc")
      for (i in 1:len) 
        grid.text(labs[i], x=x[i], y=y[i], just="center", gp=gp)
    }
    

    这里,关键的想法是选择与所选节点(node$nodeID)对应的标签,我们可以从where对象的插槽ctree中获取此信息(这是一个向量,指示每个案例在哪个节点结束)。 if测试只是为了确保我们可以使用最初编写的函数。 gp参数可用于更改字体大小或颜色。

  3. 对该功能的典型调用现在是:

    plot(cfit, tp_pars=list(labels=dfrm$names))
    

    其中dfrm$names是来自名为dfrm的数据框的标签列。以下是您的数据说明:

    cfit <- ctree(young ~ age, data=a, 
                  controls=ctree_control(minsplit=2, minbucket=2))
    plot(cfit, tp_args=list(labels=a$names, gp=gpar(fontsize=8, col="darkgrey")))
    

    enter image description here

    (我还使用iris数据集的在线示例对此进行了测试。)