在 R 中的模型汇总输出表中计算和显示因变量的均值

Compute and display mean of dependent variable in modelsummary output tables in R

我正在使用 R 中 fixest 包中的 feols 命令来估计固定效应回归,在大多数情况下使用权重。为了输出我的结果,我主要使用 modelsummary 包中的 modelsummary 命令。我已经弄清楚如何使用 add_rows 功能来添加有关模型的更多信息(在我的例子中,我使用它来添加控制变量存在的指标在给定的模型中,以类似于 modelsummary 如何自然地指示给定模型中固定效应的存在的方式。

但是,我还想向每个模型添加模型因变量的均值,该模型是根据与给定模型估计的相同观察值进行估计的(即考虑到某些观察值因缺失而下降)值,并且这可能因模型而异,具体取决于缺失值的结构),并且最好仅针对我的治疗变量设置为 == 0 的观察结果。我怎样才能做到这一点?

我的基本回归结构如下(有些规格更简单,例如没有 Municipality.ID):

model = feols(depvar ~ i(Year.factor, Treatment.dummy, ref ='2007') + Year.factor + Treatment.dummy + Control.var, data = subset(data.frame, condition < limit), weights = Weight.var, panel.id = c(Year.factor, Municipality.ID), cluster = ~Municipality.ID)

我将这些估计循环到模型列表 mdlsmodelsummary输出代码大致如下:

mdl.stats <- list(
  list("raw" = "nobs", "clean" = "Observations", "fmt" = 0),
  list("raw" = "r.squared", "clean" = "R Squared", "fmt" = 3),
  list("raw" = "r2", "clean" = "R Squared", "fmt" = 3),
  list("raw" = "r2.within", "clean" = "R2", "fmt" = 3),
  list("raw" = "within.r.squared", "clean" = "R2 (within)", "fmt" = 3),
  list("raw" = "r.squared.within", "clean" = "R2 (within)", "fmt" = 3),
  list("raw" = "FE: TERYT.f", "clean" = "Municipality FE", "fmt" = 0))
cntrls <- rep(c("", "X", ""), times=length(mdls)/3)
cntrls <- as.data.frame(t(c("Controls", cntrls)))
cntrls <- set_names(cntrls, c("Coefficients", names(mdls)))

modelsummary::modelsummary(mdls, gof_map = mdl.stats, stars = TRUE, output = "latex", booktabs = TRUE, add_rows = cntrls)

您当然可以手动创建自己的行,然后使用 add_rows 参数将它们添加到 table。这只需要对基本 R 函数进行一点创意,就可以创建合适的数据框。

如果您正在寻找更“自动化”的策略,Customizing Existing Models section of the modelsummary website 描述了一种非常强大的机制,可以将新信息添加到 table 的底部。简而言之:创建一个名为 glance_custom.fixest 的函数,它将单个模型对象作为输入,returns 一个 data.frame 只有一行并且每个新统计信息都在不同的列中。

在这个例子中,我使用 insight 包中的 find_response()get_data() 函数来更容易地找到因变量、提取数据和计算平均值:

library(modelsummary)
library(fixest)
library(insight)

glance_custom.fixest <- function(x, ...) {
    dv <- insight::find_response(x)
    dat <- insight::get_data(x)
    out <- data.frame("Mean(DV)" = mean(dat[[dv]]), check.names = FALSE)
    return(out)
}

mod <- list(
    feols(mpg ~ hp, data = mtcars[mtcars$cyl == 4,]),
    feols(mpg ~ hp, data = mtcars[mtcars$cyl == 6,]),
    feols(mpg ~ hp, data = mtcars[mtcars$cyl == 8,]))

modelsummary(mod, output = "markdown")
Model 1 Model 2 Model 3
(Intercept) 35.983 20.674 18.080
(5.201) (3.304) (2.988)
hp -0.113 -0.008 -0.014
(0.061) (0.027) (0.014)
Num.Obs. 11 7 14
R2 0.274 0.016 0.080
R2 Adj. 0.193 -0.181 0.004
AIC 63.8 27.9 67.8
BIC 64.6 27.8 69.1
Log.Lik. -29.891 -11.954 -31.920
Std.Errors IID IID IID
Mean(DV) 26.664 19.743 15.100

抱歉,我无法对 Vincent 的回答发表评论。 Fixest在“my”下提供了“mean of dependent variable”fitstat,这样你的glance_custom函数就可以简化为:

glance_custom.fixest <- function(x, ...) {
  out <- data.frame("Mean(DV)" = as.numeric(fitstat(x, type = "my")))
  return(out)
}

而且不需要依赖洞察力。