使用rpart创建我的CART之后,我继续使用partykit包中的as.party函数将其转换为派对对象。出现subsecuent错误:
as.party(tree.hunterpb1)
Error in partysplit(varid = which(rownames(obj$split)[j] == names(mf)), :
‘index’ has less than two elements
我只能假设它正在引用因子变量所做的分区,正如我从文献中所理解的那样,因为该指数适用于因子。我的树看起来像这样:
tree.hunterpb1 n = 354
node), split, n, deviance, yval
* denotes terminal node
1) root 354 244402.100 75.45134
2) hr.11a14>=49.2125 19 3378.322 33.44274 *
3) hr.11a14< 49.2125 335 205592.400 77.83391
6) month=April,February,June,March,May 141 58656.390 68.57493 *
7) month=August,December,January,July,November,October,September 194 126062.800 84.56338
14) presion.11a14>=800.925 91 74199.080 81.32755
28) month=January,November,October 16 9747.934 63.13394 *
29) month=August,December,July,September 75 58025.190 85.20885 *
15) presion.11a14< 800.925 103 50069.100 87.42223 *
回溯显示第一个分区到派对类的转换是正确完成的,但第二个基于因子变量的转换失败并产生了所述错误。
以前在处理类似数据时,此错误尚未出现。我只能假设as.party函数没有找到indeces。任何有关如何解决这个问题的建议都将受到赞赏。
答案 0 :(得分:0)
可能这个问题是由以下情况引起的。 (感谢Yan Tabachek给我发了一个类似的例子。)如果传递给rpart()
的其中一个分区变量是一个character
变量,那么它就像rpart()
一样被处理。 {1}}但不是as.party()
中的转化。作为一个简单的例子,请考虑这个小数据集:
d <- data.frame(y = c(1:10, 101:110))
d$x <- rep(c("a", "b"), each = 10)
安装rpart()
树会将字符变量x
视为一个因素:
library("rpart")
(rp <- rpart(y ~ x, data = d))
## n= 20
##
## node), split, n, deviance, yval
## * denotes terminal node
##
## 1) root 20 50165.0 55.5
## 2) x=a 10 82.5 5.5 *
## 3) x=b 10 82.5 105.5 *
但是,as.party()
转换不起作用:
library("partykit")
as.party(rp)
## Error in partysplit(varid = which(rownames(obj$split)[j] == names(mf)), :
## 'index' has less than two elements
最好的解决方法是将x
转换为因子变量并重新拟合树。然后转换也顺利进行:
d$x <- factor(d$x)
rp <- rpart(y ~ x, data = d)
as.party(rp)
## Model formula:
## y ~ x
##
## Fitted party:
## [1] root
## | [2] x in a: 5.500 (n = 10, err = 82.5)
## | [3] x in b: 105.500 (n = 10, err = 82.5)
##
## Number of inner nodes: 1
## Number of terminal nodes: 2
我还在R-Forge的partykit
开发版中添加了一个修复程序,以避免问题。它将包含在下一个CRAN版本中(可能是1.0-1,尚未安排发布日期)。