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

R从ctree(partykit)中提取内部节点信息和拆分,r,function,plot,party,R,Function,Plot,Party,您好,我目前正在尝试使用partykit中的ctree提取R中常数partying对象中存储的一些内部节点信息,但我发现导航对象有点困难,我能够在绘图上显示信息,但我不确定如何提取信息-我认为它需要nodeapply或partykit中的其他函数 library(partykit) irisct <- ctree(Species ~ .,data = iris) plot(irisct, inner_panel = node_barplot(irisct)) 库(partykit) ir

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

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

irisct您需要的大部分信息都可以访问,无需做很多工作。 我将演示如何获取信息,但请您自行设置格式 把信息放进一张漂亮的桌子里

请注意,您的树结构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
节点上的第一列数据是类(物种), 所以你可以得到每个类的计数和每个类的概率 在一个节点上

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
主要技巧(正如@G5W之前所指出的)是获取
参与方
对象的
[id]
子集,然后(通过
$data
或使用
数据方()
函数)提取包含响应的数据。我建议先用绝对频率建立一个表,然后从中计算相对频率和边际频率。使用
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
然后使用
prop.table()
margin.table()
计算我们感兴趣的频率。
as.data.frame()
方法将
布局转换为“long”
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
并且可以使用(仍然未报告)
.list.rules.party()
函数获取分割信息。您只需要请求所有节点ID(默认情况下仅使用终端节点ID):

partykit::.list.rules.party(irisct,i=nodeids(irisct))
##                                                               1 
##                                                              "" 
##                                                               2 
##“花瓣长度1.9”
##                                                               4 
##“花瓣长>1.9,花瓣宽1.9,花瓣宽1.9,花瓣宽>1.7”

太棒了,谢谢!如何用$data引用树中的一个节点似乎是我正在寻找的很多东西,非常感谢!我想知道如何使用list.rules列出所有节点,我将检查data_party函数,因为我认为它也会派上用场。
colnames(tab) <- 1:length(irisct)
tab <- as.table(tab)
names(dimnames(tab)) <- c("Species", "Node")
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
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"