statsby: 不用循环语句的循环-经管之家官网!

人大经济论坛-经管之家 收藏本站
您当前的位置> 考研考博>>

考研

>>

statsby: 不用循环语句的循环

statsby: 不用循环语句的循环

发布:arlionn | 分类:考研

关于本站

人大经济论坛-经管之家:分享大学、考研、论文、会计、留学、数据、经济学、金融学、管理学、统计学、博弈论、统计年鉴、行业分析包括等相关资源。
经管之家是国内活跃的在线教育咨询平台!

经管之家新媒体交易平台

提供"微信号、微博、抖音、快手、头条、小红书、百家号、企鹅号、UC号、一点资讯"等虚拟账号交易,真正实现买卖双方的共赢。【请点击这里访问】

提供微信号、微博、抖音、快手、头条、小红书、百家号、企鹅号、UC号、一点资讯等虚拟账号交易,真正实现买卖双方的共赢。【请点击这里访问】

 作者:胡雨霄(伦敦政治经济学院) Stata连享会:知乎|简书|码云|CSDN Stata连享会计量专题||精品课程||推文集锦 Note:本文根据连玉君老师的Stata初级班讲义A1_intro.do整理而得。本篇推文介 ...
扫码加入财会交流群



作者:胡雨霄 (伦敦政治经济学院)

Stata 连享会: 知乎 | 简书 | 码云 | CSDN

Stata连享会 计量专题 || 精品课程 || 推文集锦

点击查看完整推文列表

Note:本文根据连玉君老师的 Stata 初级班讲义 A1_intro.do 整理而得。

本篇推文介绍命令 statsby,该命令被广泛用于分组汇报单值 (scalar) 或者系数。

1. statsby 命令简介

顾名思义,statsby 就是分组 (bysort) 进行统计分析 (statstics)。它是 Stata 的官方命令,能够高效快捷地实现多种循环计算和统计功能。

在介绍 statsby 命令前,先简要介绍如下两个概念,作为铺垫,以便更好理解 statsby 命令。

Stata 中的返回值

Stata 中多数命令都以计算和统计分析为主要目的。命令执行后,除了在屏幕上以表格或图形的方式呈现一些核心结果,内存中还保留了大量的结果。这些结果统称为返回值,包括 统计量 (如 样本数,R-square,F 统计量等)、文件路径、命令名称,甚至还包括 矩阵 和 函数 等。这些返回值可以很方便地在后续程序中调用。

若希望对返回值有更为全面的了解,可以在 Stata 命令窗口中输入 help stored_results 以及 help return

Stata 命令主要可以分为四种类型:(1)r-class 与模型估计无关的命令,如,summary; (2)e-class 与模型估计有关的命令,如,regress;(3)s-class 其他命令,如,list;(4)c-class 存储系统参数。

相应地,显示留存值的方法也分别为:return list, ereturn list, sreturn list, 以及 creturn list

留存值也可分为四种类型:(1) 单值,如,r(mean), r(max), r(N), e(r2), e(F);(2) 矩阵,如,e(b), e(V);(3) 暂元,如,e(cmd), e(depvar); (4) 函变量,如,e(sample)

举两个简单的例子 (受限于篇幅,仅展示部分结果):

例1:return list

. sysuse "auto.dta", clear
. summarize price
    Variable |        Obs        Mean    Std. Dev.       Min        Max
-------------+---------------------------------------------------------
       price |         74    6165.257    2949.496       3291      15906

. dis "方差 (price) = " r(Var)
方差 (price) = 8699526

. dis "range: `r(max)', `r(min)'"  // 放在双引号中的返回值,需要使用暂元方式引用
range: 15906, 3291

. return list   // 列示所有返回值,请找找对应关系
scalars:
                  r(N) =  74
              r(sum_w) =  74
               r(mean) =  6165.256756756757
                r(Var) =  8699525.974268789
                 r(sd) =  2949.495884768919
                r(min) =  3291
                r(max) =  15906
                r(sum) =  456229

例2:ereturn list

. sysuse "auto.dta", clear

. reg price weight mpg

. matrix list e(V) // 列示系数的方差-协方差矩阵
symmetric e(V)[3,3]
            weight         mpg       _cons
weight   .41133468
   mpg   44.601659    7422.863
 _cons  -2191.9032  -292759.82    12938766

. ereturn list     // 列示所有返回值。Note:这里仅列出了一部分
scalars:
                  e(N) =  74
                  e(F) =  14.73981538538409
                 e(r2) =  .2933891231947527
                e(rss) =  448744116.3821706
               e(r2_a) =  .2734845914537599

macros:
            e(cmdline) : "regress price weight mpg"
              e(title) : "Linear regression"
             e(depvar) : "price"
                e(cmd) : "regress"
          e(estat_cmd) : "regress_estat"

matrices:
                  e(b) :  1 x 3
                  e(V) :  3 x 3

functions:
             e(sample)   

Stata 循环语句

相关介绍请参照推文 「普林斯顿Stata教程 - Stata编程」。

statsby 的语法格式

statsby 命令的基本语法十分简单。

statsby [exp_list], by(varlist): command

其中,by(varlist) 用于设定分组变量,例如 公司代码、行业分类等。[exp_list] 用于指定返回值。

连享会计量方法专题……

2. 实例 1:输出 r-class 留存值

sysuse auto, clear
statsby mean=r(mean) sd=r(sd) size=r(N), by(rep78): summarize mpg

statsby 命令保存了不同 rep78 组别中 mpg 变量的平均值 (mean)、标准差 (sd) 以及观察值个数 (N)。

. list

     +------------------------------------+
     | rep78       mean         sd   size |
     |------------------------------------|
  1. |     1         21    4.24264      2 |
  2. |     2     19.125   3.758324      8 |
  3. |     3   19.43333   4.141325     30 |
  4. |     4   21.66667    4.93487     18 |
  5. |     5   27.36364   8.732385     11 |
     +------------------------------------+

上述命令等价于如下基于 forvalues 命令编写的循环语句:

sysuse "auto.dta", clear

forvalues i =1/5{
  qui summarize mpg if rep78==`i'  // 第 i 组
  dis          "`i'"           ///
      _col(4)  "mean=" r(mean) /// // 在第 4 列列示结果
	  _col(20) "sd="   r(sd)   ///
	  _col(40) "N="    r(N)
}

输出结果如下:

1  mean=21         sd=4.2426407        N=2
2  mean=19.125     sd=3.7583241        N=8
3  mean=19.433333  sd=4.1413252        N=30
4  mean=21.666667  sd=4.9348699        N=18
5  mean=27.363636  sd=8.7323849        N=11

显然,使用 forvalues 语句不但语法繁琐,输出结果也不容易控制。

2. 实例 2:输出不同组别的估计系数

实例 1 所介绍的 statsby 命令的应用其实并不常用。一个更具有实证价值的应用为输出不同组别的系数。 Opler et al. (1999, JFE, [PDF]) 中图 3 的绘制就是一个很好的例子。

coefficient.png

该文研究资本结构的动态调整速度。动态资本结构理论认为企业的最优资本结构并不是固定的股权债务比例,而是一个变化的股权债务比例范围,企业设定目标资本结构,并依据各种条件的变化不断地进行着资本结构的调整。

其基本模型为:

yityi,t1=λ(yityi,t1)y_{it}-y_{i,t-1}=\lambda(y^*_{it}-y_{i,t-1})

yit=θxity^*_{it}=\theta x_{it}

yity_{it} 为公司 iitt 期的资本结构,yity^*_{it} 为目标资本结构。我们可以将 λ\lambda 理解为每家公司的调整系数。

设定数据模拟情形

yit=0.6yi,t1+1.3xit+ai+eity_{it}=0.6*y_{i,t-1}+1.3*x_{it}+a_i+e_{it}

xit=0.2xi,t1+vitx_{it}=0.2*x_{i,t-1}+v_{it}

corr(xit,ai)=1corr(x_{it},a_i) = 1

命令如下:

 xtarsim y x eta, n(1000) t(10) gamma(0.6) beta(1.3) rho(0.2) ///
                    one(corr 3) sn(9) seed(1234) 

数据结构如下

. list in 1/10

     +--------------------------------------------------+
     | ivar   tvar           y            x         eta |
     |--------------------------------------------------|
  1. |    1      1   13.862633    2.5646089   2.6616445 |
  2. |    1      2   8.3913755   -2.0077635   2.6616445 |
  3. |    1      3   11.940121    2.6233153   2.6616445 |
  4. |    1      4    14.46718    3.0163007   2.6616445 |
  5. |    1      5   10.069268   -.78471857   2.6616445 |
     |--------------------------------------------------|
  6. |    1      6   12.524141    2.3777554   2.6616445 |
  7. |    1      7   14.268779    2.3195181   2.6616445 |
  8. |    1      8   15.289451    2.9322523   2.6616445 |
  9. |    1      9   10.236962   -1.5005251   2.6616445 |
 10. |    1     10   8.8389802    .74967746   2.6616445 |
     +--------------------------------------------------+

接下来,运用 statsby 命令估计每家公司的调整系数

xtset ivar tvar
statsby _b[L.D.y], by(ivar) saving("$D\Lev_speed", replace): ///
            reg D.y L.D.y

该命令将回归 reg D.y L.D.y 的系数(_b[L.D.y])存储在新数据集中。为了输出 Opler et al. (1999, JFE, [PDF]) 图 3 类似的图形,采取如下的命令。

use "$D\Lev_speed.dta", clear
    rename _stat_1 speed
    sum speed, d
    histogram speed

speed 表示资本动态结构调整的速度,其描述性统计结果如下。

.         sum speed, d

                          _b[L.D.y]
-------------------------------------------------------------
      Percentiles      Smallest
 1%    -.8351784      -1.170866
 5%    -.6367424      -1.130177
10%    -.5305484      -1.103174       Obs               1,000
25%    -.3444118      -1.017748       Sum of Wgt.       1,000

50%    -.1253898                      Mean          -.1340506
                        Largest       Std. Dev.      .3053147
75%      .063599       .7306181
90%     .2565345       .7385662       Variance       .0932171
95%     .3583316       .7686451       Skewness      -.0333423
99%     .6108425       .8620657       Kurtosis       3.120044
-------------------------------------------------------------

直方图如下。我们可以看到,与 Opler et al. (1999, JFE, [PDF]) 的图 3 是非常类似的,汇报了资本动态结构调整速度的直方图。

coefficient1.png

参考文献

Opler, T., Pinkowitz, L., Stulz, R., & Williamson, R. (1999). The determinants and implications of corporate cash holdings. Journal of Financial Economics, 52(1), 3-46.

附:文中主要 Stata 命令

. sysuse "auto.dta", clear
. summarize price
. dis "方差 (price) = " r(Var)
. dis "range: `r(max)', `r(min)'"  // 放在双引号中的返回值,需要使用暂元方式引用
. return list   // 列示所有返回值

. reg price weight mpg
. matrix list e(V) // 列示系数的方差-协方差矩阵
. ereturn list     // 列示所有返回值

*-Stata 范例 1:
sysuse "auto.dta", clear
statsby mean=r(mean) sd=r(sd) N=r(N), by(rep78): summarize mpg
list, clean noobs //执行 statsby 后,内存中的原始数据会被清空,代以 statsby 的返回值

*-上述命令的等价命令
sysuse "auto.dta", clear

forvalues i =1/5{
  qui summarize mpg if rep78==`i'  // 第 i 组
  dis          "`i'"           ///
      _col(4)  "mean=" r(mean) /// // 在第 4 列列示结果
	  _col(20) "sd="   r(sd)   ///
	  _col(40) "N="    r(N)
}


*-实例 2:输出不同组别的估计系数

. xtarsim y x eta, n(1000) t(10) gamma(0.6) beta(1.3) rho(0.2) ///
                    one(corr 3) sn(9) seed(1234) 
. list in 1/10					

. xtset ivar tvar
. statsby _b[L.D.y], by(ivar) saving("$D\Lev_speed", replace): ///
            reg D.y L.D.y
			
. use "$D\Lev_speed.dta", clear
. rename _stat_1 speed
. sum speed, d
. histogram speed
. sum speed, d

关于我们

  • 「Stata 连享会」 由中山大学连玉君老师团队创办,定期分享实证分析经验, 公众号:StataChina。
  • 公众号推文同步发布于 CSDN 、简书 和 知乎Stata专栏。可在百度中搜索关键词 「Stata连享会」查看往期推文。
  • 点击推文底部【阅读原文】可以查看推文中的链接并下载相关资料。
  • 欢迎赐稿: 欢迎赐稿。录用稿件达 三篇 以上,即可 免费 获得一期 Stata 现场培训资格。
  • E-mail: StataChina@163.com
  • 往期推文:计量专题 || 精品课程 || 简书推文 || 公众号合集

点击查看完整推文列表


欢迎加入Stata连享会(公众号: StataChina)

「经管之家」APP:经管人学习、答疑、交友,就上经管之家!
免流量费下载资料----在经管之家app可以下载论坛上的所有资源,并且不额外收取下载高峰期的论坛币。
涵盖所有经管领域的优秀内容----覆盖经济、管理、金融投资、计量统计、数据分析、国贸、财会等专业的学习宝库,各类资料应有尽有。
来自五湖四海的经管达人----已经有上千万的经管人来到这里,你可以找到任何学科方向、有共同话题的朋友。
经管之家(原人大经济论坛),跨越高校的围墙,带你走进经管知识的新世界。
扫描下方二维码下载并注册APP
本文关键词:

本文论坛网址:https://bbs.pinggu.org/thread-7305229-1-1.html

人气文章

1.凡人大经济论坛-经管之家转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
经管之家 人大经济论坛 大学 专业 手机版