r - 派对套件 : Displaying terminal node percentile values above terminal node boxplots

标签 r tree boxplot party

我正在尝试绘制由 rpart 生成的回归树使用 partykit .假设使用的公式是 y ~ x1 + x2 + x3 + ... + xn .我想要实现的是在终端节点中带有箱线图的树,顶部有一个标签,列出了分配给每个节点的观测值的 y 值分布的第 10、50 和 90 个百分位数,即在箱线图上方表示每个终端节点,我想显示一个标签,如“第 10 个百分点 = 200 美元,平均值 = 247 美元,第 90 个百分点 = 292 美元”。

下面的代码生成所需的树:

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 值,那么用百分位数增加标签应该很容易,所以我的第一步是在每个终端节点上方仅显示其平均 y 值。

我知道我可以使用如下代码检索节点(此处为节点 #12)内的平均 y 值:
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 值。我很感激能帮助修复上述错误,以便我显示每个单独终端节点的平均 y 值。从那里,应该很容易添加其他百分位数并很好地格式化。

最佳答案

原则上,您走在正确的轨道上。但如果 mainlab应该是函数,不是node的函数但来自 idnobs ,见 ?node_boxplot .您还可以使用 fitted 更轻松地为所有终端节点计算均值表(或某些分位数)。整棵树的数据:

tab <- tapply(tree.2$fitted[["(response)"]],
  factor(tree.2$fitted[["(fitted)"]], levels = 1:length(tree.2)),
  FUN = mean)

然后,您可以通过舍入/格式化来准备绘图:
tab <- format(round(tab, digits = 3))
tab
##           1           2           3           4           5           6 
## "       NA" "       NA" "       NA" " 7629.048" "       NA" "12241.552" 
##           7           8           9          10          11          12 
## "14846.895" "22317.727" "       NA" "       NA" "17607.444" "21499.714" 
##          13 
## "27646.000" 

并且要将其添加到显示中,请为 mainlab 编写您自己的帮助函数。 :
mlab <- function(id, nobs) paste("Mean =", tab[id])
plot(tree.2, tp_args = list(mainlab = mlab))

enter image description here

关于r - 派对套件 : Displaying terminal node percentile values above terminal node boxplots,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33314187/

相关文章:

r - 为什么新数据框列会填充所有值?

java - 访问级联 ArrayList 中包含的特定对象

algorithm - AVL 树 - LST 和 RST 之间的最大节点数

R:帮助使用 dummyVars 并添加回 data.frame

r - 如何使用 Shiny 的 rgl 删除不需要的文本输出

R ggplot箱线图改变颜色和填充

python - 如何在箱线图中显示分位数的值

r - 将统计表添加到 R 中的箱线图中

r - 在给定一列的情况下计算 R 中的耗时

c++ - 类中私有(private)静态方法和私有(private)方法之间的区别