Stata:一组大幅提升运算速度的命令-gtools

发布时间:2023-01-09 阅读 590

Stata连享会   主页 || 视频 || 推文 || 知乎 || Bilibili 站

温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。

New! lianxh 命令发布了:
随时搜索推文、Stata 资源。安装:
. ssc install lianxh
详情参见帮助文件 (有惊喜):
. help lianxh
连享会新命令:cnssc, ihelp, rdbalance, gitee, installpkg

课程详情 https://gitee.com/lianxh/Course

课程主页 https://gitee.com/lianxh/Course

⛳ Stata 系列推文:

PDF下载 - 推文合集

作者:陈蕴晴 (中山大学)
邮箱949567067@qq.com


目录


1. 何时使用 gtools 命令组

对于大部分 Stata 用户来说,相对小量、简单的数据统计或数据处理乃日常上机必走的工序,对 Stata 的运行效率并没有什么感知。然而,当数据集异常庞大时,你不得不对着运行界面发愣,而旁边的人由于用上 gtools 命令组早早看到了输出结果,这种“知觉”将立马苏醒!话不多说,一图胜千言!

注意:由于 Stata17 对 sortcollapse 进行了大幅的速度优化,在 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 中提供额外功能的九个命令 (除回归命令外) gcollapsegreshapegquantilesgdistinctgegenglevelsofgtoplevelsofgstats sum/tabgstats 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 后的数据进行排序;
  • nochecksfast + unsorted + nodupcheck + nomisscheck
  • xi(drop):不在 reshapeby() 或者 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 传统指令 xtilepctile_pctile,并支持带有 xtilepctileby()。该命令语法如下:

gquantiles [newvar =] exp [if] [in] [weight], {pctile | xtile | _ pctile} 
   quantiles_method [ gquantiles_options ]

其中,weight 允许 fweightaweightpweight 三种权重类型,但不可与 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):分组计算分位数 (仅限于 xtilepctile),对 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,prefixreplace 两个选项互斥;
  • 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/tabtabstatsum, 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)] ...]
  • 任意 varlisttarget_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. 参考资料

5. 相关推文

Note:产生如下推文列表的 Stata 命令为:
lianxh lianxh gtools reshape pweight, m
安装最新版 lianxh 命令:
ssc install lianxh, replace

相关课程

免费公开课

最新课程-直播课

专题 嘉宾 直播/回看视频
最新专题 文本分析、机器学习、效率专题、生存分析等
研究设计 连玉君 我的特斯拉-实证研究设计-幻灯片-
面板模型 连玉君 动态面板模型-幻灯片-
面板模型 连玉君 直击面板数据模型 [免费公开课,2小时]
  • Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。

课程主页

课程主页

关于我们

  • Stata连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 连享会-主页知乎专栏,700+ 推文,实证分析不再抓狂。直播间 有很多视频课程,可以随时观看。
  • 公众号关键词搜索/回复 功能已经上线。大家可以在公众号左下角点击键盘图标,输入简要关键词,以便快速呈现历史推文,获取工具软件和数据下载。常见关键词:课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法

连享会小程序:扫一扫,看推文,看视频……

扫码加入连享会微信群,提问交流更方便

✏ 连享会-常见问题解答:
https://gitee.com/lianxh/Course/wikis

New! lianxhsongbl 命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh