0

假设我适合这样的模型:

ctree(Age ~ Kyphosis, data = kyphosis, mincriterion = 1)

我怎么能得到拆分的数量?我怎样才能知道它是否只是一个根节点?

编辑:

使用的包:

library(caret)
library(party)
library(partykit)
library(plyr)
library(xtable)

当我尝试使用tree.size下面的答案中列出的错误时:

> tree.size(ctree(Age ~ Kyphosis, data = kyphosis, mincriterion = 1)@tree)
Error in tree.size(ctree(Age ~ Kyphosis, data = kyphosis, mincriterion = 1)@tree) : 
  trying to get slot "tree" from an object (class "constparty") that is not an S4 object 
4

2 回答 2

2

这个问题的其他答案/讨论没有任何问题,我只是想添加更多细节/上下文,以防其他用户遇到相同或类似的问题。

虽然新旧包中ctree()功能的许多方面保持不变,以便于转换,但几乎所有的 R 和 C 代码都被重写和简化,内部表示是全新的。旧的返回了一个 S4 对象,它对于我们想要用它做的所有事情都不够灵活。新函数返回从通用类继承的类对象(用于在每个节点中具有常量拟合的递归分区)。partypartykitctree()ctree()"constparty""party"

可以用length()方法查询节点数,用方法查询终端节点数width()。该print()方法还报告了节点的数量。最后,可以通过 查询节点 ID nodeids()。对于只有一个根节点的树:

data("kyphosis", package = "rpart")
library("partykit")

ct1 <- ctree(Age ~ ., data = kyphosis)
length(ct1)

[1] 1

width(ct1)

[1] 1

对于更大的树:

(ct2 <- ctree(Number ~ ., data = kyphosis))

Model formula:
Number ~ Kyphosis + Age + Start

Fitted party:
[1] root
|   [2] Start <= 15: 4.475 (n = 59, err = 152.7)
|   [3] Start > 15: 2.909 (n = 22, err = 17.8)

Number of inner nodes:    1
Number of terminal nodes: 2

length(ct2)

[1] 3

width(ct2)

[1] 2

nodeids(ct2)

[1] 1 2 3

nodeids(ct2, terminal = TRUE)

[1] 2 3

包小插曲还提供了许多其他有用的细节。vignette("partykit", package = "partykit")对包及其类进行了一般介绍;vignette("constparty", package = "partykit")描述具有恒定拟合的树的类;并vignette("ctree", package = "partykit")提供有关ctree().

于 2015-03-30T13:27:48.777 回答
2

从派对包文档中,tree拟合模型中的插槽是树的递归表示。您可以构建自己的递归函数来确定树的大小:

tree.size <- function(tree) {
  if (is.null(tree)) {
    return(0)
  } else {
    return(1 + tree.size(tree$left) + tree.size(tree$right))
  }
}

我们可以使用仅包含根节点的树和具有多个节点的树来测试函数:

library(rpart)  # for kyphosis
library(party)  # for ctree
mod1 <- ctree(Age ~ Kyphosis, data = kyphosis)
tree.size(mod1@tree)
# [1] 1
mod2 <- ctree(Petal.Width~., data=iris)
tree.size(mod2@tree)
# [1] 11

更新:根据更新的问题,看来 OP 实际上是在使用partykit:::ctree函数而不是party:::ctree函数。事实证明,这很容易获得树的大小,因为返回的模型是节点列表,所以只需要length函数。

library(partykit)
mod1 <- partykit:::ctree(Age ~ Kyphosis, data = kyphosis)
length(mod1)
# [1] 1
mod2 <- partykit:::ctree(Petal.Width~., data=iris)
length(mod2)
# [1] 11
于 2015-03-30T02:07:45.487 回答