草庐IT

reghdfe:多维面板固定效应估计

a useful man 2023-09-16 原文

reghdfe:多维面板固定效应估计| 连享会主页

实证分析中,我们经常需要控制各个维度的个体效应,以便尽可能减轻 遗漏变量 导致的偏误。在最常用的二维面板数据中,我们通常会采用 xtreg y x i.year, fe 的形式来控制 公司个体效应 和 年度效应。然而,在有些情况下,我们需要对三维甚至更高维度的数据进行分析 (例如,公司-年度-高管省份-城市-行业-年度),此时,一方面要考虑估计的可行性,另一方面还需兼顾计算速度问题。

本文介绍的 reghdfe 命令可以很好地达成上述目的。reghdfe 主要用于实现多维固定效应线性回归。该命令类似于 areg 及 xtreg,fe,但允许引入多维固定效应。此外,该命令在运行速度方面远远优于 areg 及 xtreg, 因此倍受研究者青睐。

本文对该命令的介绍基于 A Feasible Estimator for Linear Models with Multi-Way Fixed Effects (Correia, 2016)。

1. 命令的安装

我们可以使用 ssc install 命令安装最新版本的 reghdfe 相关程序文件。需要特别说明的是,该命令依赖于最新版的 gtools 命令,因此,需要同时安装后者,否则执行 reghdfe 时可能会提示 错误信息

ssc install gtools, replace  
ssc install reghdfe, replace // 安装最新版命令

可以使用如下命令查看你使用的版本是否为最新版本 (如下是写作本文stata版本信息):

. which ftools
D:\stata15/ado\plus\f\ftools.ado
*! version 2.37.0 16aug2019

. which reghdfe
D:\stata15/ado\plus\r\reghdfe.ado
*! version 5.7.3 13nov2019

2. 命令的语法

该命令的具体语法如下:

reghdfe depvar [indepvars] [if] [in] [weight], absorb(absvars) [options]

其中,

  • depvar: 因变量

  • indepvars: 解释变量

  • absorb(absvars):引入固定效应
    • 可以包含多维固定效应,即 absorb (var1,var2,var3,...)。若想保存对某变量的固定效应,则运行命令absorb (var1,var2,FE3=var3) , 变量 FE3 将保存对 var3 的固定效应估计结果。

    • 可以包含不同效应间的交互影响,即absorb(var1#var2)

值得注意的是,reghdfe 允许定类变量 (categorical variable) 与连续性变量 (continuous variable) 进行交互,即 absorb(i.var1#c.var2) 。实证中很少引入这样的交互项。但如果对该问题感兴趣,可参考 Duflo (2014) 。

3. 命令的操作

这一部分用两个实证的例子介绍如何运用 reghdfe 。

3.1 估计双重差分的固定效应模型(DID)

该命令可用于估计双重差分的固定效应模型(DID)。估计 DID 模型的三个命令:regareg, 以及 xtregreghdfe 也可实现同样的估计结果,而且运行速度优于其他命令。

使用的数据请参考之前推文Stata: 双重差分的固定效应模型。该数据模拟的情况为,政策冲击发生在t=14时,对照组为i=1,控制组为i=0 。模型为y=0.3+0.19*i+1.67*d+0.56*i*d+e

. set obs 400
. gen firm=_n  ///生成企业数量
. expand 24
. bysort firm: gen t=_n  ///时间跨度设定为24个季度(6年)
. gen d=(t>=14)
. label var d "=1 if post-treatment" ///设定事件冲击发生在第14期
. gen r=rnormal()
. qui sum r, d
. bysort firm: gen i=(r>=r(p50)) if _n==1
. bysort firm: replace i=i[_n-1] if i==. & _n!=1 ///设定处理组和对照组
. drop r
. label var i "=1 if treated group, =0 if untreated group" 
. gen e = rnormal() ///设定随机变量
. label var e "normal random variable"
. gen y = 0.3 + 0.19*i + 1.67*d + 0.56*i*d + e ///模型设置

首先,回顾双重差分模型的设定形式,

其中, 为分组虚拟变量(处理组=1,控制组=0); 为分期虚拟变量(政策实施后=1,政策实施前=0);交互项  表示处理组在政策实施后的效应。   分别为个体固定效应和时间固定效应。

具体用于估计政策冲击对公司的影响的命令如下。

gen did = i*d ///生成交互项
reghdfe y did, absorb(firm t) vce(cluster firm)

变量 did 即为交互项,其系数为双重差分模型重点考察的处理效应。命令 absorb(firm t) 同时引入了公司固定效应以及时间固定效应。结果如下。

. reghdfe y did, absorb(firm t) vce(cluster firm)
(MWFE estimator converged in 2 iterations)

HDFE Linear regression                            Number of obs   =      9,600
Absorbing 2 HDFE groups                           F(   1,    399) =     175.80
Statistics robust to heteroskedasticity           Prob > F        =     0.0000
                                                  R-squared       =     0.5102
                                                  Adj R-squared   =     0.4875
                                                  Within R-sq.    =     0.0198
Number of clusters (firm)    =        400         Root MSE        =     1.0043

                                 (Std. Err. adjusted for 400 clusters in firm)
------------------------------------------------------------------------------
             |               Robust
           y |      Coef.   Std. Err.      t    P>|t|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
         did |   .5656247   .0426601    13.26   0.000     .4817581    .6494914
       _cons |   1.143579   .0084565   135.23   0.000     1.126954    1.160204
------------------------------------------------------------------------------

Absorbed degrees of freedom:
-----------------------------------------------------+

 Absorbed FE | Categories  - Redundant  = Num. Coefs |
-------------+---------------------------------------|
        firm |       400         400           0    *|
           t |        24           0          24     |
-----------------------------------------------------+
* = FE nested within cluster; treated as redundant for DoF computation

3.2 估计多维固定效应的线性模型(复制一篇 AER 论文)

这一小节将介绍如何运用 reghdfe 估计多维固定效应的线性模型。American Economic Review一篇文章,The Costs of Patronage: Evidence from the British Empire (Xu, 2018), 提供的可供复制的代码中出现了大量 reghdfe 命令。本小节介绍该作者如何用 reghdfe 命令输出其文章Table 2第六列的结果。

Source: Xu, G. (2018). The Costs of Patronage: Evidence from the British Empire. American Economic Review, 108 (11): 3170-98.

作者在这篇文章中想要探究 任命制 (patronage) 对英国 政治体系 的影响。具体于 Table2,作者意图研究社会联系(social connections) 是否会影响政府官员的工资水平。Table 2中,第六列所估计的回归为:

其中,

  • 为政府官员  于时间  在  州执政时的对数工资水平。Stata 命令中,该变量名为 log_salary_governor_gbp

  •  为虚拟变量(Dummy Variable),当政府官员与其上任官员存在社会联系时,该变量取1。如若不然,则取0。社会联系包括:共同祖先,贵族身份以及教育背景。Stata 命令中,该变量名为 connected

  •  为政府官员固定效应。该部分的设置为了解决政府官员的异质性 (heterogeneity) 问题。例如,具有较强能力的政府官员更有可能建立更多的社会关系。Stata 命令中, aid 为不同官员的 unique ID 变量。

  •  为政府官员执政时长固定效应。设置该部分是因为,执政时间的长短可能也会对社会关系产生影响。Stata 命令中, duration 为官员执政时长变量。

  •  为控制变量。作者选用了执政者在历史上执政过的州的数目。Stata 命令中,该变量名为 no_colonies 。

  •  为年份固定效应。该部分的设置是为了吸收执政者们在不同时期受到的共同时间冲击。Stata 命令中, year 为年份变量。

  •  为残差。作者使用了聚类标准误的方法。

该回归的原假设为,: 社会联系 (connected) 与政府官员的工资水平 (log_salary_governor_gbp) 无关。若 connected 的系数  不显著,则不拒绝原假设。若  显著,则拒绝原假设,并可以判定社会联系对政府官员的工资水平显著相关。

用 Stata 实现该回归的命令如下。

reghdfe log_salary_governor_gbp no_colonies connected, ///
        absorb(aid year duration) vce(cluster bilateral)

其中,absorb(aid year duration) 同时引入了官员固定效应、时间固定效应以及执政时长固定效应。

命令运行后的结果如下所示。数据请于 AER 官网 「下载」

. quietly use "analysis.dta", replace
. reghdfe log_salary_governor_gbp no_colonies connected, ///
          absorb(aid year duration) vce(cluster bilateral)
(MWFE estimator converged in 26 iterations)

HDFE Linear regression                            Number of obs   =      3,510
Absorbing 3 HDFE groups                           F(   2,   1517) =      25.45
Statistics robust to heteroskedasticity           Prob > F        =     0.0000
                                                  R-squared       =     0.9255
                                                  Adj R-squared   =     0.9109
                                                  Within R-sq.    =     0.0978
Number of clusters (bilateral) =      1,518       Root MSE        =     0.2374

                          (Std. Err. adjusted for 1,518 clusters in bilateral)
------------------------------------------------------------------------------
             |               Robust
log_salary~p |      Coef.   Std. Err.      t    P>|t|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
 no_colonies |   .2234767   .0347473     6.43   0.000     .1553189    .2916346
   connected |   .0972969   .0355508     2.74   0.006     .0275628    .1670309
       _cons |   7.485619    .065766   113.82   0.000     7.356617    7.614621
------------------------------------------------------------------------------

Absorbed degrees of freedom:
-----------------------------------------------------+
 Absorbed FE | Categories  - Redundant  = Num. Coefs |
-------------+---------------------------------------|
         aid |       456           0         456     |
        year |       110           1         109     |
    duration |         7           1           6    ?|
-----------------------------------------------------+
? = number of redundant parameters may be higher

上述结果表明,变量 connected 的系数为 0.097, 标准误为 0.036。这说明该变量在 1% 的水平上显著大于 0 。其经济学含义为,与上一任官员存在社会联系的官员,相较于无社会联系的官员,工资水平要高出 9.7%。也就是说,官员的工资水平和其社会关系显著相关。

4.结语

这篇推文主要介绍了如何在实证中运用 reghdfe。具体而言,本推文列举了两个例子。其一,为运用该命令对 DID 模型进行估计。其二,为运用该命令进行多维固定效应线性模型的估计。

文献来源

  • Correia, S. (2016). Linear Models with High-Dimensional Fixed Effects: An Efficient and Feasible Estimator, Working Paper. [PDF]

  • Duflo, E. (2004). The medium run effects of educational expansion: Evidence from a large school construction program in Indonesia. Journal of Development Economics, 74(1), 163-197. [PDF]

  • Xu, G. (2018). The Costs of Patronage: Evidence from the British Empire. American Economic Review, 108 (11): 3170-98. [PDF]  

有关reghdfe:多维面板固定效应估计的更多相关文章

  1. ruby - 在 Ruby 中将整数格式化为固定长度的字符串 - 2

    有没有一种简单的方法可以将给定的整数格式化为具有固定长度和前导零的字符串?#convertnumberstostringsoffixedlength3[1,12,123,1234].map{|e|???}=>["001","012","123","234"]我找到了解决方案,但也许还有更聪明的方法。format('%03d',e)[-3..-1] 最佳答案 如何使用%1000而不是进行字符串操作来获取最后三位数字?[1,12,123,1234].map{|e|format('%03d',e%1000)}更新:根据theTinMan的

  2. ruby - 如何在 Ruby 中获取多维哈希中的键? - 2

    因此,对于普通哈希,您可以使用它来获取key:hash.keys如何获取如下所示的多维哈希的第二维键:{""=>{"first_name"=>"test","last_name"=>"test_l","username"=>"test_user","title"=>"SalesManager","office"=>"test","email"=>"test@test.com"}}每个项目都是唯一的。所以我想从上面得到的键是:first_name,last_name,username,title,officeandemail 最佳答案

  3. ruby - 在 Ruby 中动态生成多维数组 - 2

    我正在尝试动态构建一个多维数组。我想要的基本上是这样的(为简单起见写出来):b=0test=[[]]test[b]这给了我错误:NoMethodError:undefinedmethod`test=[[],[],[]]而且它工作正常,但在我的实际使用中,我不会事先知道需要多少个数组。有一个更好的方法吗?谢谢 最佳答案 不需要像您正在使用的索引变量。只需将每个数组附加到您的test数组:irb>test=[]=>[]irb>test[["a","b","c"]]irb>test[["a","b","c"],["d","e","f"]]

  4. Unity Shader 学习笔记(5)Shader变体、Shader属性定义技巧、自定义材质面板 - 2

    写在之前Shader变体、Shader属性定义技巧、自定义材质面板,这三个知识点任何一个单拿出来都是一套知识体系,不能一概而论,本文章目的在于将学习和实际工作中遇见的问题进行总结,类似于网络笔记之用,方便后续回顾查看,如有以偏概全、不祥不尽之处,还望海涵。1、Shader变体先看一段代码......Properties{ [KeywordEnum(on,off)]USL_USE_COL("IsUseColorMixTex?",int)=0 [Toggle(IS_RED_ON)]_IsRed("IsRed?",int)=0}......//中间省略,后续会有完整代码 #pragmamulti_c

  5. ruby - 如何在 Ruby 中返回整数的固定长度二进制表示? - 2

    我知道我可以使用Fixnum#to_s将整数表示为二进制格式的字符串。但是1.to_s(2)生成1而我希望它生成00000001。我怎样才能使所有返回的字符串都以零作为填充到8个字符?我可以使用类似的东西:binary="#{'0'*(8-(1.to_s(2)).size)}#{1.to_s(2)}"if(1.to_s(2)).size但这看起来不是很优雅。 最佳答案 使用字符串格式。"%08b"%1#=>"00000001" 关于ruby-如何在Ruby中返回整数的固定长度二进制表示?

  6. ruby - 如何在ruby中制作动态多维数组? - 2

    我有一个关于多维数组的初学者ruby​​问题。我想按年份和月份对条目进行排序。所以我想创建一个包含年->月->月条目的多维数组所以数组应该是这样的:2009->08->Entry1->Entry209->Entry32007->10->Entry5现在我有:@years=[]@entries.eachdo|entry|timeobj=Time.parse(entry.created_at.to_s)year=timeobj.strftime("%Y").to_imonth=timeobj.strftime("%m").to_itmparr=[]tmparrentry}@years.pu

  7. ruby - 在ruby中获取多维数组的维度 - 2

    我刚开始学习ruby。现在我需要计算多维数组的维数。我查看了所有数组方法的ruby​​-docs,但找不到返回维度的方法。这是一个例子:对于[[1,2],[3,4],[5,6]],维度应该是2。对于[[[1,2],[2,3]],[[3,4],[5]]],维度应该是3。 最佳答案 简单的、面向对象的解决方案。classArraydefdepthmap{|element|element.depth+1}.maxendendclassObjectdefdepth0endend 关于ruby-在

  8. ruby-on-rails - 如何在与 rails 的 session 中设置多维数组 - 2

    我正在尝试做这样的事情:session[:continent][:filter]=params[:filter]但它不起作用,我收到了这个错误:Youhaveanilobjectwhenyoudidn'texpectit!YoumighthaveexpectedaninstanceofArray.Theerroroccurredwhileevaluatingnil.[]= 最佳答案 您需要先将session[:continent]初始化为Hash。试试这个:session[:continent]||={}session[:conti

  9. Ruby 固定数字大十进制舍入 - 2

    我想用ruby​​对BigDecimal进行舍入。我知道我可以使用round函数但是轮函数给出(3.2).round(2)=>3.2我要(3.2).round(2)=>3.20(3.20).round(2)=>3.20(3).round(2)=>3.00(3.578).round(2)=>3.58我总是希望有2位小数,3.20而不是3.2知道如何完成这项工作吗? 最佳答案 试试这个:'%.2f'%3.2=>"3.20"'%.2f'%3=>"3.00"'%.2f'%3.578=>"3.58"etc.

  10. ruby-on-rails - 在 Ruby 中合并多维哈希 - 2

    我有两个散列,它们的结构与此类似:hash_a={:a=>{:b=>{:c=>"d"}}}hash_b={:a=>{:b=>{:x=>"y"}}}我想将它们合并在一起以生成以下散列:{:a=>{:b=>{:c=>"d",:x=>"y"}}}合并函数会将第一个散列中的:a值替换为第二个散列中的:a值。因此,我编写了自己的递归合并函数,如下所示:defrecursive_merge(merge_from,merge_to)merged_hash=merge_tofirst_key=merge_from.keys[0]ifmerge_to.has_key?(first_key)merged_

随机推荐