2019-05-12

Stata:如何批量实现多个变量的组间均值或中位数差异的检验?

作者:韩少真(西北大学) || 刘婉青(西北大学)

1. 问题背景

实证分析中,经常需要对比多个变量在两个子样本组中的均值或者中位数是否存在显著差异。

1.1 期刊论文示例一

在社会责任领域,研究发布社会责任报告是否会产生经济后果时,我们常常将样本划分为两组,一组为发布社会责任报告的发布组,另一组为未发布社会责任报告的未发布组。然后,我们需要对比公司特征等多个变量在发布组和未发布组之间是否存在显著差异。

[1]. Ni, X. and H. Zhang, Mandatory corporate social responsibility disclosure and dividend payouts: evidence from a quasi‐natural experiment. Accounting & Finance, 2019. 58(5): p. 1581-1612. PDF

2019-05-12_第1张图片

1.2 期刊论文示例二

2016年美国SEC对高管薪酬披露规则进行了重大修订,最核心的变化是增加了“薪酬讨论与分析”(CD&A)的内容。在研究这项披露规则改变的影响时,需要将样本区分为采用新薪酬披露规则的组和没有采用新薪酬披露规则的组,然后对比组间均值或者中位数的差异。

[2]. Ferri, F., R. Zheng and Y. Zou, Uncertainty about managers’ reporting objectives and investors’ response to earnings reports: Evidence from the 2006 executive compensation disclosures. Journal of Accounting and Economics, 2018. 66(2): p. 339-365.PDF

2019-05-12_第2张图片
image

1.3 期刊论文示例三

在研究国有企业和非国有企业在代理成本和税收计划等方面的差异时,我们需要将样本区分为国有企业组和非国有企业组,然后对比组间均值或者中位数的差异。

[3]. Bradshaw, M., G. Liao and M.S. Ma, Agency costs and tax planning when the government is a major Shareholder. Journal of Accounting and Economics, 2018.
PDF

2019-05-12_第3张图片
image

2. Stata实现组间均值或中位数差异检验的常见命令

  • ttest :单个变量组间均值差异检验

  • median :单个变量组间中位数差异检验

  • ttable2 :多个变量组间均值差异检验

  • ttable3 :多个变量组间均值或者中位数差异检验

  • Note: ttestmedian为官方命令;ttable2ttable3 是外部命令,需要通过ssc install 进行外部命令的安装,详细可见Stata: 外部命令的搜索、安装与使用。

2.1 ttest命令

我们首先介绍官方的ttest命令,它可以实现单个变量组间均值差异检验。
基本语法如下:

ttest varname  [if] [in] , by(groupvar) unequal  welch level(#) 

解释:

  • varname是要检验的数值型变量。具体通过 T 检验比较变量varname在选项by(groupvar)确定的两组之间的均值差异。
  • groupvar可以是数值型,也可以是字符串型。但在[if][in]限定的样本范围内,其分组的类别必须为两组。
  • unequal 进行非配对样本非同方差的 T 检验。
  • level(#)设置置信水平,默认的置信水平是 (95) 。

下面,我们以 Stata 内置的数据集 nlsw88.dta 为例进行演示。首先,我们想要检验工资均值在未婚组和已婚组之间的差异是否显著。

. *调用内置数据集nlsw88
. sysuse nlsw88
(NLSW, 1988 extract)

. *对married进行频数统计
. tab married

    married |      Freq.     Percent        Cum.
------------+-----------------------------------
     single |        804       35.80       35.80
    married |      1,442       64.20      100.00
------------+-----------------------------------
      Total |      2,246      100.00

. *利用ttest对单个变量wage进行组间均值差异检验
. ttest wage,by(married)

Two-sample t test with equal variances
------------------------------------------------------------------------------
   Group |     Obs        Mean    Std. Err.   Std. Dev.   [95% Conf. Interval]
---------+--------------------------------------------------------------------
  single |     804    8.080765     .223456    6.336071    7.642138    8.519392
 married |   1,442    7.591978    .1421835    5.399229    7.313069    7.870887
---------+--------------------------------------------------------------------
combined |   2,246    7.766949    .1214451    5.755523    7.528793    8.005105
---------+--------------------------------------------------------------------
    diff |            .4887873    .2531718               -.0076882    .9852627
------------------------------------------------------------------------------
    diff = mean(single) - mean(married)                           t =   1.9307
Ho: diff = 0                                     degrees of freedom =     2244

    Ha: diff < 0                 Ha: diff != 0                 Ha: diff > 0
 Pr(T < t) = 0.9732         Pr(|T| > |t|) = 0.0537          Pr(T > t) = 0.0268

其次,当我们假定未婚组和已婚组为非配对样本,且两组的样本方差不相等时,组间均值差异的 T 检验需要添加选项unequal

. *通过unequal选项进行非配对样本非同方差的检验
. ttest wage,by(married) unequal

Two-sample t test with unequal variances
------------------------------------------------------------------------------
   Group |     Obs        Mean    Std. Err.   Std. Dev.   [95% Conf. Interval]
---------+--------------------------------------------------------------------
  single |     804    8.080765     .223456    6.336071    7.642138    8.519392
 married |   1,442    7.591978    .1421835    5.399229    7.313069    7.870887
---------+--------------------------------------------------------------------
combined |   2,246    7.766949    .1214451    5.755523    7.528793    8.005105
---------+--------------------------------------------------------------------
    diff |            .4887873     .264856               -.0307541    1.008329
------------------------------------------------------------------------------
    diff = mean(single) - mean(married)                           t =   1.8455
Ho: diff = 0                     Satterthwaite's degrees of freedom =   1452.2

    Ha: diff < 0                 Ha: diff != 0                 Ha: diff > 0
 Pr(T < t) = 0.9674         Pr(|T| > |t|) = 0.0652          Pr(T > t) = 0.0326

最后,还可以通过设定level选项为level(99),将置信水平更改为 99%。

. *通过level选项更改置信水平为99%
. ttest wage,by(married) unequal level(99)

Two-sample t test with unequal variances
------------------------------------------------------------------------------
   Group |     Obs        Mean    Std. Err.   Std. Dev.   [99% Conf. Interval]
---------+--------------------------------------------------------------------
  single |     804    8.080765     .223456    6.336071     7.50381    8.657721
 married |   1,442    7.591978    .1421835    5.399229    7.225252    7.958704
---------+--------------------------------------------------------------------
combined |   2,246    7.766949    .1214451    5.755523    7.453861    8.080037
---------+--------------------------------------------------------------------
    diff |            .4887873     .264856               -.1943345    1.171909
------------------------------------------------------------------------------
    diff = mean(single) - mean(married)                           t =   1.8455
Ho: diff = 0                     Satterthwaite's degrees of freedom =   1452.2

    Ha: diff < 0                 Ha: diff != 0                 Ha: diff > 0
 Pr(T < t) = 0.9674         Pr(|T| > |t|) = 0.0652          Pr(T > t) = 0.0326

Note:

  • ttest命令每次只能对一个变量进行检验,无法批量对多个变量进行检验。
  • ttest命令汇报的检验结果过于详细。我们在论文中只需要汇报一个相对精简的结果,如两组各自的均值、均值的差异、T 统计量或者 p 值。
  • 当待检验的变量数量增加时,ttest命令的使用会大大增加我们复制、粘贴等手工处理的工作量。

2.2 median命令

median同样为 Stata 的官方命令,基本语法如下:

median varname [if] [in] [weight] , by(groupvar) [median_options] 

解释:

  • median命令的基本语法和使用方法与ttest命令很相似,它们都是比较变量varname在选项by(groupvar)确定的两组之间的差异。
  • exact 计算 Fisher's exact test 下的显著性水平。
  • medianties(below|above|drop|split)可以对等于中位数的样本进行不同的处理。

下面,我们仍以 Stata 内置的数据集 nlsw88.dta 为例进行演示。首先,我们想要检验未婚组和已婚组的工资中位数差异是否显著。从检验结果可以发现, Pearson chi2 为 0.6277,p 值为 0.428 ,无法拒绝两组工资中位数相同的原假设。

. *利用median对单个变量wage进行组间中位数差异检验
. median wage,by(married)

Median test

   Greater |
  than the |        married
    median |    single    married |     Total
-----------+----------------------+----------
        no |       393        730 |     1,123 
       yes |       411        712 |     1,123 
-----------+----------------------+----------
     Total |       804      1,442 |     2,246 

          Pearson chi2(1) =   0.6277   Pr = 0.428

   Continuity corrected:
          Pearson chi2(1) =   0.5599   Pr = 0.454

我们可以通过添加exact选项,计算 Fisher's exact test 方法下的显著性水平,结果依然是不显著的。

. *通过exact选项计算Fisher's exact test方法下的显著性水平
. median wage,by(married) exact

Median test

   Greater |
  than the |        married
    median |    single    married |     Total
-----------+----------------------+----------
        no |       393        730 |     1,123 
       yes |       411        712 |     1,123 
-----------+----------------------+----------
     Total |       804      1,442 |     2,246 

          Pearson chi2(1) =   0.6277   Pr = 0.428
           Fisher's exact =                 0.454
   1-sided Fisher's exact =                 0.227

   Continuity corrected:
          Pearson chi2(1) =   0.5599   Pr = 0.454

Note:

  • median命令虽然进行了中位数差异的检验,但并没有汇报两组各自的中位数及其差异。这与我们在期刊论文中要求的汇报结果有一定差异。
  • median命令每次只能对一个变量进行检验,无法披露对多个变量进行检验,也面临着复制、粘贴等手工整理结果的困扰。

2.3 ttable2命令

这是由连玉君老师编写的外部命令,基本语法和使用方法和ttest非常相似,但可以批量对多个变量进行组间均值差异检验。
基本语法如下:

ttable2 varlist [if] [in], by(groupvar) format(%fmt)

解释:

  • varlist是要检验的数值型变量的列表。该命令运用标准的t检验来比较varlist的均值在选项by(groupvar)指定的两组之间的均值差异。
  • groupvar可以是数值型,也可以是字符串型。但在[if][in]限定的样本范围内,其分组的类别必须为两组。
  • format选项可以控制检验结果的输出格式。

比如,我们想要对比已婚组和未婚组在 wage ttl_exp tenure age 四个变量上的均值差异。具体操作如下:

. *利用ttable2对多个变量进行组间均值差异检验
. ttable2 wage ttl_exp tenure age , by(married)

--------------------------------------------------------------------------
Variables   G1(single)       Mean1     G2(married)    Mean2      MeanDiff
--------------------------------------------------------------------------
wage          804             8.081       1442         7.592      0.489*
ttl_exp       804            12.920       1442        12.320      0.600***
tenure        799             6.254       1432         5.824      0.431*
age           804            39.219       1442        39.117      0.102
--------------------------------------------------------------------------

我们还可以通过format选项控制检验结果输出的显示格式。比如,将其设置为format(%6.2f),可以将小数位的显示控制为小数点后 2 位。

. *通过format选项控制显示格式
. ttable2 wage ttl_exp tenure age , by(married) format(%6.2f)

--------------------------------------------------------------------------
Variables   G1(single)       Mean1     G2(married)    Mean2      MeanDiff
--------------------------------------------------------------------------
wage          804            8.08         1442        7.59       0.49*
ttl_exp       804           12.92         1442       12.32       0.60***
tenure        799            6.25         1432        5.82       0.43*
age           804           39.22         1442       39.12       0.10
--------------------------------------------------------------------------

有些时候,我们面对的组别大于 2 类。我们需要将其中一组设置为基准组,然后分别对比其他组和基准组在多个变量上的均值差异。此时,可以用[if][in]限定样本范围的方式来实现。
比如,我们想要分别对比黑种人(black)和其他有色人种(other)与白种人(white)在多个变量上的均值差异。此时,race 的组别包括 1(white)、 2(black)和 3(other)三种。而by(groupvar)在执行检验的时候只能为两组。我们可以通过 if race == 1 | race == 2 限定样本范围为指定的1(white) 和 2(black)两组。

. *对race进行频数统计
. tab race

       race |      Freq.     Percent        Cum.
------------+-----------------------------------
      white |      1,637       72.89       72.89
      black |        583       25.96       98.84
      other |         26        1.16      100.00
------------+-----------------------------------
      Total |      2,246      100.00

. *通过if设定样本范围,比较白人和黑人的均值差异
. ttable2 wage ttl_exp tenure age if race==1 | race==2, by(race)

--------------------------------------------------------------------------
Variables   G1(white)        Mean1     G2(black)      Mean2      MeanDiff
--------------------------------------------------------------------------
wage          1637            8.083       583          6.845      1.238***
ttl_exp       1637           12.469       583         12.719     -0.250
tenure        1627            5.808       578          6.502     -0.693***
age           1637           39.272       583         38.811      0.461***
--------------------------------------------------------------------------

. *通过if设定样本范围,比较白人和其他人种的均值差异
. ttable2 wage ttl_exp tenure age if race==1 | race==3, by(race)

--------------------------------------------------------------------------
Variables   G1(white)        Mean1     G2(other)      Mean2      MeanDiff
--------------------------------------------------------------------------
wage          1637            8.083       26           8.551     -0.468
ttl_exp       1637           12.469       26          12.599     -0.130
tenure        1627            5.808       26           4.949      0.860
age           1637           39.272       26          39.308     -0.035
--------------------------------------------------------------------------

Note:

  • ttable3可以批量对多个变量进行检验。
  • ttable3的输出结果添加了标识显著性水平的*号,显示格式可以通过format()选项控制,基本接近期刊论文的要求。
  • ttable3只能进行标准的 T 检验,无法执行非匹配样本非同方差的 T 检验。
  • ttable3无法输出进行统计推断的 t 统计量或者 p 值,这与期刊论文的要求有差异。

2.4 ttable3命令

ttable3也是由连玉君老师编写的外部命令,它不仅可以实现组间均值差异的检验,还可以实现组间中位数差异的检验。
基本语法如下:

ttable3 varlist [if] [in], by(groupvar) ///
[ format(%fmt) unequal welch median rowname notitle nostar tvalue pvalue ]

ttable3命令的基本语法和使用方法和ttable2命令基本一样。只不过由于是ttable2命令的升级版,所以增加了一些新的选项,功能更为强大,使用也更加灵活。这些新的选项主要包括:

  • median 选项将默认的组间均值差异检验更换为组间中位数差异检验。如果不添加 median 选项,则默认执行组间均值差异检验。
  • unequel 选项将在非配对样本和非同方差的假设下进行均值差异检验。需要注意的是,该选项只能在均值差异的 T 检验中设定。如果是中位数差异检验,该选项是不可以设定。
  • tvalue/pvalue 选项控制结果表格中的t-value或者p-value。需要注意的是,这两个选项不能同时添加。我们只能选择报告t-value或者p-value中的一个。
  • notitle 选项将检验结果表格的标题去除掉。这有助于使用logout命令将结果导出到 word 或者 excel 文件中。
  • nostar 选项将结果表格中表示显著性水平的符号*去除掉。如果不添加 nostar 选项,则默认以符号*标记显著性水平。

下面,我们还是以 nlsw88.dta 数据集为例,演示一下ttable3命令的使用。
我们首先分别使用ttable2命令和ttable3命令,对比已婚组和未婚组在 wage ttl_exp tenure age 四个变量上的均值差异,检验的结果是一模一样的。

. *首先,用ttable2实现组间均值差异检验
. ttable2 wage ttl_exp tenure age , by(married)

--------------------------------------------------------------------------
Variables   G1(single)       Mean1     G2(married)    Mean2      MeanDiff
--------------------------------------------------------------------------
wage          804             8.081       1442         7.592      0.489*
ttl_exp       804            12.920       1442        12.320      0.600***
tenure        799             6.254       1432         5.824      0.431*
age           804            39.219       1442        39.117      0.102
--------------------------------------------------------------------------

. *然后,用ttable3实现组间均值差异检验
. ttable3 wage ttl_exp tenure age , by(married)

Two-sample t test with equal variances
--------------------------------------------------------------------------
Variables   G1(single)       Mean1     G2(married)    Mean2      MeanDiff   
--------------------------------------------------------------------------
wage          804             8.081       1442         7.592      0.489*
ttl_exp       804            12.920       1442        12.320      0.600***
tenure        799             6.254       1432         5.824      0.431*
age           804            39.219       1442        39.117      0.102
--------------------------------------------------------------------------

然后,我们为ttable3命令添加median选项,将组间均值差异检验更换为中位数差异检验。

. *添加media选项,进行组间中位数差异检验
. ttable3 wage ttl_exp tenure age , by(married) media

Nonparametric equality-of-medians test
--------------------------------------------------------------------------
Variables   G1(single)       Median1   G2(married)    Median2    Diff       
--------------------------------------------------------------------------
wage          804          6.357         1442       6.216       0.628
ttl_exp       804         13.625         1442      12.833       8.958***
tenure        799          3.833         1432       3.750       0.063
age           804         39.000         1442      39.000       0.357
--------------------------------------------------------------------------

最后,我们还可以通过控制其它选项来对结果表格进行调整。

. *添加tvalue选项,为结果添加t_value
. ttable3 wage ttl_exp tenure age , by(married) tvalue

Two-sample t test with equal variances
------------------------------------------------------------------------------------
Variables   G1(single)       Mean1     G2(married)    Mean2      MeanDiff   t-Value
------------------------------------------------------------------------------------
wage          804             8.081       1442         7.592      0.489      1.931*
ttl_exp       804            12.920       1442        12.320      0.600      2.964***
tenure        799             6.254       1432         5.824      0.431      1.771*
age           804            39.219       1442        39.117      0.102      0.760
------------------------------------------------------------------------------------

. *添加pvalue选项,为结果添加p_value
. ttable3 wage ttl_exp tenure age , by(married) pvalue

Two-sample t test with equal variances
------------------------------------------------------------------------------------
Variables   G1(single)       Mean1     G2(married)    Mean2      MeanDiff   p-Value
------------------------------------------------------------------------------------
wage          804             8.081       1442         7.592      0.489      0.054*
ttl_exp       804            12.920       1442        12.320      0.600      0.003***
tenure        799             6.254       1432         5.824      0.431      0.077*
age           804            39.219       1442        39.117      0.102      0.447
------------------------------------------------------------------------------------

. *添加notitle选项,将标题删除
. ttable3 wage ttl_exp tenure age , by(married) notitle
--------------------------------------------------------------------------
Variables   G1(single)       Mean1     G2(married)    Mean2      MeanDiff   
--------------------------------------------------------------------------
wage          804             8.081       1442         7.592      0.489*
ttl_exp       804            12.920       1442        12.320      0.600***
tenure        799             6.254       1432         5.824      0.431*
age           804            39.219       1442        39.117      0.102
--------------------------------------------------------------------------

. *添加nostar选项,将*号删除
. ttable3 wage ttl_exp tenure age , by(married) nostar

Two-sample t test with equal variances
--------------------------------------------------------------------------
Variables   G1(single)       Mean1     G2(married)    Mean2      MeanDiff   
--------------------------------------------------------------------------
wage          804             8.081       1442         7.592      0.489
ttl_exp       804            12.920       1442        12.320      0.600
tenure        799             6.254       1432         5.824      0.431
age           804            39.219       1442        39.117      0.102
--------------------------------------------------------------------------

3. 小结

我们分别介绍了运用ttestmedianttable2ttable3四个命令进行组间均值中位数差异的检验。

  • 官方命令ttestmedian
    虽然可以采用多种方法进行不同的均值或中位数检验,但无法一次性对多个变量进行批量检验;而且汇报的结果要么过于详细,要么过于精简,往往无法满足我们在论文中的呈现要求。如果我们采用复制、粘贴的方式整理表格,不仅工作量大、容易出错,还无法实现检验结果的自动化输出。如此一来,当研究样本发生微小变动之后,检验的结果也随之发生了变化,我们又要重复上述复制、粘贴的过程,这样做显然是不明智的。
  • ttable2命令能够批量对多个变量进行组间均值差异检验,检验结果的输出与大多数期刊论文的要求基本一致。但是,ttable2只能执行标准的均值差异 T 检验,无法执行非配对样本非同方差下的 T 检验。ttable2也无法汇报 检验的 t 统计量或者 p 值。此外,ttable2也无法进行组间均值中位数差异检验。
  • ttable3命令是ttable2的升级版。它增加了组间中位数差异检验的功能。对于组间均值差异的 T 检验,ttable3还可以执行非配对样本非同方差下的检验。此外,ttable3还增加了一些新的选项实现更为灵活的功能。比如,通过tvalue或者pvalue选项汇报检验的 t 统计量或者 p 值。

本文所有的检验语句如下:

*ttest命令
*调用内置数据集nlsw88
sysuse nlsw88
*对married进行频数统计
tab married
*利用ttest对单个变量wage进行组间均值差异检验
ttest wage,by(married)
*通过unequal选项进行非配对样本非同方差的检验
ttest wage,by(married) unequal
*通过level选项更改置信水平为99%
ttest wage,by(married) unequal level(99)

*median命令
*利用median对单个变量wage进行组间中位数差异检验
median wage,by(married)
*通过exact选项计算Fisher's exact test方法下的显著性水平
median wage,by(married) exact

*ttable2 命令
*利用ttable2对多个变量进行组间均值差异检验
ttable2 wage ttl_exp tenure age , by(married)
*通过format选项控制显示格式
ttable2 wage ttl_exp tenure age , by(married) format(%6.2f)
*对race进行频数统计
tab race
*通过if设定样本范围,比较白人和黑人的均值差异
ttable2 wage ttl_exp tenure age if race==1 | race==2, by(race)
*通过if设定样本范围,比较白人和其他人种的均值差异
ttable2 wage ttl_exp tenure age if race==1 | race==3, by(race)

*ttable3 命令
*首先,用ttable2实现组间均值差异检验
ttable2 wage ttl_exp tenure age , by(married)
*然后,用ttable3实现组间均值差异检验
ttable3 wage ttl_exp tenure age , by(married)
*添加media选项,进行组间中位数差异检验
ttable3 wage ttl_exp tenure age , by(married) media
*添加tvalue选项,为结果添加t_value
ttable3 wage ttl_exp tenure age , by(married) tvalue
*添加pvalue选项,为结果添加p_value
ttable3 wage ttl_exp tenure age , by(married) pvalue
*添加notitle选项,将标题删除
ttable3 wage ttl_exp tenure age , by(married) notitle
*添加nostar选项,将*号删除
ttable3 wage ttl_exp tenure age , by(married) nostar

你可能感兴趣的:(2019-05-12)