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
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
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.
2. Stata实现组间均值或中位数差异检验的常见命令
ttest
:单个变量组间均值差异检验median
:单个变量组间中位数差异检验ttable2
:多个变量组间均值差异检验ttable3
:多个变量组间均值或者中位数差异检验Note:
ttest
和median
为官方命令;ttable2
和ttable3
是外部命令,需要通过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. 小结
我们分别介绍了运用ttest
、median
、ttable2
和ttable3
四个命令进行组间均值或中位数差异的检验。
- 官方命令
ttest
、median
虽然可以采用多种方法进行不同的均值或中位数检验,但无法一次性对多个变量进行批量检验;而且汇报的结果要么过于详细,要么过于精简,往往无法满足我们在论文中的呈现要求。如果我们采用复制、粘贴的方式整理表格,不仅工作量大、容易出错,还无法实现检验结果的自动化输出。如此一来,当研究样本发生微小变动之后,检验的结果也随之发生了变化,我们又要重复上述复制、粘贴的过程,这样做显然是不明智的。 -
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