Как установить другой вид гистограммы в терминальных узлах?

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

Например, я запускаю дерево MOB для набора данных «PimaIndiansDiabetes» в пакете «mlbench». Вот коды:

pid_formula <- diabetes ~ glucose | pregnant + pressure + triceps +   
insulin + mass + pedigree + age
logit <- function(y, x, start = NULL, weights = NULL, offset = NULL, ...) {
glm(y ~ 0 + x, family = binomial, start = start, ...)
}
pid_tree <- mob(pid_formula, data = PimaIndiansDiabetes, fit = logit)

то у меня есть модель для каждого узла. например, у меня есть «масса = -9,95 + 0,058 * глюкоза» для узла № 2. Я хочу сделать гистограммы из этих коэффициентов (например: -9,95 и 0,058 для узла № 2) и использовать эти гистограммы в качестве конечных узлов в окончательный участок дерева. Любая идея, как это сделать? Заранее спасибо.


person Mah Sa    schedule 18.12.2017    source источник
comment
Пожалуйста, сделайте этот вопрос воспроизводимым: пожалуйста, прочитайте stackoverflow.com/questions/5963269/ и/или stackoverflow.com/help/mcve, затем отредактируйте свой вопрос. В противном случае он будет слишком расплывчатым и, к сожалению, с меньшей вероятностью даст быстрый ответ.   -  person r2evans    schedule 18.12.2017


Ответы (1)


Чтобы реализовать такую ​​графику в 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

Также возможно показать их на общей оси Y. Однако это полностью скрывает изменения наклона из-за разных масштабов:

confintplot(pid_tree)

confintplot2

Последний комментарий: я бы рекомендовал использовать glmtree() для этого конкретного типа модели вместо mob() "вручную". Первый быстрее и предоставляет некоторые дополнительные функции, особенно простое прогнозирование.

person Achim Zeileis    schedule 19.12.2017