2014-09-02 35 views
7

Pracuję nad projektem, który wymaga uruchomienia ctree, a następnie wykreślić go w trybie interaktywnym - podobnie jak układ drzewa "D3.js", moją główną przeszkodą jest konwertować dane wyjściowe ctree do formatu json, aby później użyć javascript.Konwersja wyjścia Ctree do formatu JSON (dla układu drzewa D3)

Oto co trzeba (z przykładu z danych tęczówki):

> library(party) 
> irisct <- ctree(Species ~ .,data = iris) 
> irisct 

    Conditional inference tree with 4 terminal nodes 

Response: Species 
Inputs: Sepal.Length, Sepal.Width, Petal.Length, Petal.Width 
Number of observations: 150 

1) Petal.Length <= 1.9; criterion = 1, statistic = 140.264 
    2)* weights = 50 
1) Petal.Length > 1.9 
    3) Petal.Width <= 1.7; criterion = 1, statistic = 67.894 
    4) Petal.Length <= 4.8; criterion = 0.999, statistic = 13.865 
     5)* weights = 46 
    4) Petal.Length > 4.8 
     6)* weights = 8 
    3) Petal.Width > 1.7 
    7)* weights = 46 

Teraz chcę przekonwertować wyjście ctee w następującym formacie JSON przy użyciu jakiegoś algorytmu (zrobiłem to ręcznie), choć nie jest to chyba najlepszy sposób, aby przekształcić go:

{"name" : "Petal.Length <= 1.9 criterion = 1","value": 60, "children" : [ 
      {"name" : "n=50" ,"value": 60}, 
      {"name" : "Petal.Length > 1.9 criterion = 1","value": 60, "children": [ 
        {"name" : "n=46","value": 60 }, 
        {"name" : "Petal.Length > 4.8","value": 60, "children" :[ 
      {"name" : "Petal.Width > 1.7" ,"value": 60}, 
      {"name" : "46" ,"value": 60} 
    ]}] } 
     ]} 

Oto dwa zdjęcia zarówno R i D3.js działki:

enter image description here enter image description here

Próbowałem już wcześniej użyć obiektu RJSONIO na obiekcie Ctree, co nie pomogło.

Czy kiedykolwiek ktoś przekonwertował obiekt/wyjście Ctree do JSON na potrzeby układu drzewa D3.js? jeśli nie, czy ktoś ma pojęcie o algorytmie, który może przekonwertować jedno wyjście na drugie?

Z góry dziękuję za pomoc!

Odpowiedz

7

Sztuką jest wyodrębnienie użytecznych bitów obiektu irisct i przekształcenie ich tylko w JSON. Coś takiego:

get_ctree_parts <- function(x, ...) 
{ 
    UseMethod("get_ctree_parts") 
} 

get_ctree_parts.BinaryTree <- function(x, ...) 
{ 
    get_ctree_parts(attr(x, "tree")) 
} 

get_ctree_parts.SplittingNode <- function(x, ...) 
{ 
    with(
    x, 
    list(
     nodeID  = nodeID, 
     variableName = psplit$variableName, 
     splitPoint = psplit$splitpoint, 
     pValue  = 1 - round(criterion$maxcriterion, 3), 
     statistic = round(max(criterion$statistic), 3), 
     left   = get_ctree_parts(x$left), 
     right  = get_ctree_parts(x$right) 
    ) 
) 
} 

get_ctree_parts.TerminalNode <- function(x, ...) 
{ 
    with(
    x, 
    list(
     nodeID  = nodeID, 
     weights = sum(weights), 
     prediction = prediction 
    ) 
) 
} 

useful_bits_of_irisct <- get_ctree_parts(irisct) 
toJSON(useful_bits_of_irisct) 

Pomyślałem tę odpowiedź na zewnątrz przez rozsądnego korzystania z funkcji unclass. Na przykład:

unclass(irisct) 
unclass(attr(irisct, "tree")) 
unclass(attr(irisct, "tree")$psplit) 

Metody drukowania w pakiecie, party:::print.SplittingNode i party:::print.TerminalNode były również bardzo przydatne. (Wpisz party:::print. i autouzupełnianie, aby zobaczyć, co jest dostępne.)