温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。
于颂阳(中山大学)
邮箱:nkyusongyang@163.com
目录
在回归分析中,经常需要做多分组的回归,如:分别按年度、行业进行回归。我们可以选择重复使用 regress
命令,或使用 forvalues
、 foreach
等循环语句实现这一需求,但当组别较多时工作将会变得非常繁复或复杂。
本文为大家总结了快捷地计算分组回归统计量的三种方式:runby
、asreg
、statsby
。
本文将使用 Stata 手册中的 grunfeld 数据对三种命令进行举例说明。该数据源于 Grunfeld & Griliches (1960, "Is aggregation necessarily bad?") 。模型使用公司前期市场价值和固定资产价值两个因素解释了公司的总投资支出。样本包括了 10 家公司 1935-1954 年 20 年间的数据。
文中涉及三个核心变量:invest - 总投资支出;mvalue - 前期市场价值;kstock - 前期固定资产价值。
runby
命令的本质仍然是使用 forvalues
或 foreach
等循环语句执行分组计算。但便利之处在于我们无需书写完整的循环语句,只需提供核心计算公式即可。因此,我们首先使用 program define
语句定义一个简单的小程序,然后内嵌到 runby
语句之中。
runby program_name , by(varlist) [ verbose useappend status allocate(#) ]
其中,program_name
为先前定义的程序,by(varlist)
用于设定分组变量,例如公司、年度、行业分类等。具体内容可参见 Stata 的 help 文件:help 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 |
|----------------------------------------|
runby
命令根据核心计算公式进行循环的结构为我们减轻了分组统计时编程的负担,但在计算回归系数的过程中我们仍需先定义一个回归程序,然后进行分组回归。相比之下,asreg
命令更为友好,回归的循环命令可以直接进行分组回归,得到估计系数、残差和拟合值等系列变量。
该命令的语法结构如下:
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
。
以计算"分年度的前期市场价值和固定资产价值估计系数"为例:
命令如下:
*-安装命令
. 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 |
|-------------------------------------------------------|
statsby
命令与 runby
命令类似,同样为根据核心计算公式进行循环的结构,不同的在于 runby
命令将核心计算公式放在了自定义的程序中,而 statsby
命令中直接放在了语句结构中的 command
部分。
该命令的语法结构如下:
statsby exp_list , by(varname): command
其中,exp_list
用于指定返回值即要统计的参数,by(varname)
同上用于指定分组变量,例如by(year, industry)
, command
用于指定回归命令。具体内容可参见 Stata 的 help 文件:help 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 |
本文中所介绍的三种命令runby
、asreg
、statsby
均可完成分组回归这一需求。
但在具体执行过程中,asreg
命令最为便捷,是专门用于分组回归得到特定统计量的命令,在应用过程中要注意该命令回归后返回值的变量名与regress
命令有所不同。
而 runby
命令与 statsby
命令类似,是对特定命令的循环执行,在进行分组回归时即是对regress
命令在不同组别的循环执行。相比asreg
命令,runby
命令与statsby
命令还可以实现除 OLS 回归外其他指定命令的循环执行,以得到特定的分组统计量。
连享会-直播课 上线了!
http://lianxh.duanshu.com
免费公开课:
直击面板数据模型 - 连玉君,时长:1小时40分钟 Stata 33 讲 - 连玉君, 每讲 15 分钟. 部分直播课 课程资料下载 (PPT,dofiles等)
支持回看,所有课程可以随时购买观看。
专题 | 嘉宾 | 直播/回看视频 |
---|---|---|
⭐ 最新专题 ⭐ | DSGE, 因果推断, 空间计量等 | |
⭕ Stata数据清洗 | 游万海 | 直播, 2 小时,已上线 |
研究设计 | 连玉君 | 我的特斯拉-实证研究设计,-幻灯片- |
面板模型 | 连玉君 | 动态面板模型,-幻灯片- |
面板模型 | 连玉君 | 直击面板数据模型 [免费公开课,2小时] |
Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。
关于我们
课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法
等
连享会小程序:扫一扫,看推文,看视频……
扫码加入连享会微信群,提问交流更方便
✏ 连享会学习群-常见问题解答汇总:
✨ https://gitee.com/arlionn/WD