fixst vs lm - 不同的结果? (差异中的差异)
fixest vs lm - diffrent results? (difference in difference)
我正在尝试对多个时间段进行 'classic' 差异化处理。我要做的模型是:
y = a + b1x1 + b2_treat + b3_period + b_4(treat*period) + u (eq.1)
所以基本上我正在测试不同的设置,只是为了确保我使用不同的包以正确的方式指定我的模型。我想使用 fixst-package,所以我尝试将估计值与标准 lm()-package 的估计值进行比较。然而,结果不同——系数和 std.errors.
我的问题是:
- 是否正确指定了 lm_mod、lm_mod2 或 feols_mod 回归(如等式 1)?
如果没有,如果有人能告诉我如何在 lm() 中获得与在 feols() 中相同的结果,我将不胜感激!
# libraries
library(fixest)
library(modelsummary)
library(tidyverse)
# load data
data(base_did)
# make df for lm_mod with 5 as the reference-period
base_ref_5 <- base_did %>%
mutate(period = as.factor(period)) %>%
mutate(period = relevel(period, ref = 5))
# Notice that i use base_ref_5 for the lm model and base_did for the feol_mod.
lm_mod <- lm(y ~ x1 + treat*period, base_ref_5)
lm_mod2 <- lm(y ~ x1 + treat + period + treat*period, base_ref_5)
feols_mod <- feols(y ~ x1 + i(period, treat, ref = 5), base_did)
# compare models
models <- list("lm" = lm_mod,
"lm2" = lm_mod2,
"feols" = feols_mod)
msummary(models, stars = T)
**EDIT:**
the reason why I created base_ref_5 was so that both regressions would have period 5 as the reference period, if that was unclear.
**EDIT 2**:
added a third model (lm_mod2) which is much closer, but there is still a difference.
这里有两个问题。
- 在
lm()
模型中,period
变量是交互的,但被视为连续数值变量。相反,调用 i(period, treat)
将 period
视为一个因素(这在文档中有明确解释)。
i()
函数仅包含交互项,不包含本构项。
这里有两个模型来说明相似之处:
library(fixest)
data(base_did)
lm_mod <- lm(y ~ x1 + factor(period) * factor(treat), base_did)
feols_mod <- feols(y ~ x1 + factor(period) + i(period, treat), base_did)
coef(lm_mod)["x1"]
#> x1
#> 0.9799697
coef(feols_mod)["x1"]
#> x1
#> 0.9799697
请注意,我只回答了您问题中关于 lm
和 feols
之间相似之处的部分。 Whosebug 是一个编程问答网站。如果您对统计模型的正确规范有疑问,您可能想在 CrossValidated 上提问。
我正在尝试对多个时间段进行 'classic' 差异化处理。我要做的模型是:
y = a + b1x1 + b2_treat + b3_period + b_4(treat*period) + u (eq.1)
所以基本上我正在测试不同的设置,只是为了确保我使用不同的包以正确的方式指定我的模型。我想使用 fixst-package,所以我尝试将估计值与标准 lm()-package 的估计值进行比较。然而,结果不同——系数和 std.errors.
我的问题是:
- 是否正确指定了 lm_mod、lm_mod2 或 feols_mod 回归(如等式 1)?
如果没有,如果有人能告诉我如何在 lm() 中获得与在 feols() 中相同的结果,我将不胜感激!
# libraries
library(fixest)
library(modelsummary)
library(tidyverse)
# load data
data(base_did)
# make df for lm_mod with 5 as the reference-period
base_ref_5 <- base_did %>%
mutate(period = as.factor(period)) %>%
mutate(period = relevel(period, ref = 5))
# Notice that i use base_ref_5 for the lm model and base_did for the feol_mod.
lm_mod <- lm(y ~ x1 + treat*period, base_ref_5)
lm_mod2 <- lm(y ~ x1 + treat + period + treat*period, base_ref_5)
feols_mod <- feols(y ~ x1 + i(period, treat, ref = 5), base_did)
# compare models
models <- list("lm" = lm_mod,
"lm2" = lm_mod2,
"feols" = feols_mod)
msummary(models, stars = T)
**EDIT:**
the reason why I created base_ref_5 was so that both regressions would have period 5 as the reference period, if that was unclear.
**EDIT 2**:
added a third model (lm_mod2) which is much closer, but there is still a difference.
这里有两个问题。
- 在
lm()
模型中,period
变量是交互的,但被视为连续数值变量。相反,调用i(period, treat)
将period
视为一个因素(这在文档中有明确解释)。 i()
函数仅包含交互项,不包含本构项。
这里有两个模型来说明相似之处:
library(fixest)
data(base_did)
lm_mod <- lm(y ~ x1 + factor(period) * factor(treat), base_did)
feols_mod <- feols(y ~ x1 + factor(period) + i(period, treat), base_did)
coef(lm_mod)["x1"]
#> x1
#> 0.9799697
coef(feols_mod)["x1"]
#> x1
#> 0.9799697
请注意,我只回答了您问题中关于 lm
和 feols
之间相似之处的部分。 Whosebug 是一个编程问答网站。如果您对统计模型的正确规范有疑问,您可能想在 CrossValidated 上提问。