Memperoleh jalur lengkap dari daun ke akar untuk setiap node terminal dengan ctree dari partykit

Aug 21 2020

Saat ini saya bekerja dengan ctree dari paket R "partykit" dan saya bertanya-tanya apakah ada cara untuk mendapatkan jalur lengkap dari node terminal ke root. Saya ingin memiliki jalur lengkap untuk setiap daun ke root yang dinyatakan sebagai vektor yang berisi id node.

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

Merencanakan pohon

Ini pada dasarnya yang saya butuhkan:

[[1]]
[1] 2 1

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

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

[[4]]
[1] 7 3 1

Saya sangat menghargai bantuan apa pun! Terima kasih!

Jawaban

AchimZeileis Aug 23 2020 at 06:48

Fungsi berikut harus melakukan triknya. Baris pertama mengekstrak daftar anak per node dan dari sini Anda dapat menelusuri semua node secara rekursif.

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)
}

Ini kemudian dapat diterapkan ke partyobjek apa pun :

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