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

Dam*_*com 2 plot r function party

嗨我正在尝试使用partykit中的ctree来提取存储在R中的常量派对对象中的一些内部节点信息,但我发现导航对象有点困难,我能够在绘图上显示信息但是我不确定如何提取信息 - 我认为它需要nodeapply或partykit中的其他功能?

library(partykit)
irisct <- ctree(Species ~ .,data = iris)
plot(irisct, inner_panel = node_barplot(irisct))
Run Code Online (Sandbox Code Playgroud)

绘制内部节点详细信息

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

Ach*_*eis 6

主要技巧(如之前由@ G5W指出的)是获取对象的[id]子集,party然后提取包含响应的数据(通过任一$data或使用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
Run Code Online (Sandbox Code Playgroud)

然后我们可以为一个漂亮的table对象添加一些格式:

colnames(tab) <- 1:length(irisct)
tab <- as.table(tab)
names(dimnames(tab)) <- c("Species", "Node")
Run Code Online (Sandbox Code Playgroud)

然后使用prop.table()margin.table()计算我们感兴趣的频率.as.data.frame()方法从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
Run Code Online (Sandbox Code Playgroud)

并且可以使用(仍然未导出的).list.rules.party()功能获得分割信息.您只需要询问所有节点ID(默认情况下只使用终端节点ID):

partykit:::.list.rules.party(irisct, i = nodeids(irisct))
##                                                               1 
##                                                              "" 
##                                                               2 
##                                           "Petal.Length <= 1.9" 
##                                                               3 
##                                            "Petal.Length > 1.9" 
##                                                               4 
##                       "Petal.Length > 1.9 & Petal.Width <= 1.7" 
##                                                               5 
## "Petal.Length > 1.9 & Petal.Width <= 1.7 & Petal.Length <= 4.8" 
##                                                               6 
##  "Petal.Length > 1.9 & Petal.Width <= 1.7 & Petal.Length > 4.8" 
##                                                               7 
##                        "Petal.Length > 1.9 & Petal.Width > 1.7" 
Run Code Online (Sandbox Code Playgroud)