R相当于Stata的Absorb

R equivalent of Stata's Absorb

我想控制包含一百多个水平的因子变量,而不将该控制的结果输出到摘要 table。请注意,我也对复制 Stata 命令的速度感兴趣,而不仅仅是对输出进行表面更改。

在 Stata 中,我可以像这样使用 "absorb":

use http://www.stata-press.com/data/r14/abdata.dta, clear
. xtreg n w k i.year, fe

Fixed-effects (within) regression               Number of obs     =      1,031
Group variable: id                              Number of groups  =        140

R-sq:                                           Obs per group:
     within  = 0.6277                                         min =          7
     between = 0.8473                                         avg =        7.4
     overall = 0.8346                                         max =          9

                                                F(10,881)         =     148.56
corr(u_i, Xb)  = 0.5666                         Prob > F          =     0.0000

------------------------------------------------------------------------------
           n |      Coef.   Std. Err.      t    P>|t|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
           w |  -.2731482   .0551503    -4.95   0.000    -.3813896   -.1649068
           k |   .5648036   .0212211    26.62   0.000     .5231537    .6064535
             |
        year |
       1977  |  -.0347963   .0188134    -1.85   0.065    -.0717206    .0021281
       1978  |  -.0583286   .0190916    -3.06   0.002    -.0957989   -.0208583
       1979  |   -.070047   .0190414    -3.68   0.000    -.1074187   -.0326752
       1980  |  -.0889378   .0189788    -4.69   0.000    -.1261867   -.0516889
       1981  |  -.1401502   .0186309    -7.52   0.000    -.1767163   -.1035841
       1982  |  -.1603768   .0188132    -8.52   0.000    -.1973008   -.1234528
       1983  |  -.1621103   .0222902    -7.27   0.000    -.2058585   -.1183621
       1984  |  -.1258136   .0282391    -4.46   0.000    -.1812373   -.0703899
             |
       _cons |   2.255419   .1772614    12.72   0.000     1.907515    2.603323
-------------+----------------------------------------------------------------
     sigma_u |  .64723143
     sigma_e |  .12836859
         rho |  .96215208   (fraction of variance due to u_i)
------------------------------------------------------------------------------
F test that all u_i=0: F(139, 881) = 126.32                  Prob > F = 0.0000

使用吸收移除固定效果

. reghdfe n w k, absorb(id year)
(converged in 7 iterations)

HDFE Linear regression                            Number of obs   =      1,031
Absorbing 2 HDFE groups                           F(   2,    881) =     362.67
                                                  Prob > F        =     0.0000
                                                  R-squared       =     0.9922
                                                  Adj R-squared   =     0.9908
                                                  Within R-sq.    =     0.4516
                                                  Root MSE        =     0.1284

------------------------------------------------------------------------------
           n |      Coef.   Std. Err.      t    P>|t|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
           w |  -.2731482   .0551503    -4.95   0.000    -.3813896   -.1649068
           k |   .5648036   .0212211    26.62   0.000     .5231537    .6064535
-------------+----------------------------------------------------------------
    Absorbed |       F(147, 881) =    120.660   0.000             (Joint test)
------------------------------------------------------------------------------

Absorbed degrees of freedom:
---------------------------------------------------------------+
 Absorbed FE |  Num. Coefs.  =   Categories  -   Redundant     |
-------------+-------------------------------------------------|
          id |          140             140              0     |
        year |            8               9              1     |
---------------------------------------------------------------+

我不知道 built-in 方法可以做到这一点,但是 broom::tidy 再加上一点点基于因子名称的过滤就能达到你想要的效果:

示例数据:

set.seed(101)
dd <- data.frame(y=rnorm(1000),
                 f=factor(sample(1:50,size=1000,replace=TRUE)),
                 x=rnorm(1000))

m <- lm(y~f+x,data=dd)

一种方式(取决于 grepl(),这是基础 R [我更熟悉],它有点混合和匹配范例)

library(broom)
library(dplyr)
tidy(m) %>%
    filter(!grepl("^f[0-9]+",term))
##          term    estimate  std.error statistic   p.value
## 1 (Intercept) -0.22643955 0.18852186 -1.201131 0.2299999
## 2           x -0.03330846 0.03101449 -1.073964 0.2831116

或者您可以使用 stringr::str_detect

library(stringr)
tidy(m) %>%
    filter(!str_detect(term,"^f[0-9]+"))

我使用的特定正则表达式是基于因子的名称加上水平的名称。在你的情况下,它将是 "^year[0-9]+",或者只是 "^year" 如果你觉得幸运的话

我能找到的最佳选择是 lfe 包,它实现了具有高维固定效应 or/and 工具变量的模型。

您可以像这样在竖线后指定固定效果:

felm(n ~ w _ k | year, df)

年份系数将被吸收到最终规范中。这种方法的问题在于它现在允许您预测观察结果。

编辑:更新

R 库 estimatr 有函数 lm_robust,它有一个 fixed_effects 吸收 FE 的参数,比我在网上找到的任何库都好用。极力推荐。

你做了两个完全不同的回归。 xtreg 用于面板数据(x 为 id,t 为时间)。无论是平衡面板还是非平衡面板,面板数据都需要一个与id正交的二维(通常取时间形式)。在 R 中,您可以使用 plm 包,它为面板数据提供合并的 OLS、一阶差分、within/fixed 效应、随机效应、嵌套等估计量。

但是,如果您的数据没有面板结构(即每个观察的唯一 id-time 标识符),则您不能在 plmxtreg 中应用内部转换。例如,情况就是这样。重复截面数据,或 clustered/hierarchical 截面数据。 reghdfe 对高维固定效应使用不同的算法。多个 R 包针对同一目的,包括 lfe(felm 函数)、fixest(feols 函数)、biglm(biglm 函数)、estimatr(lm_robust function)等。从我个人的经验来看,estimatr一般比其他的快。