在as.party函数中,我如何澄清哪些是不同节点的索引?

时间:2014-11-20 22:50:28

标签: r rpart party

使用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。任何有关如何解决这个问题的建议都将受到赞赏。

1 个答案:

答案 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,尚未安排发布日期)。