如何用texreg展示dplyr do()生成的rowwise_df回归结果?
嘿,我之前也遇到过这个问题!用dplyr::do()批量跑回归后,想给texreg输出结果却丢了分组信息,确实挺头疼的。给你分享两个简单的解决思路,亲测好用~
首先先补全你的最小示例代码,方便后续演示:
# 安装并加载所需包 install.packages(c("tidyverse", "broom", "texreg"), dependencies = TRUE) library(tidyverse) library(texreg) # 构造虚拟数据 set.seed(123) df <- tibble( group = rep(letters[1:3], each = 20), x = rnorm(60), y = rnorm(60) + 0.5*x + as.numeric(factor(group)) )
方法一:用nest() + map()替代do()(推荐)
do()其实已经是tidyverse里相对老旧的语法了,现在更推荐用nest()来嵌套分组数据,再结合purrr::map()批量拟合模型,这样能完美保留分组信息,后续对接texreg也更顺畅:
# 1. 按group嵌套数据,然后批量拟合回归 reg_results <- df %>% group_by(group) %>% nest() %>% # 把每个group的观测数据嵌套成列表列 mutate(model = map(data, ~ lm(y ~ x, data = .x))) # 对每个嵌套数据拟合模型 # 2. 提取模型列表,并用group命名每个模型 model_list <- set_names(reg_results$model, reg_results$group) # 3. 用texreg展示结果(screenreg是控制台输出,texreg是生成LaTeX代码) screenreg(model_list)
这样输出的回归结果会自动带上每个模型对应的分组名称,完全不会丢失信息,而且代码逻辑更清晰,符合现代tidyverse的工作流。
方法二:如果坚持用do()的处理方式
如果你一定要保留do()的写法,只需要把生成的rowwise_df转换成普通数据框,再给模型列表手动命名即可:
# 1. 用do()批量拟合回归,然后取消分组 reg_do <- df %>% group_by(group) %>% do(model = lm(y ~ x, data = .)) %>% ungroup() # 把rowwise_df转换成普通data.frame # 2. 同样用group给模型列表命名 model_list_do <- set_names(reg_do$model, reg_do$group) # 3. 展示结果 screenreg(model_list_do)
为什么原来的方法会丢失信息?
你之前遇到的问题,本质是rowwise_df的特殊结构导致直接提取模型列时,无法关联对应的分组信息。而通过set_names()把分组名称赋值给模型列表的每个元素,texreg就能识别并展示每个模型对应的分组,完美解决信息丢失的问题~
内容的提问来源于stack exchange,提问作者Eric Fail
相关产品推荐
相关产品推荐

