固定效应与聚类标准误:reghdfe 的几个细节
固定效应吸收了什么
企业固定效应吸收所有不随时间变化的企业特征:所在地区、成立年份,以及样本期内没换过的行业。这些变量的系数因此估计不出来。年份固定效应吸收所有企业共同面对的年度冲击。
更严格的设定会加交互固定效应:
reghdfe y x $controls, absorb(id year) vce(cluster id)
reghdfe y x $controls, absorb(id ind#year prov#year) vce(cluster id) // 行业×年份、省份×年份
行业×年份固定效应控制的是“同一行业在同一年受到的共同冲击”。只加这一组时,识别来自同行业、同年份的企业之间的差异;像第二行那样再加上省份×年份,系数就来自剔除企业、行业×年份、省份×年份三组固定效应之后剩下的变异。控制得越多,剩下的变异越少,估计越依赖少数企业。如果关心的变量本身就在行业—年份层面(比如行业政策),它会被行业×年份固定效应完全吸收。
reghdfe 的三个细节
- 单例观测会被删掉。 某个固定效应组里只有一个观测(比如某家企业只出现了一年)时,它对识别没有贡献,却会让标准误显得偏小,
reghdfe默认把这类观测删掉(Correia, 2015)。所以它报告的样本量常常比xtreg少。 - R² 有三个。
reghdfe同时报告 R²、调整 R² 和组内 R²(within R²),xtreg, fe的 “R-sq within” 对应的是组内那个。论文表格里要写清楚是哪一个。 - 自由度调整。 嵌套在聚类变量里的固定效应(比如按企业聚类时的企业固定效应)不计入自由度,输出表底部会注明 “FE nested within cluster; treated as redundant for DoF computation”。这是它和
areg的聚类标准误略有差别的原因。
聚类标准误:为什么,聚到哪一层
同一家企业不同年份的误差往往相关,关心的解释变量也有很强的持续性。这时默认的 OLS 标准误、甚至异方差稳健标准误都会偏小,偏多少大致取决于两者组内相关程度的乘积(Moulton 因子的思路),两者都很持久时会偏得很厉害。Petersen(2009)专门拿金融领域的面板数据比较过各种做法,结论是存在企业效应时要按企业聚类。
一个小的蒙特卡洛:100 家企业、10 年, 和误差项在企业内部都服从 AR(1),自相关系数 0.8,真实系数为 0,回归里加了企业和年份固定效应。重复 1000 次,看名义 5% 水平的 t 检验实际拒绝原假设的比例:
| 标准误 | 实际拒绝率 |
|---|---|
| 默认(同方差) | 21.6% |
异方差稳健 vce(robust) |
20.8% |
按企业聚类 vce(cluster id) |
5.9% |
注意回归里已经有企业固定效应了。固定效应处理的是误差里不随时间变化的那部分,处理不了剩下的序列相关,两者不能互相替代。
capture program drop onesim
program define onesim, rclass
clear
set obs 100
gen id = _n
gen a = rnormal()
expand 10
bysort id: gen year = _n
bysort id (year): gen x = rnormal() if _n == 1
bysort id (year): replace x = 0.8*x[_n-1] + 0.6*rnormal() if _n > 1
bysort id (year): gen e = rnormal() if _n == 1
bysort id (year): replace e = 0.8*e[_n-1] + 0.6*rnormal() if _n > 1
gen y = a + 0*x + e
quietly reghdfe y x, absorb(id year)
return scalar p_ols = 2*ttail(e(df_r), abs(_b[x]/_se[x]))
quietly reghdfe y x, absorb(id year) vce(robust)
return scalar p_rob = 2*ttail(e(df_r), abs(_b[x]/_se[x]))
quietly reghdfe y x, absorb(id year) vce(cluster id)
return scalar p_cl = 2*ttail(e(df_r), abs(_b[x]/_se[x]))
end
simulate p_ols=r(p_ols) p_rob=r(p_rob) p_cl=r(p_cl), reps(1000) seed(20260927): onesim
gen rej_ols = p_ols < .05
gen rej_rob = p_rob < .05
gen rej_cl = p_cl < .05
summarize rej_*
换一份真实系数为 0.1 的数据跑一次回归,四种标准误差别也很明显:
| 标准误 | 系数 | 标准误 | p 值 |
|---|---|---|---|
| 默认 | 0.110 | 0.034 | 0.001 |
| 异方差稳健 | 0.110 | 0.036 | 0.003 |
| 按企业聚类 | 0.110 | 0.057 | 0.055 |
| 企业、年份双向聚类 | 0.110 | 0.055 | 0.078 |
聚到哪一层?Abadie et al.(2023)的看法是:聚类是个设计问题,要看处理在哪个层级分配、样本怎么抽取,而不是看聚类之后标准误变大还是变小。落到实操上:
- 企业层面的变量、企业—年份面板:按企业聚类是默认选择。
- 政策在城市或省份层面实施:至少聚类到城市或省份。
- 企业、年份双向聚类(
vce(cluster id year)):年份只有十来个时,年份这一维的聚类数太少,双向聚类的标准误本身就不可靠(Cameron, Gelbach and Miller, 2011;Cameron and Miller, 2015)。更常见的做法是加年份固定效应、按企业聚类。不过年份固定效应只去掉了每年所有企业共同的那部分冲击;如果冲击在行业或地区内部相关,还要考虑聚类到行业或地区,聚类数少时配合下面的 wild cluster bootstrap。
聚类数很少时:wild cluster bootstrap
聚类数少(比如只有十几个省份)时,聚类稳健标准误本身也会偏小,检验同样会过度拒绝。常用的补救是 wild cluster bootstrap(Cameron, Gelbach and Miller, 2008),Stata 里用 boottest(Roodman et al., 2019)。
这里有个坑:boottest 不支持吸收了两组以上固定效应的 reghdfe,会直接报 “Doesn't work after reghdfe with more than one set of absorbed fixed effects”。把年份固定效应改成虚拟变量写进回归就行:
reghdfe y x i.year, absorb(id) vce(cluster prov)
boottest x, reps(9999) seed(2026) weight(webb)
只有 12 个聚类时,Rademacher 权重一共只有 种组合,boottest 会改成把这 4096 种逐一枚举,我跑的时候它还在输出里建议改用 Webb 权重,所以上面直接用了 weight(webb)。聚类稳健推断更系统的指南可以看 MacKinnon, Nielsen and Webb(2023)。
参考文献
- Abadie, A., Athey, S., Imbens, G. W., & Wooldridge, J. M. (2023). When should you adjust standard errors for clustering? Quarterly Journal of Economics, 138(1), 1–35.
- Cameron, A. C., Gelbach, J. B., & Miller, D. L. (2008). Bootstrap-based improvements for inference with clustered errors. Review of Economics and Statistics, 90(3), 414–427.
- Cameron, A. C., Gelbach, J. B., & Miller, D. L. (2011). Robust inference with multiway clustering. Journal of Business & Economic Statistics, 29(2), 238–249.
- Cameron, A. C., & Miller, D. L. (2015). A practitioner's guide to cluster-robust inference. Journal of Human Resources, 50(2), 317–372.
- Correia, S. (2015). Singletons, cluster-robust standard errors and fixed effects: A bad mix. Working paper.
- MacKinnon, J. G., Nielsen, M. Ø., & Webb, M. D. (2023). Cluster-robust inference: A guide to empirical practice. Journal of Econometrics, 232(2), 272–299.
- Petersen, M. A. (2009). Estimating standard errors in finance panel data sets: Comparing approaches. Review of Financial Studies, 22(1), 435–480.
- Roodman, D., Nielsen, M. Ø., MacKinnon, J. G., & Webb, M. D. (2019). Fast and wild: Bootstrap inference in Stata using boottest. Stata Journal, 19(1), 4–60.