生成带有partykit:mob()对象的并排节点模型的表 [英] Generate table with side-by-side node models of `partykit:mob()` object

查看:66
本文介绍了生成带有partykit:mob()对象的并排节点模型的表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我使用 partykit:mob()拟合了模型.之后,我想生成一个包含所有节点的并排表(包括使用整个样本拟合的模型).在这里,我尝试使用 stargazer()进行此操作,但是不欢迎使用其他方法.

Let's say I fit a model using partykit:mob(). Afterward, I would like to generate a side-by-side table with all the nodes (including the model fitted using the whole sample). Here I attempted to do it using stargazer(), but other ways are more than welcome.

在下面的示例中,尝试获取表.

Below an example and attempts to get the table.

library("partykit")
require("mlbench")
## Pima Indians diabetes data
data("PimaIndiansDiabetes", package = "mlbench")
## a simple basic fitting function (of type 1) for a logistic regression
logit <- function(y, x, start = NULL, weights = NULL, offset = NULL, ...) {
  glm(y ~ 0 + x, family = binomial, start = start, ...)
}
## set up a logistic regression tree
pid_tree <- mob(diabetes ~ glucose | pregnant + pressure + triceps + insulin +
                  mass + pedigree + age, data = PimaIndiansDiabetes, fit = logit)

pid_tree 
# Model-based recursive partitioning (logit)
# 
# Model formula:
#   diabetes ~ glucose | pregnant + pressure + triceps + insulin +
#   mass + pedigree + age
# 
# Fitted party:
#   [1] root
# |   [2] mass <= 26.3: n = 167
# |       x(Intercept)     xglucose
# |        -9.95150963   0.05870786
# |   [3] mass > 26.3
# |   |   [4] age <= 30: n = 304
# |   |       x(Intercept)     xglucose
# |   |        -6.70558554   0.04683748
# |   |   [5] age > 30: n = 297
# |   |       x(Intercept)     xglucose
# |   |        -2.77095386   0.02353582
# 
# Number of inner nodes:    2
# Number of terminal nodes: 3
# Number of parameters per node: 2
# Objective function: 355.4578

1.-提取 summary(pid_tree,node = x) + stargazer().

## I want to replicate this table extracting the the nodes from partykit object.   
library(stargazer)  
m.glm<-   glm(diabetes ~ glucose, family = binomial,data = PimaIndiansDiabetes)

typeof(m.glm)
## [1] "list"
class(m.glm)
## [1] "glm" "lm" 
stargazer(m.glm)
## ommited output.



## Extracting summary from each node
summ_full_data <- summary(pid_tree, node = 1)
summ_node_2    <- summary(pid_tree, node = 2)
summ_node_4    <- summary(pid_tree, node = 4)
summ_node_5    <- summary(pid_tree, node = 5)

## trying to create stargazer table with coefficients
stargazer(m.glm,
          summ_node_2, 
          summ_node_4,
          summ_node_5,title="MOB Results")
##Error: $ operator is invalid for atomic vectors

2.-提取 pid_tree [x] + stargazer().

## Second Attempt (extracting modelparty objects instead)
node_2    <- pid_tree[2]
node_4    <- pid_tree[4]
node_5    <- pid_tree[5]

class(node_5)
##[1] "modelparty" "party"     

stargazer(m.glm,
          node_2, 
          node_4,
          node_5,title="MOB Results")
# % Error: Unrecognized object type.
# % Error: Unrecognized object type.
# % Error: Unrecognized object type.

3.-我不是很优雅,我知道:强制类模仿glm对象.

## Force class of object to emulate glm one
class(m.glm)
class(summ_node_2) <- c("glm", "lm") 
stargazer(summ_node_2)
##Error in if (p > 0) { : argument is of length zero

一个比较实用的解决方案是重新拟合模型,以恢复 partykit:mob()找到的规则,然后在其上使用 stargaze(),但对于确定我在这里缺少什么.预先感谢.

A rather pragmatic solution would be just re-fit the model recovering the rules found by partykit:mob() and then use stargaze() on them, but for sure I am missing something here. Thanks in advance.

推荐答案

最好提取(或重新整理)每个节点的模型对象列表,然后应用所选的表包.就我个人而言,我不怎么喜欢 stargazer ,而宁愿使用 modelsummary 或有时使用旧的 memisc .

It's best to extract (or refit) the list of model objects per node and then apply the table package of choice. Personally, I don't like stargazer much and much rather use modelsummary instead or sometimes the good old memisc.

如果树在 $ info 中包含模型 $ objects (对于 pid_tree 而言),则可以使用 nodeapply()来提取所有 nodeids():

If the tree contains the model $objects in the $info (as for pid_tree) you can use nodeapply() for all nodeids() to extract these:

pid_models <- nodeapply(pid_tree, ids = nodeids(pid_tree), FUN = function(x) x$info$object)

如果您只想提取树的终端节点(叶)的拟合模型,则可以通过设置 ids = nodeids(pid_tree,terminal = TRUE)来实现.

If you just want to extract the fitted models for the terminal nodes (leaves) of the tree, then you can do so by setting ids = nodeids(pid_tree, terminal = TRUE).

或者,特别是当不存储模型对象时,您可以通过以下方式轻松地重新调整它们:

Alternatively, especially when the model objects are not stored, you can easily refit them via:

pid_models <- refit.modelparty(pid_tree)

在这里,您还可以包含 node = nodeids(pid_tree,terminal = TRUE),以仅调整终端节点模型.

Here, you could also include node = nodeids(pid_tree, terminal = TRUE) to only refit the terminal node models.

在所有情况下,您都可以随后使用

In all cases you can subsequently use

msummary(pid_models)

生成模型摘要表.它支持多种输出格式,您当然可以进一步调整列表以更改结果,例如,通过更改其名称等.默认输出如下所示:

to produce the model summary table. It supports a variety of output formats and of course you can tweak the list further to change the results, e.g., by changing their names etc. The default output looks like this:

这篇关于生成带有partykit:mob()对象的并排节点模型的表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆