如何将R中zim()模型的多个回归结果导出为LaTeX表格?
解决ZIM模型多结果LaTeX导出的高效方案
针对ZIM包的zim()模型无法直接用stargazer或xtable导出多模型LaTeX表格的问题,给你三个实用方案,按推荐程度排序:
方法一:用modelsummary包(最省心)
modelsummary对非标准模型的适配性极强,只要简单写个提取函数就能搞定:
- 先装包加载:
install.packages("modelsummary") library(modelsummary)
- 给
zim类模型写个提取规则(告诉包怎么取系数、标准误这些核心信息):
extract.zim <- function(model, ...) { # 合并零膨胀和计数部分的系数 coefs <- c(model$coefficients$zero, model$coefficients$count) # 对应标准误 ses <- c(model$se$zero, model$se$count) # 计算p值(可选,不需要可删除) p_vals <- 2 * pnorm(abs(coefs / ses), lower.tail = FALSE) # 整理成modelsummary识别的格式 out <- list( coef = coefs, se = ses, p.value = p_vals, gof = data.frame( "AIC" = model$aic, "BIC" = model$bic ) ) class(out) <- "modelsummary_list" return(out) }
- 直接传入多个模型生成LaTeX:
# 假设你有m1到m6这几个zim模型 modelsummary(list(m1, m2, m3, m4, m5, m6), output = "latex")
要是想给零膨胀/计数部分的系数加区分标签,直接在coefs的命名里修改即可,比如:
names(coefs) <- paste0( c(rep("Zero: ", length(model$coefficients$zero)), rep("Count: ", length(model$coefficients$count))), names(coefs) )
方法二:用texreg包自定义适配
texreg是老牌的回归表格生成工具,同样支持扩展非标准模型:
- 装包加载:
install.packages("texreg") library(texreg)
- 写个
extract方法适配zim模型:
extract.zim <- function(model, include.aic = TRUE, include.bic = TRUE, ...) { # 拆分零膨胀和计数部分的系数、标准误 coef_zero <- model$coefficients$zero se_zero <- model$se$zero coef_count <- model$coefficients$count se_count <- model$se$count # 合并并添加标签区分 coefs <- c(coef_zero, coef_count) ses <- c(se_zero, se_count) names(coefs) <- paste0(c(rep("Zero: ", length(coef_zero)), rep("Count: ", length(coef_count))), names(coefs)) names(ses) <- names(coefs) # 整理拟合优度指标 gof <- c() gof_names <- c() if (include.aic) { gof <- c(gof, model$aic) gof_names <- c(gof_names, "AIC") } if (include.bic) { gof <- c(gof, model$bic) gof_names <- c(gof_names, "BIC") } # 生成texreg需要的对象 tr <- createTexreg( coef.names = names(coefs), coef = coefs, se = ses, gof.names = gof_names, gof = gof ) return(tr) }
- 导出多模型LaTeX:
# 直接生成或导出到文件 texreg(list(m1, m2, m3), file = "zim_models.tex")
方法三:批量提取+kableExtra手动构建
要是不想用专用工具包,自己写个批量提取函数,再用kableExtra转LaTeX也很灵活:
- 写批量提取函数:
extract_zim_results <- function(model_list) { result_df <- data.frame() for (i in seq_along(model_list)) { m <- model_list[[i]] # 提取零膨胀部分 zero_df <- data.frame( term = paste0("Zero: ", names(m$coefficients$zero)), estimate = round(m$coefficients$zero, 3), se = round(m$se$zero, 3), model = paste0("Model ", i) ) # 提取计数部分 count_df <- data.frame( term = paste0("Count: ", names(m$coefficients$count)), estimate = round(m$coefficients$count, 3), se = round(m$se$count, 3), model = paste0("Model ", i) ) # 合并到总表 result_df <- rbind(result_df, zero_df, count_df) } # 转成宽格式,方便制作表格 library(tidyr) result_wide <- result_df %>% pivot_wider( id_cols = term, names_from = model, values_from = c(estimate, se), names_glue = "{model}_{.value}" ) return(result_wide) }
- 生成LaTeX表格:
library(kableExtra) # 把你的模型放进列表里 model_list <- list(m1, m2, m3, m4, m5, m6) result_table <- extract_zim_results(model_list) # 生成带booktabs格式的LaTeX表格 kable(result_table, format = "latex", booktabs = TRUE) %>% kable_styling(latex_options = c("striped", "hold_position"))
不同模型自变量不一致时,pivot_wider会自动补NA,不影响表格展示。
内容的提问来源于stack exchange,提问作者Lilia
相关产品推荐
相关产品推荐

