Stata:一组大幅提升运算速度的命令-gtools
👇 连享会 · 推文导航 | www.lianxh.cn
🍎 Stata:Stata基础 | Stata绘图 | Stata程序 | Stata新命令 📘 论文:数据处理 | 结果输出 | 论文写作 | 数据分享 💹 计量:回归分析 | 交乘项-调节 | IV-GMM | 时间序列 | 面板数据 | 空间计量 | Probit-Logit | 分位数回归 ⛳ 专题:SFA-DEA | 生存分析 | 爬虫 | 机器学习 | 文本分析 🔃 因果:DID | RDD | 因果推断 | 合成控制法 | PSM-Matching 🔨 工具:工具软件 | Markdown | Python-R-Stata 🎧 课程:公开课-直播 | 计量专题 | 关于连享会
连享会 · 2023 寒假班
作者:陈蕴晴 (中山大学)
邮箱:949567067@qq.com
温馨提示: 文中链接在微信中无法生效。请点击底部「阅读原文」。或直接长按/扫描如下二维码,直达原文:
目录
1. 何时使用 gtools 命令组
2. 安装 gtools
3. 如何使用?
3.1 gcollapse 命令
3.2 greshape 命令
3.3 gquantiles 命令
3.4 gdistinct 命令
3.5 gegen 命令
3.6 glevelsof 命令
3.7 gtoplevelsof 命令
3.8 gstats sum/tab 命令
3.9 gstats transform 命令
4. 参考资料
5. 相关推文
1. 何时使用 gtools 命令组
对于大部分 Stata 用户来说,相对小量、简单的数据统计或数据处理乃日常上机必走的工序,对 Stata 的运行效率并没有什么感知。然而,当数据集异常庞大时,你不得不对着运行界面发愣,而旁边的人由于用上 gtools
命令组早早看到了输出结果,这种“知觉”将立马苏醒!话不多说,一图胜千言!
注意:由于 Stata17 对 sort
和 collapse
进行了大幅的速度优化,在 MP 版本下,collapse
甚至比 gtools
中的 gcollapse
还快 2 倍。
Mauricio Caceres (2018) 应用 C 语言插件及 Hashes 原理 (即通过将关键码值映射到 Hash Table 中的某个位置以直接访问记录) 编写了 gtools
这一利器。据测算,在命令执行上,gtools
的速度最高可达 Stata 传统命令的近 20 倍,可以说是当之无愧的效率达人!
2. 安装 gtools
gtools
是一个外部命令,作者已将其上传至 ssc,用户可直接安装:
ssc install gtools, replace
安装完毕后,用户通过 help gtools
可以查看命令组中所包含的主要命令。其中,很多命令都是基于传统的 Stata 指令编制,小编在此整理了指令对照表,如下:
gtools 指令 | 等价 Stata 指令 |
---|---|
gcollaspe & gcontract | collaspe & contract |
gquantiles | pctile , xtile , _pctile |
greshape | reshape |
gegen | egen |
gisid | isid |
gduplicates | duplicates |
glevelsof | levelsof |
gstat tab | tabstat |
gstat sum | sum,detail |
此外,gtools
命令组还包含了一些为所其特有的指令,其中有一部分的功能类似于 Stata 外部命令,对照表 (部分) 如下:
gtools 指令 | 类似外部指令 (SSC/SJ) |
---|---|
gunique | unique |
gdistinct | distinct |
gtop ( gtoplevelsof ) | groups , select() |
gstats winsor | winsor2 |
gstats range | rangestat |
fasterxtile | fastxtile |
gatats hdfe | / |
gstats transform | / |
对于回归模型,gtools
命令组也有相应的指令帮你实现:
gtools 函数 | 回归模型 | 类似Stata 函数 |
---|---|---|
gregress | OLS | regress , reghdfe |
givregress | 2SLS | ivregress 2sls , ivreghdfe |
gglm | IRLS | logit , poisson , ppmlhdfe |
3. 如何使用?
在本节中,小编将对 gtools
中提供额外功能的九个命令 (除回归命令外) gcollapse
、greshape
、gquantiles
、gdistinct
、gegen
、glevelsof
、gtoplevelsof
、gstats sum/tab
和 gstats transform/range/moving
进行详细介绍。
3.1 gcollapse 命令
gcollapse
用于批量生成描述性统计信息,命令语法如下:
gcollapse clist [if] [in] [weight] [, options]
其中,clist
必须是数字变量,如:
mean
:均值 (默认);geomean
:几何平均数;count
:非遗漏观测数;nmissing
:遗漏观测数;nunique
:去重后元素个数;median
:中位数;p#
:分位数 (# 必须严格介于 1~100 之间);iqr
:四分位距;range
:范围 (最大-最小);first
:第一个观测值;lastnm
:最后一个非缺失观测值;semean
:均值标准误;skewness
:偏度;kurtosis
:峰度。
weight
允许所有权重类型,分别是:
aweight
:分析权重;fweight
:频数权重;pweight
:概率权重/抽样权重;iweight
:重要性权重。
options
主要包括:
by(varlist)
:按varlist
分类计算clist
的值;cw
:删除缺失值所在行的全部观测值;fast
:若用户按 Break 键,则不恢复原始数据集;merge
:将统计数据合并到原始数据集;labelformat(str)
:指定输出结果的标签。
. sysuse auto, clear
. gcollapse (mean) price, by(foreign) // 统计出国内外汽车价格均值
. sysuse auto, clear
. gcollapse (mean) mean_price=price, by(foreign) // 统计出国内外汽车价格均值,并命名为 mean_price
. sysuse auto, clear
. gcollapse (mean) price (mean) rep78, by(foreign) cw
. // 由于 rep78 存在较多缺失值,使用 cw 指令会将缺失值所在行的观测值全部删去
. // 故此时统计出来的国内外汽车价格均值与前文不同
. list //显示结果
+------------------------------+
| foreign price rep78 |
|------------------------------|
1. | Domestic 6,072.4 3.02083 |
2. | Foreign 6,384.7 4.28571 |
+------------------------------+
. sysuse auto, clear
. gcollapse (mean) price, labelformat(#stat#: #sourcelabel#)
. disp _n(1) "`:var label price'" // 将统计结果的标签指定为 mean:Price
mean: Price
3.2 greshape 命令
greshape
命令用于对数据进行横纵变换处理,不仅较 reshape
有处理速度上的提升,还增加了与 R 语言 tidyr
包中的 spread()
函数、gather()
函数等价的功能。该命令语法如下:
* 宽变长
greshape long stubnames, by(varlist) [options]
greshape gather varlist, keys(varlist) values(varname) [options]
* 长变宽
greshape wide stubnames, by(varlist) keys(varname) [options]
greshape spread varlist, keys(varname) [options]
当然,greshape
也支持传统的语法:
greshape long stubnames, i(varlist) [options] // 宽变长
greshape wide stubnames, i(varlist) j(varname) [options] // 长变宽
其中,options
(宽变长) 包括:
by(varlist)
:ID 变量 (等价于i()
);keys(varname)
:stubnames
的子集变量名 (等价于j()
) (不存在);string
:是否允许将观测值为字符型的 key 与 stub 进行匹配 (见示例);match(str)
:和 @ 的用法一致 (默认通过占位符 @ 的使用来限定数值在变量名中的位置);dropmiss
:删除通过横纵变换后变量的缺失值;nodupcheck
:允许重复值存在。
options
(长变宽) 包括:
by(varlist)
:ID 变量 (等价于i()
);keys(varlist)
:stubnames
的子集变量名 (等价于j()
) (已经存在);colsepparate(str)
:当存在多个 key 的时候使用特定的分隔符;match(str)
:和 @ 的用法一致 (默认通过占位符 @ 的使用来限定数值在变量名中的位置);labelformat(str)
:使用占位符自定义标签格式 (默认为#keyvalue# #stublabel#
);prefix(str)
:对横纵变换后的变量重命名;nomisscheck
:允许缺失值存在。
共用的 options
包括:
fast
:不将reshape
的结果preserve
或者restore
;unsorted
:不对reshape
后的数据进行排序;nochecks
:fast
+unsorted
+nodupcheck
+nomisscheck
;xi(drop)
:不在reshape
、by()
或者keys()
中删除变量。
. * 感受 match() 的使用方法及效果
. webuse reshape3, clear
. list // 先粗略看一下数据结构,判断为宽型数据
. // greshape long inc@r ue, by(id) keys(year)
. greshape long inc[year]r ue, by(id) keys(year) match([year])
. list, sepby(id)
+-----------------------------+
| id year incr ue sex |
|-----------------------------|
1. | 1 80 5000 0 0 |
2. | 1 81 5500 1 0 |
3. | 1 82 6000 0 0 |
|-----------------------------|
4. | 2 80 2000 1 1 |
5. | 2 81 2200 0 1 |
6. | 2 82 3300 0 1 |
|-----------------------------|
7. | 3 80 3000 0 0 |
8. | 3 81 2000 0 0 |
9. | 3 82 1000 1 0 |
+-----------------------------+
. * 对比感受 string 的使用效果
. webuse reshape4, clear
. list
. greshape long inc, by(id) keys(sex) string
. list // 注意这里的 key,即变量 sex 的观测值为 f m (字符型)
+------------------------+
| id sex inc kids |
|------------------------|
1. | 1 f 5500 0 |
2. | 1 m 5000 0 |
3. | 2 f 2200 1 |
4. | 2 m 2000 1 |
5. | 3 f 2000 2 |
|------------------------|
6. | 3 m 3000 2 |
+------------------------+
. greshape long inc, by(id) keys(sex) // 会报错:variable j contains all missing values
. * labelformat(str) 的用法
. sysuse auto, clear
. local labelformat labelformat(#stubname#, #keyname# == #keyvaluelabel#)
. greshape wide mpg, by(make) key(foreign) `labelformat' //这里的 key 是 0 和 1
. desc mpg*
Variable Storage Display Value
name type format label Variable label
-------------------------------------------------------------------------------------------------------------------------------
mpg0 int %8.0g mpg, foreign == Domestic
mpg1 int %8.0g mpg, foreign == Foreign
3.3 gquantiles 命令
gquantiles
可用于高效生成变量百分位数、分位数、类别和频数信息,功能强于 Stata 传统指令 xtile
,pctile
和 _pctile
,并支持带有 xtile
和 pctile
的 by()
。该命令语法如下:
gquantiles [newvar =] exp [if] [in] [weight], {pctile | xtile | _ pctile}
quantiles_method [ gquantiles_options ]
其中,weight
允许 fweight
,aweight
,pweight
三种权重类型,但不可与 altdef
同时使用。quantiles method
主要有:
nqantiles(#)
:生成变量分位数信息,括号可以指定将变量分为 # 等份,如nq(10)
表示生成第 10,20,...,90 分位对应的数,默认nq(2)
,即生成变量中位数;cutpoints(varname)
:指定varname
的取值作为变量的分割点;cutoffs(numlist)
:类似于cutpoints
,只不过分割点的属性由 varible 变更为 numlist;quantiles(numlist)
/percentiles(numlist)
:生成numlist
所指定的分位数信息,如quantiles(10(20)90)
表示生成变量第 10,30,50,70,90 百分位对应的值。
gquantiles options
主要包括:
genp(newvar)
:生成一个包含百分位信息的新变量;by(varlist)
:分组计算分位数 (仅限于xtile
和pctile
),对groupid(varname)
非常有用;groupid(varname)
:生成表示 group ID 的变量,括号指定变量名称;_pctile
:不可与by()
同时使用,等价于 Stata 传统指令_pctile
,生成变量分位数信息并将返回值存储在r(1)
,r(2)
,…… 以及r(quantiles_used)
或r(cutoffs_used)
中,提供返回功能;pctile
:等价于 Stata 传统指令pctile
,用于生成变量分位数信息;xtile
:等价于 Stata 传统指令xtile
,用于生成分位点 (即观测值处于第几分位数的位置),方便后续划分类别变量;binfreq
/binfrep(newvar)
:生成变量频数信息,用括号指定newvar
时,返回值将存储在新变量中,否则存储在矩阵r(quantiles_bincount)
或r(cutoffs_bincount)
中。
. sysuse auto, clear
. gquantiles price, _pctile nq(10)
. // 返回变量 price 第 10,20,……,90 分位数对应的值,不直接列示,
. // 但可以通过 return list 查看存储情况
. matrix list r(quantiles_used) // 以矩阵形式呈现结果
r(quantiles_used)[9,1]
c1
r1 3895
r2 4099
r3 4425
r4 4647
r5 5006.5
r6 5705
r7 6165
r8 7827
r9 11385
. gquantiles p10 = price, pctile nq(10)
. // 生成新变量 p10,存放源变量 price 第 10,20,……,90 分位数对应的值
. gquantiles m = price [w = weight], xtile cutpoints(p10) by(make)
. // 以 weight 作为权重变量,按照变量 make 分组,组内以变量 p10 的取值作为分割点,
. // 生成包含变量 price 分位点信息的新变量 m
3.4 gdistinct 命令
gdistinct
可以代替 distinct
报告变量不同观测值的数量 (默认剔除缺失值),且可将统计结果以表格形式直观呈现,还额外增加了部分选项。该命令语法如下:
gdistinct [varlist] [if] [in] [, missing abbrev(#) joint minimum(#) maximum(#) ]
其中,options
主要包括:
missing
:计数时包括缺失值 (默认不包括);abbrev(#)
:指定要报告的变量名称最多显示 # 个字符,注意该选项不能与joint
同时使用,否则无效;joint
:联合考虑多个变量的取值情况;minimum(#)
:指定仅显示计数 ≥# 的变量;maximum(#)
:指定仅显示计数 ≤# 的变量;sort(order)
:指定输出结果按照计数情况进行排序。
. sysuse auto, clear
. gdistinct
. // 例如对比 total 栏和 distinct 栏,我们可以发现变量 mpg 虽然共有74个观测值,
. // 但仅存在21个不同的观测值;变量 rep78 应该有 5 个缺失值
| Observations
| total distinct
--------------+----------------------
make | 74 74
price | 74 74
mpg | 74 21
rep78 | 69 5
headroom | 74 8
trunk | 74 18
weight | 74 64
length | 74 47
turn | 74 18
displacement | 74 31
gear_ratio | 74 36
foreign | 74 2
. gdistinct, sort(-distinct) // 按照不同的观测值的个数降序输出结果
| Observations
| total distinct
--------------+----------------------
price | 74 74
make | 74 74
weight | 74 64
length | 74 47
gear_ratio | 74 36
displacement | 74 31
mpg | 74 21
turn | 74 18
trunk | 74 18
headroom | 74 8
rep78 | 69 5
foreign | 74 2
. gdistinct make-headroom, missing abbrev(6)
. // 仅报告数据集中由变量 make 到 headroom 的计数情况,
. // 计数时允许包括缺失值,且变量名最多显示6个字符
| Observations
| total distinct
--------+----------------------
make | 74 74
price | 74 74
mpg | 74 21
rep78 | 74 6
head~m | 74 8
. gdistinct foreign rep78, joint // 联合报告变量 foreign 和 rep78 的计数情况
Observations
total distinct
69 8
. gdistinct, max(10) // 只报告计数不超过 10 的变量
| Observations
| total distinct
--------------+----------------------
rep78 | 69 5
headroom | 74 8
foreign | 74 2
3.5 gegen 命令
gegen
基于 egen
编制,绝大多数情况下都能发挥提效的性能。不过,如果用户需要针对单个变量生成多种描述性统计信息,或许 gcollapse
配合使用 merge
会更快些。gegen
语法如下:
gegen [type] newvar = fcn(arguments) [if] [in] [weight] [, replace fcn_options gtools_options ]
其中,weight
允许所有权重类型,不过仅配合部分描述性统计函数有效,如 total,sum,mean,sd,count, median,iqr,percent,semean,sebinomial,sepoisson,percentiles,skewness,kurtosis。特别地,
pweight
不支持统计 sd,semean,sebinomial 或 sepoisson;iwight
不支持统计 semean,sebinomial 或 sepoisson;aweight
不支持统计 sebinomial 或 sepoisson。
fcn(arguments)
可以支持以下三种函数:
ID 生成: group(varlist) [, missing counts(newvarname) fill(real)]
,不能与by()
同时使用;标签分组: tag(varlist) [, missing]
,将变量不同观测值的第一个值标记为 1,其余标记为 0,如某变量的观测值为 (2,3,2,1,2,5,5),那么经标记就会变为 (1,1,0,1,0,1,0),需注意的是tag()
不能与by()
同时使用;统计性函数: first|last|firstnm|lastnm(exp)
,count(exp)
,nunique(exp)
,iqr(exp)
,max|min(exp)
,select(exp)
,cv(exp)
,sum(exp)
等等。
. sysuse auto, clear
. gegen id = group(turn) // 为变量 turn 的分组信息编码
. tabdisp turn, cell(id) // 利用表格展现数据 (此处使用了 tabdisp 命令)
. gegen tag = tag(rep78) // 将变量 rep78 第一个出现的观测值标记为零
. egen ndistinct = total(tag), by(foreign)
. // 计算不同 foreign 类别下,变量 rep78 各有多少个非重复的观测值
. tabdisp foreign, cell(ndistinct)
----------------------
Car |
origin | ndistinct
----------+-----------
Domestic | 5
Foreign | 0
----------------------
. gegen mean = mean(price), by(foreign)
. // 按照变量 foreign 分组,生成每组中变量 price 的均值,存放在新变量 mean 中
3.6 glevelsof 命令
glevelsof
用于对指定变量不同的观测值进行排序,与 levelsof
不同的是,它还能够支持多个变量同时排序。该命令语法如下:
glevelsof varlist [if] [in] [, options ]
// 这里的 varlist 也可以具体化为 [+|-] varname [[+|-] varname ...],仅改变观测值的排列顺序
options
有以下常用选项:
clean
:清除字符串变量观测值显示时的复合双引号;local(macname)
:定义局部暂元并将观测值存储在其中;missing
:将缺失值也考虑在观测值内;separate(separator)
:将各观测组以指定符号分隔开;colseparate(separator)
:将观测组内不同变量的观测值以指定符号分隔开;gen([prefix], [replace])
:将 varlist 的存储在一个以 prefix 为前缀的新 varlist 中,或直接替代原来的 varlist,prefix
和replace
两个选项互斥;matasave[(str)]
:将报告结果保存在 mata 对象中 (默认对象名为 GtoolsByLevels);silent
:不显示结果,常与gen()
或matasave()
连用。
. sysuse auto, clear
. glevelsof rep78
1 2 3 4 5
. glevelsof -rep78
5 4 3 2 1
. glevelsof rep78, missing
1 2 3 4 5 .
. local varlist foreign rep78 //将变量 foreign 和 rep78 的观测值存放在局部暂元 varlist 中
. glevelsof `varlist', sep("|") colsep(",")
. // 用 | 将 varlist 不同取值分隔开;用 , 将 varlist 内部不同变量的观测值分隔开
`"0,1"'|`"0,2"'|`"0,3"'|`"0,4"'|`"0,5"'|`"1,3"'|`"1,4"'|`"1,5"'
. glevelsof turn trunk in 1/10, gen(ulev_) nolocal
. // 生成前缀为 ulev 的新变量,存储级别由 1 到 10 的观测组 (组内有两个源变量,turn 和 trunk )
. list turn trunk ulev_*
+------------------------------------+
| turn trunk ulev_t~n ulev_t~k |
|------------------------------------|
1. | 40 11 34 10 |
2. | 40 11 35 12 |
3. | 35 12 40 11 |
4. | 40 16 40 16 |
5. | 43 20 42 13 |
|------------------------------------|
6. | 43 21 42 16 |
7. | 34 10 43 17 |
8. | 42 16 43 20 |
9. | 43 17 43 21 |
10. | 42 13 . . |
+------------------------------------+
3.7 gtoplevelsof 命令
gtoplevelsof
/ gtop
将观测值的出现频数、累积频数、百分比和累积百分比信息以表格方式呈现 (默认按照观测值出现频数由大到小排序)。该命令语法如下:
gtoplevelsof varlist [if] [in] [weight] [, options ]
// 和 glevelsof 一样,这里的 varlist 也可以替代为 [+|-] varname [[+|-] varname ...],仅改变观测值的排列顺序
常用的 options
:
ntop(int)
:报告出现次数最多(或者权重最大)的前 int 个观测值;freqabove(int)
:报告出现次数超过 int 的观测值;pctabove(real)
:报告占比超过 int 的观测值;missrow
:增加一行报告缺失观测值的信息 (当有多个变量时,只有观测组内所有变量的值都是缺失的才会被单独报告);groupmissing
:当有多个变量时,观测组内只要出现一个缺失值就会变成 missing row,从而与missrow
连用时这一行的统计信息就会被单独列出来;colmax(numlist)
:最多显示字符型观测值的 n 个字符。
. * 对比感受 ntop 和 missrow 的使用效果
. sysuse auto, clear
. gtoplevelsof rep78
rep78 | N Cum Pct (%) Cum Pct (%)
--------------------------------------------
3 | 30 30 40.5 40.5
4 | 18 48 24.3 64.9
5 | 11 59 14.9 79.7
2 | 8 67 10.8 90.5
. | 5 72 6.8 97.3
1 | 2 74 2.7 100.0
. gtop rep78, missrow
rep78 | N Cum Pct (%) Cum Pct (%)
---------------------------------------------
3 | 30 30 40.5 40.5
4 | 18 48 24.3 64.9
5 | 11 59 14.9 79.7
2 | 8 67 10.8 90.5
1 | 2 69 2.7 93.2
---------------------------------------------
Missing | 5 74 6.8 100.0
. gtop rep78, ntop(3)
rep78 | N Cum Pct (%) Cum Pct (%)
------------------------------------------------------
3 | 30 30 40.5 40.5
4 | 18 48 24.3 64.9
5 | 11 59 14.9 79.7
------------------------------------------------------
Other (3 groups) | 15 74 20.3 100.0
. gtop rep78, ntop(3) missrow
rep78 | N Cum Pct (%) Cum Pct (%)
------------------------------------------------------
3 | 30 30 40.5 40.5
4 | 18 48 24.3 64.9
5 | 11 59 14.9 79.7
------------------------------------------------------
Missing | 5 64 6.8 86.5
Other (2 groups) | 10 74 13.5 100.0
. * 感受 novaluelab 和 colmax() 的使用效果
. gtop foreign
foreign | N Cum Pct (%) Cum Pct (%)
----------------------------------------------
Domestic | 52 52 70.3 70.3
Foreign | 22 74 29.7 100.0
. gtop foreign, novaluelab
foreign | N Cum Pct (%) Cum Pct (%)
---------------------------------------------
0 | 52 52 70.3 70.3
1 | 22 74 29.7 100.0
. gtop foreign, colmax(3)
foreign | N Cum Pct (%) Cum Pct (%)
---------------------------------------------
Dom... | 52 52 70.3 70.3
For... | 22 74 29.7 100.0
. * 对比感受 missrow 和 groupmiss 的区别
. gtop foreign rep78, ntop(4) missrow
foreign rep78 | N Cum Pct (%) Cum Pct (%)
------------------------------------------------------
Domestic 3 | 27 27 36.5 36.5
Domestic 4 | 9 36 12.2 48.6
Foreign 4 | 9 45 12.2 60.8
Foreign 5 | 9 54 12.2 73.0
------------------------------------------------------
Other (6 groups) | 20 74 27.0 100.0
. gtop foreign rep78, ntop(4) missrow groupmiss
foreign rep78 | N Cum Pct (%) Cum Pct (%)
--------------------------------------------------------------
Domestic 3 | 27 27 36.5 36.5
Domestic 4 | 9 36 12.2 48.6
Foreign 4 | 9 45 12.2 60.8
Foreign 5 | 9 54 12.2 73.0
--------------------------------------------------------------
Missing (any) (2 groups) | 5 59 6.8 79.7
Other (4 groups) | 15 74 20.3 100.0
3.8 gstats sum/tab 命令
gstats sum/tab
以 tabstat
和 sum, detail
的样式高效进行描述性统计。当需要分组统计时,该命令配上选项 by()
将会比使用 gcollapse
还快。其语法如下:
gstats summarize varlist [if] [in] [weight] [, by(varlist) options]
gstats tabstat varlist [if] [in] [weight] [, by(varlist) options]
tabstat options
:
by(varlist)
:分组统计;statistics(stat [...])
/s(stat [...])
:报告指定的统计量 (默认是观测值数量、和、均值、标准差、最小值和最大值);columns(stat|var)
:表格的呈现形式,若括号内为 stat,则将每一种统计量作为一列;若为 var,则将每一个变量作为一列;prettystats
:呈现标准的表头;labelwidth(int)
:设定变量标签/观测值最大宽度;format[(%fmt)]
:格式化输出。
summarize options
:
by(varlist)
:分组统计;nodetail
/nod
:不显示完整的统计信息;meanonly
:仅统计变量观测值的数量、和、均值、最小值和最大值;separator(#)
:每隔 # 个变量后绘制一条分割线;tabstat
:以tabstat
的样式输出统计信息。
共有 options
:
pooled
:将所有变量汇总视为一个整体进行描述性统计;noprint
:不显示统计结果;format
:使用源变量的呈现格式;nomissing
:与by()
连用,统计时会忽略存在缺失值的组别。
. * 对比感受 columns(stat) 和 columns(var) 的差异
. sysuse auto, clear
. gstats tab price mpg,col(stat)
variable | n sum mean min max sd
-------------------------------------------------------------------------
price | 74 456229 6165.257 3291 15906 2949.496
mpg | 74 1576 21.2973 12 41 5.785503
-------------------------------------------------------------------------
. gstats tab price mpg,col(var)
statistic | price mpg
-------------------------------------
n | 74 74
sum | 456229 1576
mean | 6165.257 21.2973
min | 3291 12
max | 15906 41
sd | 2949.496 5.785503
-------------------------------------
. * 命令 gstats tab 和 gstats sum 的对比
. gstats tab price mpg, pretty // 可以发现默认的呈现方式跟使用 col(stat) 一样
variable | Count Sum Mean Min Max St Dev.
----------------------------------------------------------------------------
price | 74 456229 6165.257 3291 15906 2949.496
mpg | 74 1576 21.2973 12 41 5.785503
----------------------------------------------------------------------------
. gstats sum price mpg, nod // 只有在使用 nod 选项时,两个命令的呈现样式才会相同
Variable | Obs Mean Std. Dev. Min Max
-------------+----------------------------------------------------------
price | 74 6165.257 2949.496 3291 15906
mpg | 74 21.2973 5.785503 12 41
. * 选项 pooled 的用法
. gstats sum price *, nod pool
Variable | Obs Mean Std. Dev. Min Max
-------------+----------------------------------------------------------
[Pooled Var] | 883 1325.747 2623.11 0 15906
3.9 gstats transform 命令
gstats transform
是一个分组统计函数,其语法如下:
gstats transform clist [if] [in] [weight] [, by(varlist) options]
其中,clist
可以是:
[(stat)] varlist [ [(stat)] ... ]
;[(stat)] target_var=varname [target_var=varname ...] [ [(stat)] ...]
;任意 varlist
或target_var
的组合体。
stat
如下表所示:
统计量 | 描述 |
---|---|
demean | 减去均值 (默认) |
demedian | 减去中位数 |
normalize / standardize | (x-均值) / 标准差 |
moving stat [#] | 移动数据表,[#] 指定边距;与 window() 连用 |
range stat [...] | 为指定区间内的观测值进行描述性统计,与 interval() 连用 |
cumsum [+/- [varname]] | 累计和 (可以通过正负号升序或降序);与 cumby() 连用 |
shift [[+/-]#] | 滞后 (-) ,提前 (+);与 shiftby() 连用 |
rank | 对变量观测值进行排序;与 ties() 连用 |
options
包括:
replace
:替代现有变量;labelformat(str)
:指定输出结果的标签格式,默认为(#stat#) #sourcelabel#
;autorename[(str)]
:根据目标统计数据自动命名,默认为#source#_#stat#
;nogreedy
:使用运算更慢但是节省内存的算法;types(str)
:(慎用) 更改目标统计数据的数据类型。
. * 基本用法
. sysuse auto, clear
. gegen norm_price = normalize(price), by(foreign)
. //生成新变量 norm_price,存储源变量 price 经标准化的数据 (按变量 foreign 分组)
. gegen lag1_price = shift(price), by(foreign) shiftby(-1)
. //源变量 price 滞后一期的数据
. gegen lead2_price = shift(price), by(foreign) shiftby(2)
. //源变量 price 提前两期的数据
. * 选项 moving/range stat 的用法
. webuse grunfeld, clear
. gstats transform (range mean -0.5sd 0.5sd) x = invest
. // 生成新变量 x,计算半个标准差内投资的平均值
. clear
. set obs 20
. gen g = _n > 10
. gen x = _n
. gen w = mod(_n, 7)
. gegen x1 = moving_mean(x), window(-2 2) by(g)
. gstats transform (moving mean -1 3) x2 = x, by(g)
. * 选项 cumsum 的用法
. clear
. set obs 20
. gen g = _n > 10
. gen x = mod(_n, 17)
. gen w = mod(_n, 7)
. gen r = mod(_n, 5)
. local c1 (cumsum -) x2 = x
. local c2 (cumsum +) x3 = x
. local c3 (cumsum - w) x4 = x
. local c4 (cumsum + w) x5 = x
. local c5 (cumsum) x6 = x
. gegen x1 = cumsum(x), by(g)
. gstats transform `c1' `c2' `c3' `c4' `c5', by(g) cumby(- r)
. l, sepby(g)
+----------------------------------------------+
| g x w r x1 x2 x3 x4 x5 x6 |
|----------------------------------------------|
1. | 0 1 1 1 1 55 1 48 8 40 |
2. | 0 2 2 2 3 54 3 39 18 33 |
3. | 0 3 3 3 6 52 6 28 30 24 |
4. | 0 4 4 4 10 49 10 15 44 13 |
5. | 0 5 5 0 15 45 15 11 49 55 |
6. | 0 6 6 1 21 40 21 6 55 39 |
7. | 0 7 0 2 28 34 28 55 7 31 |
8. | 0 8 1 3 36 27 36 47 16 21 |
9. | 0 9 2 4 45 19 45 37 27 9 |
10. | 0 10 3 0 55 10 55 25 40 50 |
|----------------------------------------------|
11. | 1 11 4 1 11 81 17 41 57 69 |
12. | 1 12 5 2 23 70 29 28 71 42 |
13. | 1 13 6 3 36 58 42 13 87 29 |
14. | 1 14 0 4 50 45 56 87 14 14 |
15. | 1 15 1 0 65 31 71 73 29 84 |
16. | 1 16 2 1 81 16 87 58 45 58 |
17. | 1 0 3 2 81 87 0 42 45 42 |
18. | 1 1 4 3 82 87 1 42 46 30 |
19. | 1 2 5 4 84 86 3 30 59 16 |
20. | 1 3 6 0 87 84 6 16 74 87 |
+----------------------------------------------+
4. 参考资料
gtools 主页 gtools 作者主页
5. 相关推文
Note:产生如下推文列表的 Stata 命令为:
lianxh lianxh gtools reshape pweight, m
安装最新版lianxh
命令:
ssc install lianxh, replace
专题:Stata命令 Stata新命令:超级强大的-gtools-命令组 专题:数据处理 Stata数据处理:快速转换Wind数据-reshapewind Stata数据处理:纵横长宽转换-reshape命令一文读懂!(下)-sreshape-fastreshape-xpose Stata数据处理:纵横长宽转换-reshape命令一文读懂!(上) Stata数据处理:纵横长宽转换-reshape的兄弟-gather和spread.md 专题:回归分析 Stata 权重设定-fweight-pweight
课程推荐:因果推断实用计量方法
主讲老师:邱嘉平教授
🍓 课程主页:https://gitee.com/lianxh/YGqjp
New! Stata 搜索神器:
lianxh
和songbl
GIF 动图介绍
搜: 推文、数据分享、期刊论文、重现代码 ……
👉 安装:
. ssc install lianxh
. ssc install songbl
👉 使用:
. lianxh DID 倍分法
. songbl all
🍏 关于我们
连享会 ( www.lianxh.cn,推文列表) 由中山大学连玉君老师团队创办,定期分享实证分析经验。 直通车: 👉【百度一下: 连享会】即可直达连享会主页。亦可进一步添加 「知乎」,「b 站」,「面板数据」,「公开课」 等关键词细化搜索。