在 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)
我将这些估计循环到模型列表 mdls。 modelsummary输出代码大致如下:
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)
}
而且不需要依赖洞察力。
我正在使用 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)
我将这些估计循环到模型列表 mdls。 modelsummary输出代码大致如下:
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)
}
而且不需要依赖洞察力。