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

在as.party函数中,如何澄清不同节点的索引?,r,rpart,party,R,Rpart,Party,使用rpart创建购物车后,我继续从partykit包将其转换为具有as.party函数的party对象。出现子提示错误: as.partytree.hunterpb1 我只能假设它是指我从文献中了解到的由因子变量进行的划分,因为索引适用于因子。我的树看起来像这样: 树。猎人B1 n=354 回溯显示第一个分区到party类的转换是正确的,但是基于因子变量的第二个分区失败并产生了上述错误 以前在处理类似数据时,未出现此错误。我只能假设as.party函数没有找到索引。如果您有任何关于如何解决此问

使用rpart创建购物车后,我继续从partykit包将其转换为具有as.party函数的party对象。出现子提示错误:

as.partytree.hunterpb1

我只能假设它是指我从文献中了解到的由因子变量进行的划分,因为索引适用于因子。我的树看起来像这样:

树。猎人B1 n=354

回溯显示第一个分区到party类的转换是正确的,但是基于因子变量的第二个分区失败并产生了上述错误


以前在处理类似数据时,未出现此错误。我只能假设as.party函数没有找到索引。如果您有任何关于如何解决此问题的建议,我们将不胜感激。

问题可能是由以下情况引起的。感谢Yan Tabachek给我发了一封类似的邮件。如果传递给rpart的分区变量之一是字符变量,则它将被当作rpart的因子处理,而不是通过as.party中的转换处理。作为一个简单的例子,考虑这个小数据集:

d <- data.frame(y = c(1:10, 101:110))
d$x <- rep(c("a", "b"), each = 10)
但是,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)中,该版本的发布日期尚未确定。

如果问题仍然存在,请发布一个小的可复制示例。然后我会看看问题出在哪里。包含此修复程序的partykit版本1.0-1现在已在CRAN上。更新了我的库并再次将所有字符转换为因子,并且似乎可以正常工作
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 *
library("partykit")
as.party(rp)

## Error in partysplit(varid = which(rownames(obj$split)[j] == names(mf)),  : 
##   'index' has less than two elements
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