# Stata: 获取分组回归系数的三种方式

Stata 连享会   主页 || 视频 || 推文

## 1. runby 命令

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

### 1.1 命令简介

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

### 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]
``````

### 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
``````

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

## 相关课程

http://lianxh.duanshu.com

### 课程一览

Stata数据清洗 游万海 直播, 2 小时，已上线

Note: 部分课程的资料，PPT 等可以前往 连享会-直播课 主页查看，下载。

#### 关于我们

• Stata连享会 由中山大学连玉君老师团队创办，定期分享实证分析经验。直播间 有很多视频课程，可以随时观看。
• 连享会-主页知乎专栏，300+ 推文，实证分析不再抓狂。
• 公众号推文分类： 计量专题 | 分类推文 | 资源工具。推文分成 内生性 | 空间计量 | 时序面板 | 结果输出 | 交乘调节 五类，主流方法介绍一目了然：DID, RDD, IV, GMM, FE, Probit 等。
• 公众号关键词搜索/回复 功能已经上线。大家可以在公众号左下角点击键盘图标，输入简要关键词，以便快速呈现历史推文，获取工具软件和数据下载。常见关键词：`课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法`

✏ 连享会学习群-常见问题解答汇总：
https://gitee.com/arlionn/WD