Я пытаюсь построить дерево регрессии, сгенерированное с помощью rpart
, с использованием partykit
. Предположим, что используемая формула - y ~ x1 + x2 + x3 + ... + xn
. То, что я хотел бы получить, - это дерево с ящиками в терминальных узлах с меткой сверху, в которой перечислены 10-й, 50-й и 90-й проценты распределения значений y для наблюдений, назначенных каждому узлу, то есть над прямоугольником, представляющим каждый терминал, я хотел бы отобразить метку типа «10-й процентиль = 200 долларов, средний = $ 247, 90-й процентиль = 292 доллара».partykit: Отображение значений процентиля конечных узлов над ящиками терминала терминала
Код ниже создает желаемое дерево:
library("rpart")
fit <- rpart(Price ~ Mileage + Type + Country, cu.summary)
library("partykit")
tree.2 <- as.party(fit)
Следующий код создает концевые участки, но без требуемых этикеток на концевых узлах:
plot(tree.2, type = "simple", terminal_panel = node_boxplot(tree.2,
col = "black", fill = "lightgray", width = 0.5, yscale = NULL,
ylines = 3, cex = 0.5, id = TRUE))
Если я могу отображать среднее у -значение для узла, тогда должно быть достаточно просто увеличить метку с процентилями, поэтому мой первый шаг должен отображать над каждым терминальным узлом только его среднее значение y.
Я знаю, что могу получить среднее у-значения в пределах узла (здесь узел # 12) с кодом, например, как это:
colMeans(tree.2[12]$fitted[2])
Так что я попытался создать формулу и использовать параметр mainlab
boxplot панель-производящая функция для генерации метки, содержащей это значит:
labf <- function(node) colMeans(node$fitted[2])
plot(tree.2, type = "simple", terminal_panel = node_boxplot(tree.2,
col = "black", fill = "lightgray", width = 0.5, yscale = NULL,
ylines = 3, cex = 0.5, id = TRUE, mainlab = tf))
к сожалению, это генерирует сообщение об ошибке:
Error in mainlab(names(obj)[nid], sum(wn)) : unused argument (sum(wn)).
Но, кажется, это находится на правильном пути, так как если я использую:
plot(tree.2, type = "simple", terminal_panel = node_boxplot(tree.2,
col = "black", fill = "lightgray", width = 0.5, yscale = NULL,
ylines = 3, cex = 0.5, id = TRUE, mainlab = colMeans(tree.2$fitted[2])))
тогда я получаю правильное среднее значение у-у корневого узла отображается. Я был бы признателен за помощь в исправлении ошибки, описанной выше, чтобы показать средние значения y для каждого отдельного терминального узла. Оттуда, это должно быть легко добавить в другие процентили и форматировать вещи красиво.
Не могли бы вы попытаться создать воспроизводимую версию проблемы? Тогда я попытаюсь взглянуть на него. –
Несомненно. Спасибо @AchimZeileis! В приведенном ниже коде используется набор данных Consumer Reports, который поставляется с RPART. 'подходят <- rpart (Цена ~ Пробег + Тип + Страна, cu.summary)' ' пар (XPD = TRUE) участок (подходит, сжатие = TRUE)' ' текст (подходит, use.n = TRUE) '' tree.2 <-as.party (подходит) '' участок (tree.2) ' Это будет генерировать дерево участок с присуща рефлективными, вербальными на терминал узлов. То, что я пытаюсь сделать, это поместить среднее (а затем и некоторые другие процентили) над каждым из терминальных узлов в метке. Поэтому вместо «Node 4 (n = 21)» самый левый терминал будет иметь метку, обозначающую что-то вроде «mean = 7629.048» – djr99