Чтобы реализовать такую графику в partykit
, вам нужно было бы написать новую панельную функцию для метода plot()
(точнее, функцию генерации панели). Отправной точкой может быть partykit::node_barplot
, который сначала извлекает подходящие вероятности дерева классификации, а затем рисует их с помощью пакета grid
. Вместо этого вы можете извлечь оценочные параметры с помощью coef()
, а затем нарисовать их с помощью grid
. Это немного технично, но не очень сложно.
Однако я бы не рекомендовал реализовывать такую функцию. Причина в том, что это лучше всего подходит для сравнения различных коэффициентов в одном и том же узле. Но поскольку наклон и точка пересечения находятся в совершенно разных масштабах, интерпретировать это непросто. Вместо этого следует уделять больше внимания различиям в одинаковом коэффициенте между узлами. Основанием для этого также могут быть:
coef(pid_tree)
## x(Intercept) xglucose
## 2 -9.951510 0.05870786
## 4 -6.705586 0.04683748
## 5 -2.770954 0.02353582
Кроме того, можно рассмотреть соответствующие стандартные ошибки для доверительных интервалов. (Имейте в виду, что их следует воспринимать с долей скептицизма: они не корректируются для оценки дерева, а делают вид, что концевые группы были заданы экзогенно. Тем не менее, они полезны в качестве грубых мерок.) Я включаю небольшую функцию для удобства. сделать это:
confintplot <- function(object, ylim = NULL,
xlab = "Parameter per node", ylab = "Estimate",
main = "", index = NULL, ...)
{
## point estimates and interval
cf <- coef(object)
node <- nodeids(object, terminal = TRUE)
ci <- nodeapply(object, ids = node, FUN = function(n)
confint(info_node(n)$object, ...))
if (!is.null(index)) {
cf <- cf[, index, drop = FALSE]
ci <- lapply(ci, "[", index, , drop = FALSE)
}
cfnm <- rownames(ci[[1L]])
nodenm <- rownames(cf)
## set up dimensions
n <- length(ci)
k <- nrow(ci[[1L]])
at <- t(outer(1:k, seq(-0.15, 0.15, length.out = n), "+"))
## empty plot
if(is.null(ylim)) ylim <- range(unlist(ci))
plot(0, 0, type = "n", xlim = range(at), ylim = ylim,
xlab = xlab, ylab = ylab, main = main, axes = FALSE)
## draw every parameter
for(i in 1L:k) {
arrows(at[,i], sapply(ci, "[", i, 1L), at[,i], sapply(ci, "[", i, 2L),
code = 3, angle = 90, length = 0.05)
points(at[, i], cf[, cfnm[i]], pch = 19, col = "white", cex=1.15)
points(at[, i], cf[, cfnm[i]], pch = nodenm, cex = 0.65)
}
axis(1, at = 1:k, labels = cfnm)
axis(2)
box()
}
Используя это, мы можем создать один график для каждого параметра (отрезок против наклона) отдельно. Это показывает, что пересечение увеличивается по узлам, в то время как наклон уменьшается.
par(mfrow = c(1, 2))
confintplot(pid_tree, index = 1)
confintplot(pid_tree, index = 2)
![confintplot1](https://i.stack.imgur.com/WTOuE.png)
Также возможно показать их на общей оси Y. Однако это полностью скрывает изменения наклона из-за разных масштабов:
confintplot(pid_tree)
![confintplot2](https://i.stack.imgur.com/uyMOB.png)
Последний комментарий: я бы рекомендовал использовать glmtree()
для этого конкретного типа модели вместо mob()
"вручную". Первый быстрее и предоставляет некоторые дополнительные функции, особенно простое прогнозирование.
person
Achim Zeileis
schedule
19.12.2017