terminal_panel 函数未应用于绘制 glmertree 对象

terminal_panel function not applied in plotting an glmertree object

我安装了一个 glmtertree 模型,并喜欢应用修改后的 node_barplot 函数 my_node_barplot 进行绘图。但是,函数 my_node_barpolot 似乎没有传递给 plot.constparty 函数,导致使用包 partykit.

附带的 node_barplot 函数

glmertree 插图中的可重现示例:

library("glmertree")
data("MHserviceDemo", package = "glmertree")
MHserviceDemo$outcome_bin <- factor(MHserviceDemo$outcome > 0)
MH_gtree <- glmertree(outcome_bin ~ 1 | cluster_id | age + gender +
                      emotional + autism + impact + conduct,
                      data = MHserviceDemo, family = "binomial")
plot(MH_gtree, which = "tree")
plot(MH_gtree, which = "tree", terminal_panel = my_node_barplot)

显示相同的情节。 my_panel_barplot 是 GitHub 的 panel_barplot 的略微修改版本,我更改了构建 mainlab 变量的行以打印更多信息::

## ... skipped
function(id, nobs) sprintf("Node %s (n = %s)", id, nobs)
## rest skipped ...

## ... skipped
function(id, nobs, resp) {
      frq <- table(resp)
      perc <- round(frq[1]/sum(frq)*100, 1)
      sprintf("Node %s (n = %s)\n: %s%% (%s/%s)",
               id, nobs, perc, frq[1], sum(frq))
} else {
   function(id, nobs, resp) sprintf("n = %s", nobs)
   }
}
if (is.function(mainlab)) {
      mainlab <- mainlab(names(obj)[nid], nobs[nid], y)
} 
## skipped ...

该函数有很多行,但如果有帮助,我可以post或分享它。

你是对的,terminal_panel 参数在此特定设置中被忽略。原因是 glmertree 对象的 plot() 方法主要侧重于显示具有真实回归量(例如,处理变量)的树作为 GLMM 规范的一部分。相比之下,只有拦截回归器的情况(如您的示例中所示)被传递给 glmtree ,它使用强制转换为 constparty 并为此应用默认值。如果您接受默认值但要传递参数,则此解决方案非常方便,我们将不得不从 partykit 复制一些代码到 glmertree。我将与主要作者 Marjolein 讨论这是否值得付出努力。

针对您的具体情况的解决方法是自己对 constparty 进行强制转换。随后,您可以使用所有标准策略来扩展该图,例如,

MH_ctree <- as.constparty(MH_gtree)
plot(MH_ctree, terminal_panel = my_node_barplot)

请注意,我删除了 mainlab 中的换行符,它仍然适用于这个特定的情节。对于具有更多终端节点的地块,您可能需要换行符。然后你还需要增加 mainlab 的行数。

最后,除了遍历 node_barplot 的内部结构之外,您还可以在树的外部编写 mainlab,然后通过 mainlab 参数将其插入。请参阅此 post 以获取有效示例: