Stata: 获取分组回归系数的三种方式
2020-03-07
于颂阳
15456

连享会   主页 || 推文 || 知乎 || B 站 || 在线课堂

New! 搜推文,找资料,用 lianxh 命令:
安装: ssc install lianxh, replace
使用: lianxh 合成控制
       lianxh DID + 多期, w


于颂阳(中山大学)
邮箱:nkyusongyang@163.com


目录

[[TOC]]


在回归分析中,经常需要做多分组的回归,如:分别按年度、行业进行回归。我们可以选择重复使用 regress 命令,或使用 forvaluesforeach 等循环语句实现这一需求,但当组别较多时工作将会变得非常繁复或复杂。

本文为大家总结了快捷地计算分组回归统计量的三种方式:runbyasregstatsby

本文将使用 Stata 手册中的 grunfeld 数据对三种命令进行举例说明。该数据源于 Grunfeld & Griliches (1960, "Is aggregation necessarily bad?") 。模型使用公司前期市场价值和固定资产价值两个因素解释了公司的总投资支出。样本包括了 10 家公司 1935-1954 年 20 年间的数据。

文中涉及三个核心变量:invest - 总投资支出;mvalue - 前期市场价值;kstock - 前期固定资产价值。

 

1. runby 命令

runby 命令的本质仍然是使用 forvaluesforeach 等循环语句执行分组计算。但便利之处在于我们无需书写完整的循环语句,只需提供核心计算公式即可。因此,我们首先使用 program define 语句定义一个简单的小程序,然后内嵌到 runby 语句之中。

1.1 命令简介

runby program_name , by(varlist) [ verbose useappend status allocate(#) ]

其中,program_name 为先前定义的程序,by(varlist) 用于设定分组变量,例如公司、年度、行业分类等。具体内容可参见 Stata 的 help 文件:help runby

1.2 实例:使用 runby 命令获得分组统计量和回归估计系数

以计算「每年度的平均投资支出」为例:

命令如下:

*-安装命令
. ssc install runby, replace
 *-定义程序
. capture program drop one_mean
. program define one_mean
.    egen invest_mean=mean(invest)
. end
 *-Note:选中上述程序,按快捷键 Ctrl+R 将其读入内存

*-调入数据
. webuse grunfeld, clear

*-分组计算平均投资支出
. runby one_mean, by(year)

--------------------------------------
Number of by-groups    =            20
by-groups with errors  =             0
by-groups with no data =             0
Observations processed =           200
Observations saved     =           200
--------------------------------------

结果呈现如下:

*-列示结果
. sort company
. list comp year invest* if year<1938, sepby(company)

     +------------------------------------+
     | company   year   invest   invest~n |
     |------------------------------------|
     |       1   1935    317.6     72.746 |
     |       1   1936    391.8    101.607 |
     |       1   1937    410.6    122.481 |
     |------------------------------------|
     |       2   1936    355.3    101.607 |
     |       2   1937    469.9    122.481 |
     |       2   1935    209.9     72.746 |
     |------------------------------------|
     |       3   1937     77.2    122.481 |
     |       3   1935     33.1     72.746 |
     |       3   1936       45    101.607 |
     |------------------------------------|

以计算「分年度的前期市场价值和固定资产价值估计系数」为例:

命令如下:

*-安装命令
. ssc install runby, replace

*-定义程序
. capture program drop one_reg
. program define one_reg
.    reg invest mvalue kstock, nocons
.    gen est_mvalue = _b[mvalue]
.    gen est_kstock = _b[kstock]
. end
*-Note:选中上述程序,按快捷键 Ctrl+R 将其读入内存

*-调入数据
. webuse grunfeld, clear

*-分组计算估计系数
. runby one_reg, by(year)

结果呈现如下:

*-列示结果
. sort company
. list comp year est_mvalue est_kstock if year<1938, sepby(company)

      +----------------------------------------+
     | company   year   est_mva~e   est_kst~k |
     |----------------------------------------|
     |       1   1936   .08724322     .032088 |
     |       1   1935   .10264161   .00018481 |
     |       1   1937   .07615372   .20014886 |
     |----------------------------------------|
     |       2   1937   .07615372   .20014886 |
     |       2   1935   .10264161   .00018481 |
     |       2   1936   .08724322     .032088 |
     |----------------------------------------|
     |       3   1937   .07615372   .20014886 |
     |       3   1936   .08724322     .032088 |
     |       3   1935   .10264161   .00018481 |
     |----------------------------------------|

2. asreg 命令

runby 命令根据核心计算公式进行循环的结构为我们减轻了分组统计时编程的负担,但在计算回归系数的过程中我们仍需先定义一个回归程序,然后进行分组回归。相比之下,asreg 命令更为友好,回归的循环命令可以直接进行分组回归,得到估计系数、残差和拟合值等系列变量。

2.1 命令简介

该命令的语法结构如下:

asreg depvar indepvars [if] [in] [, window(rangevar #)  ///
      noconstant recursive minimum(#) by(varlist) ///
      {statistics_options} newey(#) fmb ///
      save(file name) first]

其中,by(varlist) 用于指定分组变量,例如 by(year, industry)minimum 用于指定在分组回归中,执行每组回归所需的最小观察值数量。具体内容可参见对应的帮助文件:help asreg

2.2 实例:使用 asreg 命令获得分组回归估计系数

以计算"分年度的前期市场价值和固定资产价值估计系数"为例:

命令如下:

*-安装命令
. ssc install asreg, replace

*-调入数据
. webuse grunfeld, clear

*-分组计算估计系数
. asreg invest mvalue kstock, by(year)

结果呈现如下:

*-列示结果
. list comp year _Nobs  _adjR2 _b_mvalue _b_kstock  if year<1938, sepby(company)

     +-------------------------------------------------------+
     | company   year   _Nobs   _adjR2   _b_mva~e   _b_kst~k |
     |-------------------------------------------------------|
  1. |       1   1935      10    0.827      0.102     -0.002 |
  2. |       1   1936      10    0.610      0.084     -0.054 |
  3. |       1   1937      10    0.568      0.077      0.218 |
     |-------------------------------------------------------|
 21. |       2   1935      10    0.827      0.102     -0.002 |
 22. |       2   1936      10    0.610      0.084     -0.054 |
 23. |       2   1937      10    0.568      0.077      0.218 |
     |-------------------------------------------------------|
 41. |       3   1935      10    0.827      0.102     -0.002 |
 42. |       3   1936      10    0.610      0.084     -0.054 |
 43. |       3   1937      10    0.568      0.077      0.218 |
     |-------------------------------------------------------|

 

3. statsby 命令

statsby 命令与 runby 命令类似,同样为根据核心计算公式进行循环的结构,不同的在于 runby 命令将核心计算公式放在了自定义的程序中,而 statsby 命令中直接放在了语句结构中的 command 部分。

3.1 命令简介

该命令的语法结构如下:

statsby exp_list , by(varname): command

其中,exp_list 用于指定返回值即要统计的参数,by(varname) 同上用于指定分组变量,例如by(year, industry) , command 用于指定回归命令。具体内容可参见 Stata 的 help 文件:help statsby

3.2 实例:使用 statsby 命令获得分组回归估计系数

以计算"分年度的前期市场价值和固定资产价值估计系数"为例:

命令如下:

*-调入数据
.  webuse grunfeld, clear

*-分组计算估计系数
.  statsby, by(year): reg invest mvalue kstock

呈现结果如下:

*-列示结果
. list year _b_mvalue _b_kstock _eq2_stat_1 _eq2_stat_2

     +---------------------------------------------------+
     | year   _b_mva~e   _b_kstock   _eq2_s~1   _eq2_s~2 |
     |---------------------------------------------------|
  1. | 1935   .1024979   -.0019948    .865262   .8267655 |
  2. | 1936   .0837074   -.0536413   .6963937    .609649 |
  3. | 1937   .0765138    .2177224   .6637627   .5676949 |
  4. | 1938   .0680178    .2691146   .7055773   .6214565 |
  5. | 1939   .0655219    .1986646   .8266015   .7770591 |
     |---------------------------------------------------|
  6. | 1940    .095399    .2022906   .8392551    .793328 |
  7. | 1941   .1147638     .177465   .8562148   .8151334 |
  8. | 1942   .1428251     .071024    .857307   .8165376 |
  9. | 1943   .1186095    .1054119    .842064   .7969394 |
 10. | 1944   .1181642    .0722072    .875515   .8399478 |
     |---------------------------------------------------|
 11. | 1945   .1084709    .0502208   .9067973    .880168 |
 12. | 1946   .1379482    .0054134   .8947517   .8646807 |
 13. | 1947    .163927   -.0037072   .8912394    .860165 |
 14. | 1948   .1786673   -.0425555   .7888235   .7284874 |
 15. | 1949   .1615962   -.0369651   .8632568   .8241873 |
     |---------------------------------------------------|
 16. | 1950   .1762168   -.0220956   .8577138   .8170606 |
 17. | 1951   .1831405   -.1120569    .873773   .8377081 |
 18. | 1952   .1989208    -.067495   .8461224   .8021574 |
 19. | 1953   .1826739    .0987533   .8892606   .8576207 |
 20. | 1954   .1345116    .3313746   .8984501   .8694358 |

 

4. 总结

本文中所介绍的三种命令runbyasregstatsby 均可完成分组回归这一需求。

但在具体执行过程中,asreg 命令最为便捷,是专门用于分组回归得到特定统计量的命令,在应用过程中要注意该命令回归后返回值的变量名与regress 命令有所不同。

runby 命令与 statsby 命令类似,是对特定命令的循环执行,在进行分组回归时即是对regress 命令在不同组别的循环执行。相比asreg 命令,runby 命令与statsby 命令还可以实现除 OLS 回归外其他指定命令的循环执行,以得到特定的分组统计量。

相关资料

资源共享


尊敬的老师 / 亲爱的同学们:
连享会致力于不断优化和丰富课程内容,以确保每位学员都能获得最有价值的学习体验。为了更精准地满足您的学习需求,我们诚挚地邀请您参与到我们的课程规划中来。
请您在下面的问卷中,分享您 感兴趣的学习主题或您希望深入了解的知识领域 。您的每一条建议都是我们宝贵的资源,将直接影响到我们课程的改进和创新。
我们期待您的反馈,因为您的参与和支持是我们不断前进的动力。感谢您抽出宝贵时间,与我们共同塑造更加精彩的学习旅程!https://www.wjx.cn/vm/YgPfdsJ.aspx# 再次感谢大家宝贵的意见!


关于我们

  • Stata连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。more……
  • 扫码加入连享会微信群,提问交流更方便