Добавьте гистограммы к кругам во внутренних узлах в построенных деревьях partykit.

Пакет partykit строит гистограммы в конечных узлах деревьев, что дает визуальное представление апостериорных вероятностей классов зависимых переменных.

Я хотел бы добавить эти гистограммы также во внутренние узлы, ниже стандартных кругов/эллипсов. Для этого необходимо использовать функцию, представляющую собой смесь node_inner() и node_barplot() с аргументом inner_panel метода plot().

Но эти функции имеют довольно сложную внутреннюю структуру, и я не уверен, как их смешать, чтобы иметь внутренние графики, расположенные вертикально.

Любые идеи?


person Bakaburg    schedule 22.12.2016    source источник
comment
вот так?ct <- ctree(factor(cyl) ~ ., data = mtcars, minsplit = 2); plot(ct, inner_panel = node_barplot(ct))   -  person rawr    schedule 22.12.2016
comment
нет, это то, что отображается, если вы просто отключите node_barplot. Я пытался объединить node_inner и node_barplot в один.   -  person Bakaburg    schedule 23.12.2016


Ответы (1)


Возможно, просто выглядит не очень привлекательно. Если вы хотите показать имя переменной разделения и p-значение, было бы лучше настроить аргумент mainlab для node_barplot. В ответе на Классификация Ctree с весами - отображаются результаты в иллюстрация того, как включить веса в заголовок — аналогичным образом вы можете отобразить переменную разделения и p-значение.

Если вы решили настроить новую панельную функцию с двумя подпанелями, вам потребуется немного grid программирования (графическая система, на которой основан метод plot()). Вам нужно настроить grid.layout, а затем просмотреть полученные viewport.

make_inner_and_barplot <- function(object, ...) {
  function(node) {  
    ## layout
    pushViewport(viewport(layout = grid.layout(nrow = 2, ncol = 1,
      heights = unit(c(0.2, 0.8), "npc"))))
    ## background color
    grid.rect(gp = gpar(fill = "white", col = 0))
    ## circle
    pushViewport(viewport(layout.pos.col = 1, layout.pos.row = 1))
    node_inner(object)(node)
    popViewport()
    ## circle
    pushViewport(viewport(layout.pos.col = 1, layout.pos.row = 2))
    node_barplot(object, id = FALSE, ...)(node)
    popViewport(2)
  }
}

С полученной функцией панели вы можете сделать:

ct <- ctree(factor(cyl) ~ ., data = mtcars, minsplit = 2)
plot(ct, inner_panel = make_inner_and_barplot(ct), tnex = 0.8)

внутренний и барплот

person Achim Zeileis    schedule 23.12.2016