R语言Stargazer包omit参数传入两个分类变量的标注错误解决方法
问题描述
使用R语言stargazer包构建包含4个线性回归(lm)模型的结果表,数据包含连续变量x、y和两个分类变量(国家、出生队列),4个模型的设置分别为:
- 模型1:仅纳入x,不加入分类变量
- 模型2:纳入x+国家分类变量
- 模型3:纳入x+出生队列分类变量
- 模型4:纳入x+国家+出生队列分类变量
为隐藏分类变量的系数,将两个分类变量名传入stargazer的omit参数,同时配置omit.labels和omit.yes.no参数标注对应固定效应是否纳入。运行后发现,第4个同时加入两个分类变量的模型中,出生队列固定效应的标注错误显示为No,不符合预期。
最小可复现代码
library(stargazer) set.seed(42) x <- rnorm(100, mean = 100, sd = 5) e <- rnorm(100, mean = 0, sd = 10) y <- x*1.5+e countries <- sample(c("CAN", "GRC", "PRT", "THA", "NZL"), size=100, replace=T) birth_cohorts <- sample(c("1980", "1990", "2000", "2010"), size=100, replace=T) model1 <- lm(y ~ x) model2 <- lm(y ~ x + countries - 1) model3 <- lm(y ~ x + birth_cohorts - 1) model4 <- lm(y ~ x + countries + birth_cohorts - 1) stargazer(model1, model2, model3, model4, type = "text", omit = c("countries", "birth_cohorts"), omit.labels = c("Country-fixed effects", "Cohort-fixed effects"), omit.yes.no = c("Yes", "No"))
已知临时方案
已有解决方案提出将模型倒序传入stargazer即可得到正确标注,代码如下:
stargazer(model4, model3, model2, model1, type = "text", omit = c("countries", "birth_cohorts"), omit.labels = c("Country-fixed effects", "Cohort-fixed effects"), omit.yes.no = c("Yes", "No"))
该方案需要调整模型排序,无法满足保留原始模型顺序的需求。
问题成因
该问题是stargazer包本身的逻辑bug:包内部处理多个omit规则时,对每个模型是否包含待omit变量的检测逻辑存在缺陷。当一个模型同时包含多个omit指定的变量时,仅排在前面的omit规则能被正确检测,后续的omit规则会被错误判定为不存在。倒序传入模型时,包含所有待omit变量的模型排在最前,可以让所有规则完成正确的初始化检测,因此输出结果正常。
不调整模型顺序的解决方案
方案1:手动添加固定效应标注行(最稳定)
关闭stargazer自带的omit标注功能,通过add.lines参数手动构造固定效应标注行,完全规避包的内部bug:
# 按模型顺序构造固定效应标注行,顺序和传入的model1~model4一一对应 fe_lines <- list( c("Country-fixed effects", "No", "Yes", "No", "Yes"), c("Cohort-fixed effects", "No", "No", "Yes", "Yes") ) stargazer(model1, model2, model3, model4, type = "text", omit = c("countries", "birth_cohorts"), # 关闭自带的omit标注 omit.labels = NULL, omit.yes.no = NULL, # 添加自定义标注行 add.lines = fe_lines)
该方案的优势是完全可控,支持自定义标注的内容、顺序和格式。
方案2:给omit参数添加正则锚定(改动最小)
stargazer的omit参数默认使用正则匹配,给每个变量名添加^正则开头锚定,即可绕过检测bug:
stargazer(model1, model2, model3, model4, type = "text", # 给每个分类变量名添加正则开头锚定 omit = c("^countries", "^birth_cohorts"), omit.labels = c("Country-fixed effects", "Cohort-fixed effects"), omit.yes.no = c("Yes", "No"))
该方案仅需修改omit参数,无需调整其他配置,改动量最小。
内容的提问来源于stack exchange,提问作者intedgar
相关产品推荐
相关产品推荐

