如何为sjPlot的tab_model表格添加固定效应标记行(基于fixest回归)
如何为sjPlot的tab_model表格添加固定效应标记行(基于fixest回归)
嘿,我来帮你搞定这个需求!sjPlot的tab_model本身没有直接添加自定义标记行的参数,但我们可以通过一些小技巧实现你想要的效果——给表格加上固定效应的标记行,有对应固定效应就填x,没有就留空。下面是具体的操作步骤和代码示例:
第一步:准备工具和模型
首先加载需要的包,拟合你的fixest回归模型(我们同时准备一个不带carb固定效应的模型用来测试效果):
library(fixest) library(sjPlot) library(gt) # 用来修改表格,添加自定义行 # 带gear和carb固定效应的模型 reg2 <- feols(data = mtcars, mpg ~ vs * (am + hp + carb) + vs * (disp + hp + carb) | gear + carb) # 只带gear固定效应的模型(测试用) reg_no_carb <- feols(data = mtcars, mpg ~ vs * (am + hp + carb) + vs * (disp + hp + carb) | gear)
第二步:写个辅助函数提取固定效应状态
我们写个小函数,自动检测模型里有没有包含gear和carb的固定效应,生成对应的标记(x或空字符串):
get_fe_flags <- function(model) { # 从fixest模型里提取固定效应变量 fe_vars <- attr(model$fml, "fixed") # 判断每个固定效应是否存在,生成标记 gear_mark <- ifelse("gear" %in% fe_vars, "x", "") carb_mark <- ifelse("carb" %in% fe_vars, "x", "") # 整理成表格需要的格式 data.frame( " " = c("gear FE", "Carb FE"), # 行名列 "Model 1" = c(gear_mark, carb_mark), # 对应模型的标记列 check.names = FALSE ) }
第三步:生成表格并添加标记行
先让tab_model生成基础表格,然后转换成gt对象,再把我们的标记行添加到表格底部:
# 生成基础回归表格,返回gt对象方便修改 base_table <- tab_model(reg2, return = "gt") # 生成固定效应标记行 fe_mark_rows <- get_fe_flags(reg2) # 把标记行逐个添加到表格底部 final_table <- base_table %>% gt::tab_add_row(.list = as.list(fe_mark_rows[1,]), .where = "bottom") %>% gt::tab_add_row(.list = as.list(fe_mark_rows[2,]), .where = "bottom") # 查看最终表格 final_table
多模型的情况
如果你需要同时展示多个模型,只要稍微修改辅助函数,就能适配多模型场景:
get_fe_flags_multi <- function(models, model_names = paste0("Model ", seq_along(models))) { # 遍历每个模型,提取固定效应标记 fe_list <- lapply(models, function(mod) { fe_vars <- attr(mod$fml, "fixed") c( gear = ifelse("gear" %in% fe_vars, "x", ""), carb = ifelse("carb" %in% fe_vars, "x", "") ) }) # 整理成多列的表格格式 fe_data <- do.call(rbind, fe_list) %>% as.data.frame() %>% t() %>% as.data.frame() colnames(fe_data) <- model_names fe_data <- cbind(" " = rownames(fe_data), fe_data) rownames(fe_data) <- NULL fe_data } # 生成多模型的标记行 multi_fe_rows <- get_fe_flags_multi(list(reg2, reg_no_carb)) # 生成多模型基础表格 multi_base_tab <- tab_model(reg2, reg_no_carb, return = "gt") # 逐个添加标记行 final_multi_tab <- multi_base_tab for (i in 1:nrow(multi_fe_rows)) { final_multi_tab <- final_multi_tab %>% gt::tab_add_row(.list = as.list(multi_fe_rows[i,]), .where = "bottom") } # 查看多模型的最终表格 final_multi_tab
额外小技巧
你还可以用gt的tab_style函数给这些标记行设置样式,比如加粗行名,让它和其他回归行区分开:
final_table <- final_table %>% gt::tab_style( style = gt::cell_text(weight = "bold"), locations = gt::cells_body(columns = " ", rows = c(nrow(final_table$`_data`) - 1, nrow(final_table$`_data`))) )
这样就能得到你想要的、带有固定效应标记行的回归表格啦!
备注:内容来源于stack exchange,提问作者flâneur
相关产品推荐
相关产品推荐

