连享会 - 与君分享 lianxh.cn
文章目录
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 的绘制就是一个很好的例子。
该文研究资本结构的动态调整速度。动态资本结构理论认为企业的最优资本结构并不是固定的股权债务比例,而是一个变化的股权债务比例范围,企业设定目标资本结构,并依据各种条件的变化不断地进行着资本结构的调整。
其基本模型为:
y i t − y i , t − 1 = λ ( y