zoukankan      html  css  js  c++  java
  • 分组回归后的组间系数差异

    问题:实证分析中,经常需要对比分析两个子样本组的系数是否存在差异。
    例如,在公司金融领域,研究薪酬激励是否有助于提升业绩时,模型设定为:
    [公式]
    关注的重点是系数 [公式] 。
    我们经常把样本组分成“国有企业(SOE)”和“民营企业(PRI)”两个样本组,继而比较 [公式] 和 [公式] 是否存在差异。通常认为,民营企业的薪酬激励更有效果,即 [公式] 。

    如果两个样本组中的模型设定是相同的,则两组之间的系数大小是可以比较的,而且这种比较在多数实证分析中都是非常必要的。

    下面我们介绍三种检验组间系数差异的方法:

    1. 引入交叉项(Chow 检验)

    2. 基于似无相关模型的检验方法 (suest)

    3. 费舍尔组合检验(Permutation test)

    方法 1: 引入交叉项

    这是文献中最常用的方法,执行起来也最简单。以检验 ttl_exp 在两组之间的系数是否存在显著差异为例。引入一个虚拟变量 [公式],若某个妇女是黑人,则 [公式] ,否则 [公式]。在如下命令中,black 变量即为这里的 [公式] 。模型设定为:

    这是最基本的包含虚拟变量,以及虚拟变量与一个连续变量交乘项的情形。

    显然,对于白人组而言, [公式] ,则 (1) 式可以写为:

     对于黑人组, (1) 式可以写为:

     参数 [公式] 和 [公式] 分别反映了黑人组相对于白人组的截距和斜率差异。我们关注的是参数 [公式] ,它反映了 ttl_exp 这个变量在两个样本组中的系数差异。因此,检验 ttl_exp 在两组之间的系数是否存在显著差异就转变为 [公式]。相应的估计命令如下:

    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   //全样本回归+交乘

    交乘项 [ttl_x_black] 的系数为 -.01818, 对应的 p-value 为 0.756,表明 [ttl_exp] 的系数在两组之间并不存在显著差异。

    我们也可以不事先生成交乘项,而直接采用 stata 的因子变量表达式,得到完全相同的结果:

    reg wage i.black##c.ttl_exp $xx  

    然而,需要特别强调的是,在上述检验过程中,我们无意识中施加了一个非常严格的假设条件:只允许变量 [ttl_exp] 的系数在两组之间存在差异,而其他控制变量(如 married, south, hours 等) 的系数则不随组别发生变化。

    这显然是一个非常严格的假设。因为,从 -Table 1- 的结果来看, married, south, hours 等变量在两组之间的差异都比较明显。

    为此,我们放松上述假设,允许所有的变量在两组之间都存在系数差异(注意:所有离散变量前都要加 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)    

    方法 2: SUEST (基于似无相关模型SUR的检验)

    顾名思义,所谓的似无相关模型(seemingly unrelated regression)其实就是表面上看起来没有关系,但实质上有关系的两个模型。这听起来有点匪夷所思。这种“实质上”的关系其实是假设白人组和黑人组的干扰项彼此相关。为了表述方便,将白人和黑人组的模型简写如下:

    若假设 [公式] ,则我们可以分别对白人组和黑人组进行 OLS 估计。

    然而,虽然白人和黑人种族不同,但所处的社会和法律环境,面临的劳动法规都有诸多相似之处,使得二者的干扰项可能相关,即[公式] 。此时,对两个样本组执行联合估计(GLS)会更有效率(详见 Greene (2012, Econometric analysis, 7th ed, 292–304))。

    执行完 SUR 估计后,我们就可以对两组之间的系数差异进行检验了。

    从上面的原理介绍,可以看出,基于 SUR 估计进行组间系数差异检验时,假设条件比第一种方法要宽松一些:

    1. 其一,在估计过程中,并未预先限定白人组和黑人组各个变量的系数一定要相同,因此在 (2) 式中,我们分别用 [公式] 和 [公式] 表示白人组和黑人组各个变量的系数向量;

    2. 其二,两个组的干扰项可以有不同的分布,即 可以不同,即 [公式] , [公式] ,且允许二者的干扰项相关, [公式] 。

    stata 中执行上述检验的步骤为:

    Step 1: 分别针对白人组和黑人组进行估计(不限于OLS估计,可以执行 Logit, Tobit 等估计),存储估计结果;

    Step 2:使用 suest 命令执行 SUR 估计;

    Step 3: 使用 test 命令检验组间系数差异。

    *-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

    对上述命令和结果的简要解释如下:

    1. 白人组和黑人组的估计结果分别存储于 w 和 b 两个临时性文件中;

    2. 执行 - suest w b - 命令时,白人组和黑人组的被视为两个方程,即文的 (2a) 和 (2b) 式。Stata 会自动将两个方程对应的样本联合起来,采用 GLS 执行似无相关估计(SUR);

    3. 由于 SUR 属于多方程模型,因此需要指定每个方程的名称,在下面呈现的回归结果中,[w_mean] 和 [b_mean] 分别是白人组和黑人组各自对应的方程名称。因此,[w_mean]ttl_exp 表示白人组方程中 ttl_exp 变量的系数,而 [b_mean]ttl_exp 则表示黑人组中 ttl_exp 变量的系数。

    使用biff命令

    上述过程可以使用我编写的 - 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

    几点说明:

    • 使用 -suest- 时,允许两个样本组的解释变量个数不同。但由于一些技术上的问题尚未解决(很快可以解决掉),-bdiff- 命令要求两个样本组中的解释变量个数相同。在上例中,白人组在 Mining 行业的观察值个数为零(输入 -tab industry black- 可以查看),导致我们加入行业虚拟变量时,白人组只有 10 个行业虚拟变量,而黑人组则有 11 个行业虚拟变量。为此,在上述命令中,我使用 - drop if industry==2 - 命令删除了 Mining 行业的观察值。
    • 目前,-bdiff- 还不能很好地支持因子变量的写法 (help fvvarlist),因此上例中的行业虚拟变量不能通配符方式写成 d*,而必须写成原始模样: d2 d3 d4 d5 d6 d7 d8 d9 d10 d11。
    面板数据的处理方法

    - suest - 不支持 -xtreg- 命令,因此无法直接将该方法直接应用于面板数据模型,如 FE 或 RE。此时,可以预先手动去除个体效应,继而对变换后的数据执行 OLS 估计,步骤如下:

    • step 1: 对于固定效应模型而言,可以使用 - center - 或 - xtdata - 命令去除个体效应;对于随机效应模型而言,可以使用 - xtdata - 命令去除个体效应。
    • step 2:按照截面数据的方法对处理后的数据进行分组估计,并执行 suest 估计和组间系数检验。

    举个例子:

    *-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 
    小结
    • 相对于方法1(引入交乘项),基于 SUR 的方法更为灵活一些。在上例中,白人组和黑人组的被解释变量相同 (均为 wage),此时方法 1 和方法 2 都能用。有些情况下,两个组中的被解释变量不同,此时方法 1 不再适用,而方法 2 则可以。
    • 对于面板数据而言,可以预先使用 - center - 或 - xtdata - 命令去除个体效应,变换后的数据可以视为截面数据,使用 - regress - 命令进行估计即可。
    • 为了便于呈现结果,可以使用 - estadd - 命令将上述检验结果(chi2 值或 p值) 加入内存,进而使用 -esttab- 命令列示出来。可以参考 - help bdiff - 中的类似范例。

    新方法: 安装新版 suest 命令

    目前,可以使用 Federico Belotti. 更新后的 suest.ado 文档替换 Stata 官方提供的 suest.ado 文档。前者支持 xtreg 命令。

    替换方法为:

    • Step 1: 执行 net install suest, replace 命令,suest.ado 文件被自动安装在 stata15adopluss 文件夹中。
    • Step 2:stata15adopluss 文件夹中的 suest.ado 文件替换掉 stata15adoases 文件夹中的同名文件。

    然后就可以在完成 xtreg …… 估计后,使用 suest 命令进行组间系数差异检验了。

    help suest xtreg 出现这个ado文件, 旁边就有 click here to install

    方法 3:费舍尔组合检验 (Fisher's Permutation test)

    A. 基本思想

    将二者的系数差异定义为 [公式],检验的原假设为: [公式] 。

    我们仍然关注 ttl_exp 变量在两组之间的系数差异。以 -Table 1- 中的结果为例,可以看到,ttl_exp 变量在 [white 组] 和 [black 组] 的系数估计值分别为 0.251 ( [公式] ) 和 0.269 ( [公式] ),因此,实际观察到的系数差异为 [公式] 。

    这里, [公式] 是一个统计量,若能知道其分布特征,便可通过分析 [公式] 在 [公式] 的分布中的相对位置来判断我们实际观察到 [公式] 的概率。若概率很小,则表明 [公式] 是小概率事件,此时拒绝原假设,反之则无法拒绝原假设。

    例如,若假设 [公式] 服从标准正态分布,即 [公式] ,则基于实际观察到的 [公式] ,我们很容易得出结论:无法拒绝原假设,即两组之间的 ttl_exp 的系数不存在显著差异。p-value 很容易计算 (当然,也可以查表得到):

    . dis normal(-0.018)    //单尾检验
    .49281943

    我们并不知道 d 的分布特征。此时,可以对现有样本进行重新抽样,以得到经验样本 (empirical sample),进而利用经验样本构造出组间系数差异统计量 d 的经验分布 (empirical distribution),从而最终得到经验 p 值 (empirical p-value)。

    下面先通过一个小例子说明 “经验 p 值” 和 “经验分布” 的概念,进而介绍使用组合检验获得 “经验 p 值” 的流程。

    B. 经验P值

    在这个小例子中,我们先随机生成一个服从标准正态分布的随机数 d,共有 10000 个观察值。这些观察值是通过模拟产生的。如果这些观察值构成的样本是通过从原始样本(原始样本是从母体中一次随机抽样,称为 “抽样样本,sample”)中二次抽样得到的,则称为 “经验样本 (empirical sample)”。

    然后,我们数一下在这 10000 个随机数中,有多个是大于 [公式] (我们实际观察到的数值),命令为 count if d<-0.018。一共有 4963 个观察值大于 [公式] ,由此可得,经验 p 值 = 4963/10000 = 0.4963。这与采用 normal() 函数得到的结果 (0.4928) 非常接近。

    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. 经验样本

    上例中,我们假设 d 服从标准正态分布,从而可以通过 monte carlo 模拟的方式产生 10000 个观察值,这事实上是构造了一个经验样本。但多数情况下,我们并不知道 d 的分布特征,此时无法使用 monte carlo 模拟。然而,若假设抽样样本 (sample) 是从母体 (population) 中随机抽取的,则可以通过抽样样本中二次抽样得到经验样本 (empirical sample),这些经验样本也可以视为对母体的随机抽样。

    若抽样过程中为无放回抽样 (sampling with no replacement),则相应的检验方法称为 “组合检验(permutation test)”;若抽样过程中为有放回抽样 (也称为可重复抽样,sampling with replacement),则对应的检验方法称为 “基于 Bootstrap 的检验”。

    D. 费舍尔组合检验的步骤

    若 [公式] 是正确的,则对于任何一个妇女而言(不论她是白人还是黑人),其 x 对 y 的边际影响都是相同的。因此,我们可以将白人组和黑人组的观察值混合起来,从中随机抽取 n1 个观察值,并将其视为"白人组",剩下的 n2 个观察值可以视为“黑人组”。

    • Step 0: 分别针对白人组和黑人组估计模型 (3a) 和 (3b),得到系数估计值 [公式] 和 [公式],以及二者的系数差异 [公式] ;
    • Step 1: 将白人组和黑人组的样本混合起来,得到 n1+n2 个观察值构成的样本 S;
    • Step 2: 获得经验样本 —— 从 S 中随机抽取 (无放回) n1 个观察值,将其视为“白人组”(记为 Sw),剩下的 n2 个观察值可以视为“黑人组” (记为 Sb);
    • Step 3: 分别针对经验样本 Sw 和 Sb,估计模型 (3a) 和 (3b),得到 [公式] 和 [公式] (上标 [公式] 表示利用第一笔经验样本得到的估计值),以及二者的差异 [公式] ;
    • Step 4: 获得统计量 [公式] 的经验分布 —— 将 Step 2 和 Step 3 重复执行 [公式] 次 (如 [公式] ),则可以得到 [公式] ,亦可简记为 [公式] ;
    • Step 5: 计算 经验 p 值, [公式] ,其中 [公式] 表示 Step 4 中得到的 [公式] 个 [公式] 中大于我们实际观测到的 [公式] 的个数。若 [公式] ,则可以在5%水平上拒绝原假设,表明两组的系数差异是显著的。
    • 需要说明的是,由于 [公式] 的分布未必是对称的,因此,[公式] 与 [公式] 都可以视为在 5% 水平上拒绝原假设的证据。因为,前者意味着 [公式] 在 1000 个 [公式] 中属于非常大的数值,而后者意味着它是非常小的数值。无论如何,在原假设 [公式] 下观察到 [公式] 都是小概率事件,也就意味着原假设是不合理的。
    • 此外,该方法的并不局限于普通的线性回归模型(-regress-命令),可以应用于各种模型的估计命令,如 -xtreg-, -xtabond-, -logit-, -ivregress- 等。

    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
    • 选项 group() 中填写用于区分组别的类别变量(若有多个组,可以预先删除不参与比较的组,类似于上面的 drop if race==3 命令);
    • 选项 model() 用于设定回归模型,即上面提到的模型 (3a) 或 (3b);
    • 选项 reps(#) 用于设定抽样次数,即上文提到的 [公式] ,通常设定 1000-5000 次即可;
    • 附加 detail 选项,可以进一步列表呈现两组的实际估计系数 [公式] 和 [公式] ;

    上述过程大约用时 13 秒,结果如下:

     可以看到,ttl_exp 的经验 p 值为 0.49,表明白人和黑人组的 ttl_exp 系数不存在显著差异;married 变量的 p 值为 0.08,我们可以在 10% 水平上拒绝原假设。细心的读者会发现,该变量对应的 Freq = 920,为什么?(答案在上面 Step 5 处)。

    添加行业虚拟变量:若需在模型中加入虚拟变量,处理过程会稍微复杂一些。需要手动生成行业虚拟变量,并保证两个样本组中参与回归的行业虚拟变量个数相同。此外,书写命令时,不能使用通配符。

    *-数据预处理(可以忽略)
      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    
    • -bdiff- 命令中设定 -bs- 选项,则随机抽样为可重复抽样 (bootstrap);
    • -first- 选项便于将组间系数差异检验结果保存在内存中,方便后续使用 esttab 合并到回归结果表格中。具体使用方法参见 -help bdiff-。
    • 由于抽样过程具有随机性,因此每次检验的结果都有微小差异。在投稿之前,可以附加 -seed()- 选项,以保证检验结果的可复制性。
    • 其他选项和使用方法参阅 -help bdiff- 的帮助文件。

    小结

    • 方法1(加入交乘项)在多数模型中都可以使用,但要注意其背后的假设条件是比较严格的。若在混合回归中,只引入你关心的那个变量(ttl_exp)与分组变量 (black) 的交乘项(ttl_exp*black),则相当于假设其他控制变量在两组之间的不存在系数差异。相对保守的处理方法是:在混合估计时,引入所有变量与分组变量的交乘项,同时附加 vce(robust) 选项,以克服异方差的影响。
    • 方法2(基于 SUR 模型的检验)执行起来也比较方便,假设条件也比较宽松:允许两组中所有变量的系数都存在差异,也允许两组的干扰项具有不同的分布,且彼此相关。局限在于,有些命令无法使用 -suest- 执行联合估计,如几乎所有针对面板数据的命令都不支持(-xtreg-, -xtabond- 等)。
    • 方法3(组合检验)是三种方法中假设条件最为宽松的,只要求原始样本是从母体中随机抽取的(看似简单,但很难检验,只能靠嘴说了),而对于两个样本组中干扰项的分布,以及衡量组间系数差异的统计量 [公式] 的分布也未做任何限制。事实上,在获取经验 p 值的过程中,我们采用的是“就地取材”、“管中窥豹”的思路,并未假设 [公式] 的分布函数;另一个好处在于可以适用于各种命令,如 regress,xtreg,logit, ivregress 等,而 -suest- 则只能应用于部分命令。
    • 方法无优劣。无论选择哪种方法,都要预先审视一下是否符合这些检验方法的假设条件。
  • 相关阅读:
    记中兴软件园一个月实训(四)
    MMORPG大型游戏设计与开发(服务器 AI 逻辑设定和状态结点)
    MMORPG大型游戏设计与开发(服务器 AI 事件)
    MMORPG大型游戏设计与开发(服务器 AI 控制器)
    MMORPG大型游戏设计与开发(服务器 AI 基础接口)
    MMORPG大型游戏设计与开发(服务器 AI 概述)
    MMORPG大型游戏设计与开发(服务器 游戏场景 动态场景与副本)
    MMORPG大型游戏设计与开发(服务器 游戏场景 掉落与网络连接)
    MMORPG大型游戏设计与开发(服务器 游戏场景 搜索机)
    MMORPG大型游戏设计与开发(服务器 游戏场景 聊天管道和寻路器)
  • 原文地址:https://www.cnblogs.com/celine227/p/14903435.html
Copyright © 2011-2022 走看看