Я могу создать дерево с помощью Rpart, используя набор данных Kyphosis, который является частью базы R:
fit <- rpart(Kyphosis ~ Age + Number + Start,
method="class", data=kyphosis)
printcp(fit)
plot(fit, uniform=TRUE,main="Classification Tree for Kyphosis")
text(fit, use.n=TRUE, all=TRUE, cex=.8)
Вот как выглядит дерево:
Теперь, чтобы лучше представить дерево, я хочу использовать диаграмму Санки, используя график. Чтобы создать диаграмму Санки на графике, нужно сделать следующее:
library(plotly)
nodes=c("Start>=8.5","Start>-14.5","absent",
"Age<55","absent","Age>=111","absent","present","present")
p <- plot_ly(
type = "sankey",
orientation = "h",
node = list(
label = nodes,
pad = 10,
thickness = 20,
line = list(
color = "black",
width = 0.5
)
),
link = list(
source = c(0,1,1,3,3,5,5,0),
target = c(1,2,3,4,5,6,7,8),
value = c(1,1,1,1,1,1,1,1)
)
) %>%
layout(
title = "Desicion Tree",
font = list(
size = 10
)
)
p
Это создает диаграмму Санки, соответствующую дереву (жестко запрограммированному). Три необходимых вектора: «источник», «цель», «значение» выглядят следующим образом:
Схема Санки с жестким кодом:
Моя проблема в использовании объекта rpart 'fit'. Мне кажется, я не могу легко получить вектор для получения требуемых векторов 'source', 'target' и 'value' для графика.
fit $ frame и fit $ split содержит некоторую информацию, но их сложно объединить или использовать вместе. Использование функции печати для объекта подгонки дает необходимую информацию, но я не хочу редактировать текст, чтобы получить ее.
print(fit)
Выход:
1) root 81 17 absent (0.79012346 0.20987654)
2) Start>=8.5 62 6 absent (0.90322581 0.09677419)
4) Start>=14.5 29 0 absent (1.00000000 0.00000000) *
5) Start< 14.5 33 6 absent (0.81818182 0.18181818)
10) Age< 55 12 0 absent (1.00000000 0.00000000) *
11) Age>=55 21 6 absent (0.71428571 0.28571429)
22) Age>=111 14 2 absent (0.85714286 0.14285714) *
23) Age< 111 7 3 present (0.42857143 0.57142857) *
3) Start< 8.5 19 8 present (0.42105263 0.57894737) *
Так есть ли простой способ использовать объект rpart для получения этих 3 векторов для построения графика Санки? Этот график будет использоваться в веб-приложении, поэтому его необходимо использовать специально, поскольку у нас уже есть javascript, который ему соответствует, и его легко можно использовать повторно для применения к различным наборам данных.