Noa*_*men 3 r party decision-tree
我使用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
Run Code Online (Sandbox Code Playgroud)
.
这是一个hacky解决方案.它只涉及对party包中绘图函数的原始源代码进行很少的修改.通过阅读源代码,我注意到有一个terminal_panel调用node_barplot,以防结果是一个因素.(R/plot.R如果您安装了源包,则所有内容都位于该函数中.)我们可以修改后者以在默认条形图中显示自定义标签.
只需在R提示符下发出以下命令:
fixInNamespace("node_barplot", pos="package:party")
Run Code Online (Sandbox Code Playgroud)
然后,开始添加我们想要的东西:
labels = NULL, gp = NULL到该函数的现有参数列表.在函数体的末尾附近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)
}
Run Code Online (Sandbox Code Playgroud)
这里,密钥思想是选择对应于所选择的节点(标签node$nodeID),并且我们可以抓住从槽此信息where的的ctree对象(在此是指示载体,其中节点每种情况下结束了).该if测试只是为了确保我们能够使用的功能最初写的.该gp参数可用于更改字体大小或颜色.
对函数的典型调用现在是:
plot(cfit, tp_pars=list(labels=dfrm$names))
Run Code Online (Sandbox Code Playgroud)
where 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")))
Run Code Online (Sandbox Code Playgroud)

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