partykit에서 ctree를 사용하여 각 터미널 노드에 대해 리프에서 루트로의 전체 경로 얻기

Aug 21 2020

현재 R 패키지 "partykit"에서 ctree로 작업하고 있으며 터미널 노드에서 루트로의 전체 경로를 얻는 방법이 있는지 궁금합니다. 각 리프에 대해 노드 ID를 포함하는 벡터로 표현 된 루트에 대한 전체 경로를 갖고 싶습니다.

library(partykit)
ct <- ctree(Species ~ ., data = iris) 
Model formula:
Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width

Fitted party:
[1] root
|   [2] Petal.Length <= 1.9: setosa (n = 50, err = 0.0%)
|   [3] Petal.Length > 1.9
|   |   [4] Petal.Width <= 1.7
|   |   |   [5] Petal.Length <= 4.8: versicolor (n = 46, err = 2.2%)
|   |   |   [6] Petal.Length > 4.8: versicolor (n = 8, err = 50.0%)
|   |   [7] Petal.Width > 1.7: virginica (n = 46, err = 2.2%)

Number of inner nodes:    3
Number of terminal nodes: 4

나무 그리기

이것은 기본적으로 내가 필요한 것입니다.

[[1]]
[1] 2 1

[[2]]
[1] 5 4 3 1

[[3]]
[1] 6 4 3 1

[[4]]
[1] 7 3 1

도움을 주시면 감사하겠습니다! 감사!

답변

AchimZeileis Aug 23 2020 at 06:48

다음 함수가 트릭을 수행해야합니다. 첫 번째 줄은 노드 당 자식 목록을 추출하고 여기에서 모든 노드를 재귀 적으로 이동할 수 있습니다.

get_path <- function(object) {
  ## list of kids per node (NULL if terminal)
  kids <- lapply(as.list(object$node), "[[", "kids")

  ## recursively add node IDs of children
  add_ids <- function(x) {
    ki <- kids[[x[1L]]]
    if(is.null(ki)) {
      return(list(x))
    } else {
      x <- lapply(ki, "c", x)
      return(do.call("c", lapply(x, add_ids)))
    }
  }
  add_ids(1L)
}

그런 다음 모든 party개체에 적용 할 수 있습니다 .

get_path(ct)
## [[1]]
## [1] 2 1
## 
## [[2]]
## [1] 5 4 3 1
## 
## [[3]]
## [1] 6 4 3 1
## 
## [[4]]
## [1] 7 3 1