如何在modelsummary-flextable工作流中堆叠因变量结果至单列?
基于fixest+modelsummary+flextable实现分组回归系数均值的单列展示
需求说明
需要完成以下流程:
- 按组(共k组)估计含j个解释变量的多元回归,得到每个解释变量的k个估计值
- 对每个变量的k个系数取平均并计算对应的t统计量
- 将这些均值和t统计量像常规回归估计值一样显示在同一列中
当前示例代码使用mtcars数据集,通过feols(c(mpg, hp) ~ 1)得到两个被解释变量的截距回归结果(即均值),但默认输出为分列展示,需要调整为单列堆叠格式。
实现步骤与代码
1. 加载依赖包
library(fixest) library(modelsummary) library(dplyr) library(purrr) library(stringr)
2. 按组估计回归并提取系数
以cyl为分组变量,对每个组的mpg和hp分别估计截距回归(对应均值):
# 按cyl分组拆分数据并估计回归 group_fits <- mtcars %>% split(.$cyl) %>% map(~ feols(c(mpg, hp) ~ 1, data = .)) # 提取所有组的系数、标准误,并整理数据 coef_df <- map_dfr(group_fits, tidy, .id = "group") %>% # 从model列中提取被解释变量名 mutate(variable = str_extract(model, "^[^~]+")) %>% select(variable, estimate, std.error)
3. 计算系数均值与t统计量
按变量分组,计算系数均值、均值的标准误(用于t统计量):
summary_stats <- coef_df %>% group_by(variable) %>% summarize( mean_est = mean(estimate), se_mean = sd(estimate) / sqrt(n()), # 均值的标准误 t_stat = mean_est / se_mean )
4. 构造伪模型并通过modelsummary单列展示
通过自定义tidy方法,让modelsummary将统计结果识别为常规回归模型,实现单列展示:
# 将统计结果包装为自定义模型对象 custom_model <- list(summary_stats) # 自定义tidy方法,返回modelsummary需要的系数结构 tidy.custom_model <- function(x, ...) { x[[1]] %>% rename(term = variable, estimate = mean_est, std.error = se_mean) %>% select(term, estimate, std.error) } # 自定义glance方法(避免modelsummary报错) glance.custom_model <- function(x, ...) { tibble(Observations = nrow(coef_df)) } # 生成flextable输出,同一列展示均值与t统计量 modelsummary( custom_model, estimate = "{estimate}{stars}", statistic = "({statistic})", # 将t统计量放在括号中 stars = c('*' = .1, '**' = .05, '***' = 0.01), output = "flextable" )
输出效果
最终输出会以单列形式展示,格式与常规回归结果一致:
| Model 1 | |
|---|---|
| mpg | 20.091*** |
| (15.02) | |
| hp | 146.688*** |
| (8.36) | |
| Observations | 6 |
内容的提问来源于stack exchange,提问作者astrae_research
相关产品推荐
相关产品推荐

