连玉君 (中山大学岭南学院金融系)
Stata连享会 主页 || 视频 || 推文
连享会-知乎推文列表
Note: 助教招聘信息请进入「课程主页」查看。
因果推断-内生性 专题 ⌚ 2020.11.12-15 主讲:王存同 (中央财经大学);司继春(上海对外经贸大学) 课程主页: https://gitee.com/arlionn/YG | 微信版
http://qr32.cn/BlTL43 (二维码自动识别)
空间计量 专题 ⌚ 2020.12.10-13 主讲:杨海生 (中山大学);范巧 (兰州大学) 课程主页: https://gitee.com/arlionn/SP | 微信版
https://gitee.com/arlionn/DSGE (二维码自动识别)
2018.4.11更新:该文已发表
连玉君, 廖俊平, 2017, 如何检验分组回归后的组间系数差异?, 郑州航空工业管理学院学报 35, 97-109. [PDF 原文下载] [PDF-万方]
2020.4.19 更新:[本文最新版]
问题:实证分析中,经常需要对比分析两个子样本组的系数是否存在差异。
例如,在公司金融领域,研究薪酬激励是否有助于提升业绩时,模型设定为:
关注的重点是系数。
我们经常把样本组分成“国有企业(SOE)”和“民营企业(PRI)”两个样本组,继而比较和是否存在差异。通常认为,民营企业的薪酬激励更有效果,即。
如果两个样本组中的模型设定是相同的,则两组之间的系数大小是可以比较的,而且这种比较在多数实证分析中都是非常必要的。
举几个例子,让诸位对这类问题有点感觉:
Cleary, S., 1999, The relationship between firm investment and financial status, Journal of Finance, 54 (2): 673-692. Tabel IV
连玉君, 彭方平, 苏治, 2010, 融资约束与流动性管理行为, 金融研究, (10): 158-171. 表2.
下面使用我在stata初级班讲座(http://www.peixun.net/view/307_detail.html;连玉君课程_视频在线学习 - 讲师介绍 - Peixun.net - Peixun.net)中的例子,列举几种方法。
调入 stata 自带的数据集 nlsw88.dta。
这份数据包含了1988年采集的 2246 个妇女的资料,包括:小时工资 wage,每周工作时数 hours, 种族 race 等变量。
我们想研究的是妇女的工资决定因素。
最为关注的是白人和黑人(相当于把原始数据分成了两个样本组:白人组和黑人组)的工资决定因素是否存在差异。
分析的重点集中于工龄(ttl_exp)和婚姻状况(married) 这两个变量的系数在两组之间是否存在显著差异。
下面是分组执行 OLS 回归的命令和结果:
sysuse "nlsw88.dta", clear
gen agesq = age*age
*-分组虚拟变量
drop if race==3
gen black = 2.race
tab black
*-删除缺漏值
global xx "ttl_exp married south hours tenure age* i.industry"
reg wage $xx i.race
keep if e(sample)
*-分组回归
global xx "ttl_exp married south hours tenure age* i.industry"
reg wage $xx if black==0
est store White
reg wage $xx if black==1
est store Black
*-结果对比
local m "White Black"
esttab `m', mtitle(`m') b(%6.3f) nogap drop(*.industry) ///
s(N r2_a) star(* 0.1 ** 0.05 *** 0.01)
结果:
------------------Table 1-------------------
(1) (2)
White Black
--------------------------------------------
ttl_exp 0.251*** 0.269***
(6.47) (4.77)
married -0.737** 0.091
(-2.31) (0.23)
south -0.813*** -2.041***
(-2.71) (-4.92)
hours 0.051*** 0.037
(3.81) (1.39)
tenure 0.025 -0.004
(0.77) (-0.09)
age 0.042 0.995
(0.03) (0.54)
agesq -0.001 -0.015
(-0.09) (-0.66)
_cons 3.333 -14.098
(0.14) (-0.39)
--------------------------------------------
N 1615.000 572.000
r2_a 0.112 0.165
--------------------------------------------
t statistics in parentheses
* p<0.1, ** p<0.05, *** p<0.01
可以看到,ttl_exp 变量在 [white 组] 和 [black 组] 的系数分别为 0.251 和 0.269, 二者都在 1% 水平上显著异于零。
问题在于:我们能说 0.269 比 0.251 大吗?
从统计意义上来看,答案显然没有那么明确(小学五年级的小朋友会觉得这根本不是个问题!)。
相对而言,若把注意力放在 married 这个变量上,或许更容易判断二者的差异是否显著。因为,_b[married]_white (白人组的 married 估计系数) 为 -0.737**,而 _b[married]_black 为 0.091 —— 前者在 5% 水平上显著为负,而后者不显著。
即便如此,我们仍然无法直接作出结论:_b[married]_white < _b[married]_black,因为二者的置信区间尚有重叠:
*----------------------------------------
* White Black
*----------------------------------------
* ttl_exp
*---------
* beta 0.251*** 0.269***
* 95% CI [0.17, 0.33] [0.16, 0.38]
*----------------------------------------
* married
*---------
* beta -0.737** 0.091
* 95% CI [-1.36, -0.11] [-0.69, 0.87]
*----------------------------------------
下面我们介绍三种检验组间系数差异的方法:
连享会 最新专题 直播
这是文献中最常用的方法,执行起来也最简单。以检验 ttl_exp 在两组之间的系数是否存在显著差异为例。引入一个虚拟变量
这是最基本的包含虚拟变量,以及虚拟变量与一个连续变量交乘项的情形。
显然,对于白人组而言,
对于黑人组, (1) 式可以写为:
由此可见,在 (1) 式中,参数
dropvars ttl_x_black marr_x_black
global xx "ttl_exp married south hours tenure age* i.industry" //Controls
gen ttl_x_black = ttl_exp*black //交乘项
reg wage black ttl_x_black $xx //全样本回归+交乘
为节省篇幅,仅列出最关键的结果如下:
reg wage black ttl_x_black $xx //全样本回归+交乘
Source | SS df MS Number of obs = 2187
------------+------------------------------ F( 20, 2166) = 17.32
Model | 10074.761 20 503.738052 Prob > F = 0.0000
Residual | 63000.2591 2166 29.0859922 R-squared = 0.1379
------------+------------------------------ Adj R-squared = 0.1299
Total | 73075.0201 2186 33.428646 Root MSE = 5.3931
-----------------------------------------------------------------------------
wage | Coef. Std. Err. t P>|t| [95% Conf. Interval]
------------+----------------------------------------------------------------
black | -.818647 .8015272 -1.02 0.307 -2.39049 .7531957
ttl_x_black | -.0181844 .0585517 -0.31 0.756 -.1330077 .0966389
ttl_exp | .2537358 .0351178 7.23 0.000 .1848676 .322604
married | -.4646649 .2530829 -1.84 0.066 -.9609756 .0316458
south | -1.127138 .2453123 -4.59 0.000 -1.60821 -.6460662
hours | .0516672 .0116886 4.42 0.000 .0287451 .0745894
tenure | .0198005 .0260971 0.76 0.448 -.0313775 .0709786
age | .1685498 1.035721 0.16 0.871 -1.862562 2.199661
agesq | -.0034668 .0131097 -0.26 0.791 -.0291756 .022242
.....
_cons | .8448605 20.39973 0.04 0.967 -39.16022 40.84994
-----------------------------------------------------------------------------
交乘项 [ttl_x_black] 的系数为 -.01818, 对应的 p-value 为 0.756,表明 [ttl_exp] 的系数在两组之间并不存在显著差异。
我们也可以不事先生成交乘项,而直接采用 stata 的因子变量表达式,得到完全相同的结果:
reg wage i.black ttl_exp i.black#c.ttl_exp $xx
或如下更为简洁的方式 (详情参见 help fvvarlist):
reg wage i.black##c.ttl_exp $xx
然而,需要特别强调的是,在上述检验过程中,我们无意识中施加了一个非常严格的假设条件:只允许变量 [ttl_exp] 的系数在两组之间存在差异,而其他控制变量(如 married, south, hours 等) 的系数则不随组别发生变化。
这显然是一个非常严格的假设。因为,从 -Table 1- 的结果来看, married, south, hours 等变量在两组之间的差异都比较明显。
为此,我们放松上述假设,允许 married, south, hours 等变量在两组之间的系数存在差异:
reg wage i.black i.black#(c.ttl_exp i.married i.south c.hours) $xx //Model 2
在这种相对灵活的设定下,[ttl_exp] 的系数为
当然,我们也可以采用更为灵活的方式:允许所有的变量在两组之间都存在系数差异(注意:所有离散变量前都要加 i. 前缀,否则将被视为连续变量进行处理(对于取值为0/1的虚拟变量,可以省略前缀 i.);连续变量则需加 c. 前缀):
global xx "c.ttl_exp married south c.hours c.tenure c.(age*) i.industry"
reg wage i.black##($xx) //Model 3
这其实就是大名鼎鼎的 Chow test (邹检验),可以用 chowtest 命令快捷地完成。
小结:
解决办法:
基本思想
顾名思义,所谓的似无相关模型(seemingly unrelated regression)其实就是表面上看起来没有关系,但实质上有关系的两个模型。这听起来有点匪夷所思。这种“实质上”的关系其实是假设白人组和黑人组的干扰项彼此相关。为了表述方便,将白人和黑人组的模型简写如下:
若假设
然而,虽然白人和黑人种族不同,但所处的社会和法律环境,面临的劳动法规都有诸多相似之处,使得二者的干扰项可能相关,即
执行完 SUR 估计后,我们就可以对两组之间的系数差异进行检验了。
从上面的原理介绍,可以看出,基于 SUR 估计进行组间系数差异检验时,假设条件比第一种方法要宽松一些:
Stata 实现方法
在 stata 中执行上述检验的步骤为:
范例如下:
*-Step1: 分别针对两个样本组执行估计
reg wage $xx if black==0
est store w //white
reg wage $xx if black==1
est store b //black
*-Step 2: SUR
suest w b
*-Step 3: 检验系数差异
test [w_mean]ttl_exp = [b_mean]ttl_exp
test [w_mean]married = [b_mean]married
test [w_mean]south = [b_mean]south
Step 2 的结果如下(为便于阅读,部分变量的系数未呈现):
. suest w b
Simultaneous results for w, b
Number of obs = 2187
-------------------------------------------------------------------------------
| Robust
| Coef. Std. Err. z P>|z| [95% Conf. Interval]
--------------+----------------------------------------------------------------
w_mean |
ttl_exp | .2505707 .0362302 6.92 0.000 .1795609 .3215805
married | -.7367238 .3486479 -2.11 0.035 -1.420061 -.0533865
south | -.8125914 .2892359 -2.81 0.005 -1.379483 -.2456994
hours | .0507118 .0126268 4.02 0.000 .0259637 .0754599
tenure | .0246063 .0289939 0.85 0.396 -.0322207 .0814333
age | .0415616 1.107902 0.04 0.970 -2.129887 2.213011
agesq | -.0014454 .0138965 -0.10 0.917 -.028682 .0257911
... ...
_cons | 3.333308 22.03159 0.15 0.880 -39.84781 46.51442
--------------+----------------------------------------------------------------
w_lnvar |
_cons | 3.4561 .0971137 35.59 0.000 3.265761 3.64644
--------------+----------------------------------------------------------------
b_mean |
ttl_exp | .2686185 .0511831 5.25 0.000 .1683015 .3689355
married | .0913607 .4050685 0.23 0.822 -.7025589 .8852804
south | -2.040701 .4252889 -4.80 0.000 -2.874252 -1.20715
hours | .0367536 .0229076 1.60 0.109 -.0081444 .0816516
tenure | -.003914 .0450917 -0.09 0.931 -.0922921 .0844641
age | .9952064 1.814351 0.55 0.583 -2.560856 4.551269
agesq | -.0153824 .0229045 -0.67 0.502 -.0602744 .0295096
_cons | -14.09831 35.40206 -0.40 0.690 -83.48508 55.28846
... ...
--------------+----------------------------------------------------------------
b_lnvar |
_cons | 3.077588 .2090237 14.72 0.000 2.667909 3.487267
-------------------------------------------------------------------------------
对上述命令和结果的简要解释如下:
执行组间系数差异检验的结果如下(Step 3):
. *-Step 3: 检验系数差异
. test [w_mean]ttl_exp = [b_mean]ttl_exp
(1) [w_mean]ttl_exp - [b_mean]ttl_exp = 0
chi2( 1) = 0.08
Prob > chi2 = 0.7735
. test [w_mean]married = [b_mean]married
(2) [w_mean]married - [b_mean]married = 0
chi2( 1) = 2.40
Prob > chi2 = 0.1213
. test [w_mean]south = [b_mean]south
(3) [w_mean]south - [b_mean]south = 0
chi2( 1) = 5.70
Prob > chi2 = 0.0169
此时,ttl_exp 在两组之间的系数差异仍然不显著,这与采用第一种方法得到的结论是一致的。在我们测试的三个变量中,只有 south 的系数在两组之间存在显著差异,对应的 p-value 为 0.0169。
使用 -bdiff- 命令
上述过程可以使用我编写的 - bdiff - 命令非常快捷的加以实现,结果的输出方式也更为清晰(在 stata 命令窗口中输入 - ssc install bdiff, replace- 可以下载最新版命令包,进而输入 - help bdiff - 查看帮助文件):
preserve
drop if industry==2 // 白人组中没有处于 Mining (industry=2) 的观察值
tab industry, gen(d) //手动生成行业虚拟变量
local dumind "d2 d3 d4 d5 d6 d7 d8 d9 d10 d11" //行业虚拟变量
global xx "c.ttl_exp married south c.hours c.tenure c.age c.agesq `dumind'"
bdiff, group(black) model(reg wage $xx) surtest
restore
结果如下:
-SUR- Test of Group (black 0 v.s 1) coeficients difference
Variables | b0-b1 Chi2 p-value
-------------+-------------------------------
ttl_exp | -0.017 0.07 0.788
married | -0.814 2.32 0.128
south | 1.238 5.80 0.016
hours | 0.014 0.28 0.597
tenure | 0.030 0.32 0.571
age | -1.027 0.23 0.629
agesq | 0.015 0.31 0.578
d2 | -2.732 1.63 0.202
d3 | -1.355 1.45 0.228
d4 | -2.708 2.23 0.135
d5 | -1.227 1.00 0.317
d6 | 0.087 0.00 0.950
d7 | -0.534 0.07 0.785
d8 | -1.316 1.26 0.261
d9 | 0.346 0.06 0.807
d10 | -1.105 0.94 0.333
d11 | -1.689 1.81 0.179
_cons | 18.770 0.20 0.652
---------------------------------------------
几点说明:
面板数据的处理方法
- suest - 不支持 -xtreg- 命令,因此无法直接将该方法直接应用于面板数据模型,如 FE 或 RE。此时,可以预先手动去除个体效应,继而对变换后的数据执行 OLS 估计,步骤如下:
举个例子:
*-SUEST test for panel data
*-数据概况
webuse "nlswork", clear
xtset idcode year
xtdes
*-对核心变量执行组内去心:去除个体效应
help center //外部命令, 下载命令为 ssc install center, replace
local y "ln_wage"
local x "hours tenure ttl_exp south"
bysort id: center `y', prefix(cy_) //组内去心
bysort id: center `x', prefix(cx_)
*-分组回归分析
reg cy_* cx_* i.year if collgrad==0 // 非大学组
est store Yes
reg cy_* cx_* i.year if collgrad==1 // 大学组
est store No
*-列示分组估计结果
esttab Yes No, nogap mtitle(Yes_Coll No_Coll) ///
star(* 0.1 ** 0.05 *** 0.01) s(r2 N)
*-似无相关估计
suest Yes No
*-组间差异检验
test [Yes_mean]cx_ttl_exp = [No_mean]cx_ttl_exp
test [Yes_mean]cx_hours = [No_mean]cx_hours
小结
连享会 - 文本分析与爬虫 - 专题视频
主讲嘉宾:司继春 || 游万海
A、基本思想
将二者的系数差异定义为
我们仍然关注 ttl_exp 变量在两组之间的系数差异。以 -Table 1- 中的结果为例,可以看到,ttl_exp 变量在 [white 组] 和 [black 组] 的系数估计值分别为 0.251 (
这里,
例如,若假设
. dis normal(-0.018) //单尾检验
.49281943
然而,我们并不知道 d 的分布特征。此时,可以对现有样本进行重新抽样,以得到经验样本 (empirical sample),进而利用经验样本构造出组间系数差异统计量 d 的经验分布 (empirical distribution),从而最终得到经验 p 值 (empirical p-value)。
下面先通过一个小例子说明 “经验 p 值” 和 “经验分布” 的概念,进而介绍使用组合检验获得 “经验 p 值” 的流程。
B、经验 p 值 (empirical p-value)
在这个小例子中,我们先随机生成一个服从标准正态分布的随机数 d,共有 10000 个观察值。这些观察值是通过模拟产生的。如果这些观察值构成的样本是通过从原始样本(原始样本是从母体中一次随机抽样,称为 “抽样样本,sample”)中二次抽样得到的,则称为 “经验样本 (empirical sample)”。
然后,我们数一下在这 10000 个随机数中,有多个是大于
preserve
clear
set obs 10000
set seed 1357
gen d = rnormal() // d~N(0,1) 服从标准正态分布的随机数
sum d, detail
count if d<-0.018
dis "Empirical p-value = " 4963/10000
restore
C、经验样本 (empirical sample)
上例中,我们假设 d 服从标准正态分布,从而可以通过 monte carlo 模拟的方式产生 10000 个观察值,这事实上是构造了一个经验样本。但多数情况下,我们并不知道 d 的分布特征,此时无法使用 monte carlo 模拟。然而,若假设抽样样本 (sample) 是从母体 (population) 中随机抽取的,则可以通过抽样样本中二次抽样得到经验样本 (empirical sample),这些经验样本也可以视为对母体的随机抽样。
若抽样过程中为无放回抽样 (sampling with no replacement),则相应的检验方法称为 “组合检验(permutation test)”;若抽样过程中为有放回抽样 (也称为可重复抽样,sampling with replacement),则对应的检验方法称为 “基于 Bootstrap 的检验”。
D、费舍尔组合检验的步骤
若
E、Stata 实现
上述过程可以使用连玉君编写的 -bdiff- 命令来实现。在命令窗口中输入 -ssc install bdiff, replace- 可以自动安装该命令。帮助文件中提供了多个范例。
先使用一个简单的例子,不考虑行业虚拟变量:
*-数据处理
sysuse "nlsw88.dta", clear
gen agesq = age*age
drop if race==3
gen black = 2.race
global xx "ttl_exp married south hours tenure age agesq"
*-检验
bdiff, group(black) model(reg wage $xx) reps(1000) detail
上述过程大约用时 13 秒,结果如下:
-Permutaion (1000 times)- Test of Group (black 0 v.s 1) coeficients difference
Variables | b0-b1 Freq p-value
-------------+-------------------------------
ttl_exp | 0.007 490 0.490
married | -0.824 920 0.080
south | 1.411 5 0.005
hours | 0.010 344 0.344
tenure | -0.006 512 0.488
age | -1.579 751 0.249
agesq | 0.022 218 0.218
_cons | 28.051 267 0.267
---------------------------------------------
可以看到,ttl_exp 的经验 p 值为 0.49,表明白人和黑人组的 ttl_exp 系数不存在显著差异;married 变量的 p 值为 0.08,我们可以在 10% 水平上拒绝原假设。细心的读者会发现,该变量对应的 Freq = 920,为什么?(答案在上面 Step 5 处)。
行业虚拟变量
若需在模型中加入虚拟变量,处理过程会稍微复杂一些。需要手动生成行业虚拟变量,并保证两个样本组中参与回归的行业虚拟变量个数相同。此外,书写命令时,不能使用通配符。(后续版本的 bdiff 命令会使用 fvunab 命令解决这些 bugs)。
*-数据预处理(可以忽略)
sysuse "nlsw88.dta", clear
gen agesq = age*age
*-分组虚拟变量
drop if race==3
gen black = 2.race
*-删除缺漏值
global xx "ttl_exp married south hours tenure age* i.industry"
qui reg wage $xx i.race
keep if e(sample)
*-生成行业虚拟变量
drop if industry==2 // 白人组中没有处于 Mining (industry=2) 的观察值
tab industry, gen(d) //手动生成行业虚拟变量
local dumind "d2 d3 d4 d5 d6 d7 d8 d9 d10 d11" //行业虚拟变量
global xx "c.ttl_exp married south c.hours c.tenure c.age c.agesq `dumind'"
*-permutation test
bdiff, group(black) model(reg wage $xx) reps(1000) detail
面板数据
若原始数据为面板数据,通常会采用 -xtreg-, -xtabond- 等考虑个体效应的方法进行估计。抽样过程必须考虑面板数据的特征。在执行 -bdiff- 命令之前,只需设定 -xtset id year-,声明数据为面板数据格式,则抽样时便会以 id (公司或省份代码) 为单位,以保持 id 内部的时序特征。
*-Panel Data (sample by cluster(id))
*-数据预处理
webuse "nlswork.dta", clear
xtset id year //声明为面板数据,否则视为截面数据
gen agesq = age*age
drop if race==3
gen black = 2.race
*-检验
global x "ttl_exp hours tenure south age agesq"
local m "xtreg ln_wage $x, fe" //模型设定
bdiff, group(black) model(`m') reps(1000) bs first detail
耗时 608 秒才完成,结果如下:
-Bootstrap (1000 times)- Test of Group (black 0 v.s 1) coeficients difference
Variables | b0-b1 Freq p-value
-------------+-------------------------------
ttl_exp | 0.011 47 0.047
hours | 0.003 58 0.058
tenure | 0.004 116 0.116
south | 0.093 14 0.014
age | -0.022 984 0.016
agesq | 0.000 45 0.045
_cons | 0.302 22 0.022
---------------------------------------------
Ho: b0(ttl_exp) = b1(ttl_exp)
Observed difference = 0.011
Empirical p-value = 0.047
解释和说明:
F、延伸阅读
关于这一方法的更为一般化的介绍参见 Efron, B., R. Tibshirani. An introduction to the bootstrap[M]. New York: Chapmann & Hall, 1993 (Section 15.2, pp.202).
如下论文使用了这一方法检验了 “投资-现金流敏感性” 分析中的组间系数差异:
Cleary, S., 1999, The relationship between firm investment and financial status, Journal of Finance, 54 (2): 673-692. (pp.684-685)
连玉君, 彭方平, 苏治, 2010, 融资约束与流动性管理行为, 金融研究, (10): 158-171. (pp.164)
其它基于 Permutation test 的检验
2018.4.11更新:该文已发表
连玉君, 廖俊平, 2017, 如何检验分组回归后的组间系数差异?, 郑州航空工业管理学院学报 35, 97-109. [PDF 原文下载]
连享会-直播课 上线了! http://lianxh.duanshu.com 免费公开课:
支持回看,所有课程可以随时购买观看。 连享会 - 文本分析与爬虫 - 专题视频 主讲嘉宾:司继春 || 游万海
连享会 - 效率分析专题 已上线:可随时购买学习+全套课件, 课程主页 已经放置板书和 FAQs 主讲嘉宾:连玉君 | 鲁晓东 | 张宁 课程主页, 微信版 https://gitee.com/arlionn/TE
Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。
关于我们
连享会小程序:扫一扫,看推文,看视频……
扫码加入连享会微信群,提问交流更方便
http://qr32.cn/BRPFg5 (二维码自动识别)