R从ctree(partykit)中提取内部节点信息和拆分

时间:2017-01-31 22:48:11

标签: r function plot party

您好我正在尝试使用partykit中的ctree提取存储在R中常量派对对象中的一些内部节点信息,但我发现导航对象有点困难,我能够显示有关的信息一个情节,但我不知道如何提取信息 - 我认为它需要nodeapply或partykit中的其他功能?

library(partykit)
irisct <- ctree(Species ~ .,data = iris)
plot(irisct, inner_panel = node_barplot(irisct))

Plot with inner node details

绘制的函数可以访问所有信息,但我的文本输出类似于: Example output

2 个答案:

答案 0 :(得分:5)

主要技巧(如前面指出的@ G5W)是获取[id]对象的party子集,然后提取数据(通过$data或使用{ {1}} function)包含响应。我建议首先建立一个绝对频率的表,然后从中计算相对和边际频率。使用data_party()对象可以通过

获得普通表
irisct

然后我们可以为一个漂亮的tab <- sapply(1:length(irisct), function(id) { y <- data_party(irisct[id]) y <- y[["(response)"]] table(y) }) tab ## [,1] [,2] [,3] [,4] [,5] [,6] [,7] ## setosa 50 50 0 0 0 0 0 ## versicolor 50 0 50 49 45 4 1 ## virginica 50 0 50 5 1 4 45 对象添加一些格式:

table

然后使用colnames(tab) <- 1:length(irisct) tab <- as.table(tab) names(dimnames(tab)) <- c("Species", "Node") prop.table()计算我们感兴趣的频率。margin.table()方法从as.data.frame()布局转换为&#34; long&# 34; table

data.frame

可以使用(仍然未导出的)as.data.frame(prop.table(tab, 1)) ## Species Node Freq ## 1 setosa 1 0.500000000 ## 2 versicolor 1 0.251256281 ## 3 virginica 1 0.322580645 ## 4 setosa 2 0.500000000 ## 5 versicolor 2 0.000000000 ## 6 virginica 2 0.000000000 ## 7 setosa 3 0.000000000 ## 8 versicolor 3 0.251256281 ## 9 virginica 3 0.322580645 ## 10 setosa 4 0.000000000 ## 11 versicolor 4 0.246231156 ## 12 virginica 4 0.032258065 ## 13 setosa 5 0.000000000 ## 14 versicolor 5 0.226130653 ## 15 virginica 5 0.006451613 ## 16 setosa 6 0.000000000 ## 17 versicolor 6 0.020100503 ## 18 virginica 6 0.025806452 ## 19 setosa 7 0.000000000 ## 20 versicolor 7 0.005025126 ## 21 virginica 7 0.290322581 as.data.frame(margin.table(tab, 2)) ## Node Freq ## 1 1 150 ## 2 2 50 ## 3 3 100 ## 4 4 54 ## 5 5 46 ## 6 6 8 ## 7 7 46 函数获取拆分信息。您只需要询问所有节点ID(默认情况下仅使用终端节点ID):

.list.rules.party()

答案 1 :(得分:2)

您需要的大部分信息都可以轻松访问。 我将展示如何获取信息,但让您格式化 把信息变成漂亮的桌子。

请注意,您的树结构irisct只是每个节点的列表。

length(irisct)
[1] 7

每个节点都有一个字段data,其中包含已降低的点 这一点在树中,所以你可以得到节点的观测数量 通过计算行数。

dim(irisct[4]$data)
[1] 54  5
nrow(irisct[4]$data)
[1] 54

或者一次完成所有这些以获得你的桌子2

NObs = sapply(1:7, function(n) { nrow(irisct[n]$data) })
NObs
[1] 150  50 100  54  46   8  46

节点上的第一列数据是类(Species), 这样你就可以得到每个班级的计数和每个班级的概率 在一个节点

table(irisct[4]$data[1])
setosa versicolor  virginica 
     0         49          5 
table(irisct[4]$data[1]) / NObs[4]
setosa versicolor  virginica 
0.00000000 0.90740741 0.09259259 

表3中的拆分信息有点尴尬。仍然, 您可以通过打印出来获得所需内容的文本版本 顶级节点

irisct[1]
Model formula:
Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width
Fitted party:
[1] root
|   [2] Petal.Length <= 1.9: setosa (n = 50, err = 0.0%)
|   [3] Petal.Length > 1.9
|   |   [4] Petal.Width <= 1.7
|   |   |   [5] Petal.Length <= 4.8: versicolor (n = 46, err = 2.2%)
|   |   |   [6] Petal.Length > 4.8: versicolor (n = 8, err = 50.0%)
|   |   [7] Petal.Width > 1.7: virginica (n = 46, err = 2.2%)
Number of inner nodes:    3
Number of terminal nodes: 4

保存输出以进行解析和显示

TreeSplits = capture.output(print(irisct[1]))