查看原文
其他

Stata:runby - 一切皆可分组计算!

黄河泉,连玉君 Stata连享会 2020-02-10

作者:黄河泉 | 连玉君 (知乎 | 简书 | 码云)

Stata 现场培训报名中……

背景: 在 Stata 提供了一个高效实用的副指令 —— byable,可以让我快捷地计算分组统计量,如各行业的均值、标准差等。例如, byindustry:egen invest_mean=mean(invest),可以快速计算出每个行业的平均投资支出。然而,并不是所有的 generate 或 egen 命令提供的函数都支持 byable 副指令。此时,我们如何计算分组统计量呢?一个粗暴的方法就是使用 forvalues 或 foreach 等循环语句。其实,还有更为简洁的方法 —— 使用外部命令 runby !

1. runby 的运行原理

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

2. 使用过程释义

  • 目的: 对每家公司的投资支出进行标准化。公式为 std_x=[x-mean(x)]/sd(x)

  • 难点: 虽然可以使用 egen 命令提供的 std() 函数实现标准化转换,但却不支持 byable

  • 解决方法:

  • Step 1: 定义一个小程序,用于执行标准化转换:

  1. program define one_std    

  2.  egen invest_std = std(invest)

  3. end

程序的调用方法: (1) 如果这个程序只是偶尔用一下,可以在 dofile 中撰写上述程序,选中后按快捷键 Ctrl+R,将该程序读入 Stata 内存,随后就可以像使用一般的 Stata 命令那样使用 one_std 命令了。(2) 如果这个程序在日后会经常使用,则可以将其单独存放在一个 dofile 中,保存为 “onestd.ado” (注意:后缀是 .ado,文件的与程序名称同名),将其保存到 D:\stata15\ado\personal\myado 文件夹下(如果没有,可以执行创建),进而执行 adopath+D:\stata15\ado\personal\myado,告知 Stata:我在这里还存放了一些可执行的自编程序!设定完后,我们自行定义的 onestd 程序就是一个能够被 Stata 识别的合法程序了。

  • Step 2: 运行 runby 命令,执行分组计算: runby 是外部命令,可以执行如下命令安装之:

  1. ssc install runby, replace

然后,就可以愉快滴进行分组计算了:

  1. runby one_std, by(company)

3. 完整Stata 范例

  1. *-定义程序

  2. capture program drop one_std

  3. program define one_std    

  4.  egen invest_std = std(invest)

  5. end

  6. *-Note:选中上述程序,按快捷键 Ctrl+R 将其读入内存

  7. *-调入数据

  8. . webuse "grunfeld.dta", clear

  9. *-分组计算

  10. . runby one_std, by(company)

  11. *-列示结果

  12. . list company year invest* if year<1938, sepby(company)

  13.  +--------------------------------------+

  14.  | company   year   invest   invest_std |

  15.  |--------------------------------------|

  16.  |       1   1935    317.6   -.93812598 |

  17.  |       1   1936    391.8   -.69844231 |

  18.  |       1   1937    410.6   -.63771376 |

  19.  |--------------------------------------|

  20.  |       2   1935    209.9    -1.599489 |

  21.  |       2   1936    355.3   -.43999411 |

  22.  |       2   1937    469.9    .47388569 |

  23.  |--------------------------------------|

  24.  |       3   1935     33.1   -1.4241168 |

  25.  |       3   1936       45   -1.1791827 |

  26.  |       3   1937     77.2    -.5164199 |

  27.  |--------------------------------------|

  28.  |       4   1935    40.29   -1.0727421 |

  29.  |       4   1936    72.76   -.31277531 |

  30.  |       4   1937    66.26   -.46490908 |

  31.  |--------------------------------------|

  32.  |       5   1935    39.68   -1.4586008 |

  33.  |       5   1936    50.73   -.73004219 |

  34.  |       5   1937    74.24    .82004045 |

  35.  |--------------------------------------|

  36.  |       6   1935    20.36   -1.0029697 |

  37.  |       6   1936    25.98   -.84215578 |

  38.  |       6   1937    25.94   -.84330034 |

  39.  |--------------------------------------|

  40.  |       7   1935    24.43   -1.2647902 |

  41.  |       7   1936    23.21   -1.3313998 |

  42.  |       7   1937    32.78   -.80889688 |

  43.  |--------------------------------------|

  44.  |       8   1935    12.93   -1.5678286 |

  45.  |       8   1936     25.9   -.88913306 |

  46.  |       8   1937    35.05    -.4103309 |

  47.  |--------------------------------------|

  48.  |       9   1935    26.63   -1.0253897 |

  49.  |       9   1936    23.39   -1.2431145 |

  50.  |       9   1937    30.65   -.75524966 |

  51.  |--------------------------------------|

  52.  |      10   1935     2.54   -.31681649 |

  53.  |      10   1936        2   -.63101462 |

  54.  |      10   1937     2.19   -.52046338 |

  55.  +--------------------------------------+

关于我们

  • Stata 连享会(公众号:StataChina)】由中山大学连玉君老师团队创办,旨在定期与大家分享 Stata 应用的各种经验和技巧。

  • 公众号推文同步发布于 【简书-Stata连享会】 和 【知乎-连玉君Stata专栏】。可以在简书知乎中搜索关键词 Stata或 Stata连享会后关注我们。

  • 点击推文底部【阅读原文】可以查看推文中的链接并下载相关资料。

  • ……Stata 现场培训报名中……

联系我们

  • 欢迎赐稿: 欢迎将您的文章或笔记投稿至 Stata连享会(公众号:StataChina),我们会保留您的署名;录用稿件达 五篇以上,即可免费获得 Stata 现场培训 (初级或高级选其一) 资格。

  • 意见和资料: 欢迎您的宝贵意见,您也可以来信索取推文中提及的程序和数据。

  • 招募英才: 欢迎加入我们的团队,一起学习 Stata。合作编辑或撰写稿件五篇以上,即可免费获得 Stata 现场培训 (初级或高级选其一) 资格。

  • 联系邮件: StataChina@163.com

往期精彩推文

Stata连享会推文列表


Stata 现场培训报名中……


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存