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


于颂阳(中山大学)
邮箱:nkyusongyang@163.com
目录
[[TOC]]
在回归分析中,经常需要做多分组的回归,如:分别按年度、行业进行回归。我们可以选择重复使用 regress
命令,或使用 forvalues
、 foreach
等循环语句实现这一需求,但当组别较多时工作将会变得非常繁复或复杂。
本文为大家总结了快捷地计算分组回归统计量的三种方式:runby
、asreg
、statsby
。
本文将使用 Stata 手册中的 grunfeld 数据对三种命令进行举例说明。该数据源于 Grunfeld & Griliches (1960, "Is aggregation necessarily bad?") 。模型使用公司前期市场价值和固定资产价值两个因素解释了公司的总投资支出。样本包括了 10 家公司 1935-1954 年 20 年间的数据。
文中涉及三个核心变量:invest - 总投资支出;mvalue - 前期市场价值;kstock - 前期固定资产价值。
1. runby 命令
runby
命令的本质仍然是使用 forvalues
或 foreach
等循环语句执行分组计算。但便利之处在于我们无需书写完整的循环语句,只需提供核心计算公式即可。因此,我们首先使用 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. 总结
本文中所介绍的三种命令runby
、asreg
、statsby
均可完成分组回归这一需求。
但在具体执行过程中,asreg
命令最为便捷,是专门用于分组回归得到特定统计量的命令,在应用过程中要注意该命令回归后返回值的变量名与regress
命令有所不同。
而 runby
命令与 statsby
命令类似,是对特定命令的循环执行,在进行分组回归时即是对regress
命令在不同组别的循环执行。相比asreg
命令,runby
命令与statsby
命令还可以实现除 OLS 回归外其他指定命令的循环执行,以得到特定的分组统计量。
相关资料
- Stata:runby - 一切皆可分组计算!
- 盈余管理、过度投资怎么算?分组回归获取残差
- statsby: 不用循环语句的循环
- Stata:用 bytwoway 实现快速分组绘图
- Stata:各类盈余管理指标的 Stata 实现方法
- 陈强. 高级计量经济学及 stata 应用 [M]. 高等教育出版社, 2014.


资源共享
- 连享会资料 ……
- 在线视频:lianxh-class.cn
- Stata 33 讲,100 万+ 播放,Stata 入门必备,公开课
- 直击面板数据模型,10 万+ 播放,白话面板模型,公开课
- … more …
- 论文复现和数据
- 主题分类
- 热门推文

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

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