假设我使用 partykit:mob()
拟合了一个模型。之后,我想生成一个包含所有节点的并排表格(包括使用整个样本拟合的模型)。我尝试使用 stargazer()
来实现这一点,但欢迎其他方法的建议。
下面是一个示例和尝试获取表格的尝试。
library("partykit")require("mlbench")## Pima Indians diabetes datadata("PimaIndiansDiabetes", package = "mlbench")## a simple basic fitting function (of type 1) for a logistic regressionlogit <- function(y, x, start = NULL, weights = NULL, offset = NULL, ...) { glm(y ~ 0 + x, family = binomial, start = start, ...)}## set up a logistic regression treepid_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()
。
## 我希望通过从 partykit 对象中提取节点来复制这个表格。 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.## 从每个节点提取摘要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)## 尝试使用系数创建 stargazer 表格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()
。
## 第二次尝试(提取模型 party 对象而不是)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 对象。
## 强制对象的类以模拟 glm 对象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()
,但我肯定在这里错过了什么。提前感谢。
回答:
最好是提取(或重新拟合)每个节点的模型对象列表,然后应用你选择的表格包。我个人不太喜欢 stargazer
,更喜欢使用 modelsummary
,或者有时使用老式的 memisc
。
如果树包含模型 $objects
在 $info
中(如 pid_tree
),你可以使用 nodeapply()
对所有 nodeids()
提取这些:
pid_models <- nodeapply(pid_tree, ids = nodeids(pid_tree), FUN = function(x) x$info$object)
如果你只想提取树的终端节点(叶子)的拟合模型,那么你可以通过设置 ids = nodeids(pid_tree, terminal = TRUE)
来实现。
或者,尤其是在模型对象未存储的情况下,你可以通过以下方式轻松地重新拟合它们:
pid_models <- refit.modelparty(pid_tree)
在这里,你也可以包含 node = nodeids(pid_tree, terminal = TRUE)
以仅重新拟合终端节点模型。
在所有情况下,你可以随后使用
msummary(pid_models)
来生成模型摘要表。它支持多种输出格式,当然你可以进一步调整列表以更改结果,例如,通过更改它们的名称等。默认输出如下所示: