You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:21:10