我有描述树的 if/then 语句。例如:
node1: if VAR1 < X node = 2 else node = 3
node2: if VAR2 < Y node = 4 else node = 5
node3: terminal value = Z
...
不等式总是表示为小于“<”。这些规则不一定按照树深度的顺序。
忽略解析语句的工作,在 R 中构建/可视化树的最简单方法是什么?是否有一个对象/函数/包我可以根据规则调用一次以迭代地构建树然后调用 plot()?
我有描述树的 if/then 语句。例如:
node1: if VAR1 < X node = 2 else node = 3
node2: if VAR2 < Y node = 4 else node = 5
node3: terminal value = Z
...
不等式总是表示为小于“<”。这些规则不一定按照树深度的顺序。
忽略解析语句的工作,在 R 中构建/可视化树的最简单方法是什么?是否有一个对象/函数/包我可以根据规则调用一次以迭代地构建树然后调用 plot()?
扩展我之前给出的评论,这是派对包中示例plot.BinaryTree
的顶部:
set.seed(290875)
airq <- subset(airquality, !is.na(Ozone))
airct <- ctree(Ozone ~ ., data = airq)
### regression: boxplots in each node
plot(airct, terminal_panel = node_boxplot, drop_terminal = TRUE)
它会根据上面的ctree
命令生成下图:
该软件包有两个相当不错的小插曲,应该可以帮助您入门。
我尝试深入研究 pkg:party 方法的代码,但无法非常有效地遵循依赖关系。我认为查看 rpart 包代码可能更容易。(编辑:进一步的想法是查看 igraph 包。)
require(rpart)
fit <- rpart(Kyphosis ~ Age + Number + Start, data=kyphosis)
print(fit)
#------------
n= 81
node), split, n, loss, yval, (yprob)
* denotes terminal node
1) root 81 17 absent (0.79012346 0.20987654)
2) Start>=8.5 62 6 absent (0.90322581 0.09677419)
4) Start>=14.5 29 0 absent (1.00000000 0.00000000) *
5) Start< 14.5 33 6 absent (0.81818182 0.18181818)
10) Age< 55 12 0 absent (1.00000000 0.00000000) *
11) Age>=55 21 6 absent (0.71428571 0.28571429)
22) Age>=111 14 2 absent (0.85714286 0.14285714) *
23) Age< 111 7 3 present (0.42857143 0.57142857) *
3) Start< 8.5 19 8 present (0.42105263 0.57894737) *
#---code resumes ------
plot(fit)
rpart:::plot.rpart # will show the code ... depends on rpart::rpconvert
rpart::rpconvert
另一种选择是 data.tree 包。例如,您可以这样做:
tree <- Node$new("node1")
tree$AddChild("node2", edgeLabel = "VAR1 < X")
tree$AddChild("node3", edgeLabel = "VAR1 >= X")
print(tree, "edgeLabel")
这将显示为:
levelName edgeLabel
1 node1
2 ¦--node2 VAR1 < X
3 °--node3 VAR1 >= X
或绘图:
SetEdgeStyle(tree, label = function(node) node$edgeLabel)
plot(tree)
每个节点都可以存储任何信息,因此解析也很简单,因为您可以在解析时将树用作路由器。