在 r 中引用 rpart 终端节点

referencing rpart terminal nodes in r

我是 R(和 rpart)的新手。我有车辆模型数据(~400 种模型)。我正在使用 rpart 将这些分组为具有相似车辆维修成本的较小数量(比如 5-10 组)。我已成功 运行 rpart 并拥有这些分组。

fit <- rpart(repairs ~ model, data=data, method='anova', control=rpart.control(minsplit=2,minbucket=1,cp=.0005))    

假设每个终端节点里面大约有40-80个模型。我有没有办法创建一个引用终端节点中的值的公式。假设 data$model 包含所有模型名称(并且是我正在尝试做的自变量:

data$modelgroup <- data$model
data$modelgroup[data$modelgroup %in% terminal node 1] <- 'Group1'
data$modelgroup[data$modelgroup %in% terminal node 2] <- 'Group2'
and so on for the rest of the groups

此外,如果有一种方法可以做到这一点而不必为每个组编写一行代码,那就太好了。

我知道我可以打印树并从终端节点手动复制文本并以这种方式完成,但效率很低。

在此先感谢您的帮助!

根据下面的要求,我在下面添加了一个可重现的示例。

data <- read.csv("rpart_example.csv")
data

data[,1:2]

   Model Amount
1      a      1
2      a      1
3      a      1
4      b      1
5      b      1
6      b      1
7      c      2
8      c      2
9      c      2
10     d      2
11     d      2
12     d      2
13     e      3
14     e      3
15     e      3
16     f      4
17     f      4
18     f      4

fit <- rpart(Amount ~ Model, data=data, method='anova', 
          control=rpart.control(minsplit=2,minbucket=1,cp=.0005))
print(fit)

n= 18 

node), split, n, deviance, yval
* denotes terminal node

1) root 18 20.5 2.166667  
2) Model=a,b,c,d 12  3.0 1.500000  
4) Model=a,b 6  0.0 1.000000 *
  5) Model=c,d 6  0.0 2.000000 *
  3) Model=e,f 6  1.5 3.500000  
6) Model=e 3  0.0 3.000000 *
  7) Model=f 3  0.0 4.000000 *

# create a variable modelgroup that groups models per terminal nodes from rpart     

# I can do this manually as below
# is there a way for me to automate this assignment?

data$modelgroup <- as.character(data$Model)

# per rpart output, a&b are grouped into one terminal node
data$modelgroup[data$modelgroup %in% c('a','b')] <- 'Group1'    

# per rpart output, c&d are grouped into the second terminal node
data$modelgroup[data$modelgroup %in% c('c','d')] <- 'Group2'

# per rpart, e is the third terminal node
data$modelgroup[data$modelgroup == 'e'] <- 'Group3'

# per rpart, f is the fourth terminal node
data$modelgroup[data$modelgroup == 'f'] <- 'Group4'

rpart 对象中,您要查找的信息基本上很容易存储在 $where 元素中。它为您提供每个观察值分配给的节点编号:

table(fit$where, data$modelgroup)
##     Group1 Group2 Group3 Group4
##   3      6      0      0      0
##   4      0      6      0      0
##   6      0      0      3      0
##   7      0      0      0      3

当然,您也可以将节点 ID(3、4、6、7)切换为因子或字符变量,例如 factor(fit$where, levels = c(3, 4, 6, 7), labels = paste0("Group", 1:4)) 或类似的东西。

如果您想使用简单统一的界面对新数据执行此操作,您可以将 rpart 对象转换为包 partykit:[=23 中的 party 对象=]

library("partykit")
fit2 <- as.party(fit)

print(fit2)plot(fit2) 的统一方法以及 predict(fit2, ...) 不同类型的方法可用:

table(predict(fit2, newdata = data, type = "node"), data$modelgroup)
##     Group1 Group2 Group3 Group4
##   3      6      0      0      0
##   4      0      6      0      0
##   6      0      0      3      0
##   7      0      0      0      3

这个 returns 与上面的结果相同,但也可以很容易地应用于其他 newdata