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 以获取有效示例:
我安装了一个 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 以获取有效示例: