0

使用 rpart 创建我的 CART 后,我继续使用 partykit 包中的 as.party 函数将其转换为派对对象。随后出现错误:

as.party(tree.hunterpb1)

Error in partysplit(varid = which(rownames(obj$split)[j] == names(mf)),  : 
‘index’ has less than two elements

我只能假设它指的是我从文献中理解的因子变量所做的分区,因为索引适用于因子。我的树看起来像这样:

树.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 函数没有找到索引。任何有关如何解决此问题的建议将不胜感激。

4

1 回答 1

0

问题可能是由以下情况引起的。(感谢 Yan Tabachek 通过电子邮件向我发送了一个类似的示例。)如果传递给的分区变量之一rpart()character变量,则将其作为一个因素进行处理,rpart()但不是通过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)。

于 2015-04-01T12:25:09.293 回答