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 标识符),则您不能在 plm
或 xtreg
中应用内部转换。例如,情况就是这样。重复截面数据,或 clustered/hierarchical 截面数据。 reghdfe
对高维固定效应使用不同的算法。多个 R 包针对同一目的,包括 lfe
(felm 函数)、fixest
(feols 函数)、biglm
(biglm 函数)、estimatr
(lm_robust function)等。从我个人的经验来看,estimatr
一般比其他的快。
我想控制包含一百多个水平的因子变量,而不将该控制的结果输出到摘要 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 标识符),则您不能在 plm
或 xtreg
中应用内部转换。例如,情况就是这样。重复截面数据,或 clustered/hierarchical 截面数据。 reghdfe
对高维固定效应使用不同的算法。多个 R 包针对同一目的,包括 lfe
(felm 函数)、fixest
(feols 函数)、biglm
(biglm 函数)、estimatr
(lm_robust function)等。从我个人的经验来看,estimatr
一般比其他的快。