Stata使用小技巧

发布时间:2022-05-31 阅读 367

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下载 - 推文合集

作者:梁淑珍 (华侨大学)
邮箱13514084150@163.com

编者按:本文主要摘译自下文,特此致谢!
Source: Asjad Naqvi, 2022, Blog, The awesome Stata Tips collection! -Link-


目录


1. 简介

Stata 是一个应用相当广泛的软件,其中还有很多隐藏的功能、快捷方式和命令,可以大大提升用户体验!本文着力介绍一些 Stata 中的好用小技巧,例如在图表和 do 文档中设置标签,自动缩放图轴,暂元,数据管理的快捷方式等。在进行本文的操作时,我们建议读者使用 Stata16 及以上版本。

2. 基本设置

除默认设置外,Stata 还能进行个性化设置。在这一部分,我们主要讲解用户界面和软件的个性化设置技巧。

2.1 深色模式

右击选择首选项  常规  整体颜色方案,即可自定义颜色模式。深色给 Stata 增添了不少神秘感和高级感,很多用户会选择这个模式。当然,这些模式可任君挑选,依自己的视觉体验选择即可。

2.2 历史记录

如果你在编写代码的过程中不经常使用鼠标,那么可以使用键盘上的 PageUpPageDown 实现 do 文档翻页,结果窗口翻页,以及命令窗口重现历史命令语句。

2.3 内存设置

niceness 设置 Stata 将未使用的内存块返回给系统的等待时间。如果 Stata 过早的释放闲置内存,会使得其频繁调用系统内存,如果 Stata 长时间占用闲置内存,则会影响系统中其他程序运行。一个较好的等待时间为 5,即 1 分钟,这也是 Stata 默认的等待时间。此外,我们还可以设置如下等待时间:

niceness       waiting time (m:s)
---------------------------------
   10                 0:00.000
    9                 0:00.125
    8                 0:00.500
    7                 0:01
    6                 0:30
    5                 1:00
    4                 5:00
    3                10:00
    2                15:00
    1                20:00
    0                30:00
---------------------------------
Niceness 10 corresponds to being totally nice.  
Niceness 0 corresponds to being an inconsiderate, self-centered, totally selfish jerk.

2.4 图像窗口

Stata 在绘制多张图时,默认情况下,一个窗口仅显示一张图片。我们可以通过设置 autotabgraphs,使得多张图形显示在一个窗口中。

. * 开启设置
. set autotabgraphs on
. * 关闭设置
. set autotabgraphs off
. * 永久开启
. set autotabgraphs on, perm
. * graph1 和 graph2 显示在一个图像窗口中
. sysuse auto, clear 
. set autotabgraphs on 
. scatter price mpg, name(graph1, replace)
. scatter price length, name(graph2, replace)
. * graph1 和 graph2 分别显示在两个图像窗口中
. set autotabgraphs off 
. scatter price mpg, name(graph1, replace)
. scatter price length, name(graph2, replace)

2.5 数据签名

当多人共同处理数据文件时,可以使用 Stata 自带的数据签名功能,来查看数据是否发生变化。

. sysuse auto, clear 
. datasignature set
  74:12(71728):3831085005:1395876116       (data signature set)
. save tmp, replace 

. use tmp, clear
. replace price = 5000 in 50
. datasignature confirm
  data have changed since 28may2022 16:40

数据的任何变化都会导致数据签名发生改变。

2.6 添加注释

在 Stata 中,我们可以给数据集或变量名添加注释。

. webuse auto4, clear 

. * 给数据集添加注释
. note: Send copy to Bob once verified.
. notes

_dta:
  1.  Send copy to Bob once verified.

. note: Mary wants a copy, too.
. notes

_dta:
  1.  Send copy to Bob once verified.
  2.  Mary wants a copy, too.

. note: TS merged updates from JJ&F // 注释添加时间
. notes

_dta:
  1.  Send copy to Bob once verified.
  2.  Mary wants a copy, too.
  3.  28 May 2022 16:48 merged updates from JJ&F

. * 给变量添加注释
. note mpg: is the 41 a mistake?  Ask Bob.
. note mpg: what about the two missing values?
. notes

_dta:
  1.  Send copy to Bob once verified.
  2.  Mary wants a copy, too.
  3.  28 May 2022 16:48 merged updates from JJ&F
mpg:
  1.  is the 41 a mistake?  Ask Bob.
  2.  what about the two missing values?

2.7 更新文件

更新安装的外部命令时,可以输入:

. ado update

Checking status of installed packages:
    [1] fs at http://fmwww.bc.edu/repec/bocode/f:
        installed package is up to date
    ...

由于一些命令可能会频繁更新,建议每过几周就运行一下这条命令。

2.8 系统路径

当我们寻找 Stata 系统文件的储存路径时,可以输入 sysdir

. sysdir
   STATA:  D:\Program\Stata17\
    BASE:  D:\Program\Stata17\ado\base\
    SITE:  D:\Program\Stata17\ado\site\
    PLUS:  D:\Program\Stata17/ado\plus\
PERSONAL:  D:\Program\Stata17/ado\personal\
OLDPLACE:  c:\ado\

3. 局部暂元

3.1 将标签存储为暂元

理解和掌握局部暂元的用法,对提升编程水平大有裨益。例如,画完图后要给图片增加标签,与其手动定义,不如通过 local 储存变量标签,将其传递给图形。代码的框架为:

foreach x of varlist xx-yy{  
    local v : var label `x'      
    twoway line yvar xvar, title("`v'")   
}

如果你要处理的是一份格式清楚的数据,并需要对各种变量进行循环,那么上述代码能为你节省大量时间。

3.2 将值标签存储为暂元

与上述将变量标签存储为暂元一样,我们也可以将值标签存储为暂元。

lab de varlab  1 "x" 2 "y"... 
lab val varname varlab
levelsof varname, local(lclname)
foreach x of local lclname {    
   local t : label varlab `x'       
   twoway line yvar xvar if varname==`x', title("`t'")       
}

其中,levelsof 是一个强大的命令,不仅可以将每个变量的值信息储存到暂元中,还能返回一些计数信息。

. sysuse auto, clear
. levelsof make, local(lvls)
`"AMC Concord"' `"AMC Pacer"' `"AMC Spirit"' `"Audi 5000"' `"Audi Fox"' `"BMW 320i"' ...

. return list
scalars:
                  r(N) =  74
                  r(r) =  74
macros:
             r(levels) : "`"AMC Concord"' `"AMC Pacer"'..."

. dis r(r)
74

3.3 更改暂元的数据格式

定义完一个暂元后,我们可以通过计算、设置格式等方式定义新的暂元。

. sysuse auto, clear
. sum price  
. local x = `r(mean)' * 10
. dis `x'
61652.568

. local x : di %10.2fc `x'
. dis "`x'"
 61,652.57

具体来看,我们先将 price 均值乘以 10 储存到暂元 x 中,此时的结果为 61652.568。接下来,我没又利用 format 设置 x 的格式,并将结果仍然储存在 x 中。

3.4 日期暂元

. local date = string(date(c(current_date), "DMY"), "%tdd!_m!_Y")
. dis "`date'"
28_May_22

. local date = string(date(c(current_date), "DMY"), "%tdCCYYNNDD")
. dis "`date'"
20220528

. local date = string(date(c(current_date), "DMY"), "%tdCY-N-D")
. dis "`date'"
2022-05-28

3.5 重置暂元

在定义暂元的过程中,只要暂元的命名相同,暂元中储存的数据就会一直传递下去。以下列代码为例,第一个代码块定义的 mylocal,其值会传递到第二个代码块的 mylocal 中。

* 第一个代码块
foreach x of varlist aa-gg {
    sum `x'
    local mylocal = `mylocal' + `r(mean)'
}

* 第二个代码块
foreach x of varlist hh-zz {
    sum `x'
    local mylocal = `mylocal' + `r(mean)'
}

4. do 文档

do 文档编辑器里藏着很多秘密,以下的小技巧可能只适用于 Stata16 及以上版本。

4.1 代码分段

可以使用 {} 折叠 do 文档中的代码块,例如:

{
    code block
}

4.2 代码静悄悄运行

使用 quietly 命令仍然可以运行代码,但代码的运行结果不会显示在 Stata 的结果输出窗口。可以和上述的 {} 结合使用,Stata 不会输出代码的运行结果。

qui { 
    <code block here> 
}

这可以满足运行大项目并想隐藏一些输出结果的要求,非常好用!

4.3 并排堆放 do 文档

这里介绍一个鲜为人知的小技巧,可以在编辑器中水平或垂直堆放 do 文档。具体操作如图 (用鼠标点中 dofile 文档的标题框,快速向下拖动即可显示图中小对话框)。多个窗口同时显示,有助于对比两份文档的差异。

4.4 代码缩进

如果代码中涉及 forwhileif 等语句,最好对代码块进行缩进,这样在看代码的层次时能够一目了然。我们可以点开 视图,勾选 显示缩进指南 设置。虽然 Stata 中没有严格的缩进要求,但最好还是养成缩进的习惯。

5. 数据处理

数据处理占用研究工作的大部分时间,接下来介绍一下与数据相关的小技巧。

5.1 搜索变量

如果数据集里有非常多变量,手工去找太麻烦,可以使用以下的搜索功能:

  • lookfor 搜索变量名或标签中的关键词:
lookfor gender 
  • ds 搜索变量类型:
ds, has(type numeric) // 检索到所有数值类型的变量
ds, not(type string)  // 检索到所有非字符串类型的变量

5.2 将首行设置为变量名

在导入 Excel\csv 格式的文件时,表头信息会导入到第一行数据,此时可以选择以下操作方法:

* 法 1:导入 Excel 时,加上 firstrow 选项
import excel filename, firstrow clear

* 法 2:外部命令 nrow
ssc install nrow
nrow 1 

* 法 3:重命名
foreach x of varlist _all { 
   local header = `x'[1] 
   ren `x' `header'
}
drop in 1

5.3 读取目录下所有文件

这是个非常便捷的小技巧,当你需要读入工作目录下的所有文件,且文件命名不规律时尤其好用。

* 列出当前工作路径下的所有文件
local x: dir . files "*"
dis `x'

* 等价于
fs 

还可以搜索某一格式的文件,以 csv 文件为例:

local x: dir . files "*.csv"
dis `x'

* 等价于 
fs *.csv

5.4 回归结果

执行完回归命令后,Stata 会将标准误、p 值、t 值等相关参数返回到 return list 中。

. sysuse auto, clear
. regress price mpg
. return list

matrices:
              r(table) :  9 x 2

. mat list r(table)

r(table)[9,2]
               mpg       _cons
     b  -238.89435   11253.061
    se   53.076687   1170.8128
     t   -4.500928   9.6113239
pvalue   .00002546   1.535e-14
    ll  -344.70079   8919.0881
    ul   -133.0879   13587.033
    df          72          72
  crit   1.9934636   1.9934636
 eform           0           0

5.5 条件语句

如果需要在满足一些条件的情况下生成新变量,比如当变量 x 的值为 1 或 3 或 5 时,生成新变量 y 的值为 1,简化代码如下:

gen y = 1 if inlist(x, 1, 2, 5) 

对于连续变量,请尝试以下代码:

. sysuse auto,clear
. * 如果 mpg>20,v1 的值为 1,否则为 0
. gen v1 = mpg > 20
. * 如果 mpg 不在 0-20 的范围内,v2 的值为 1,否则为 0
. gen v2 = !inrange(mpg, 0, 20)
. * 如果 mpg>20,v3 的值为 1,否则为 0
. gen v3 = cond(mpg > 20, 1, 0)
. * 如果 mpg 在 0-20 的范围内,v4 的值为 0,否则为 1
. recode mpg (0/20 = 0) (21/. = 1), gen(v4)
. * 如果 mpg 在 0-20 的范围内,v5 的值为 1,否则为 2
. gen v5 = irecode(mpg, 0, 20, .)
. * 如果 mpg 在 1-10 的范围内,v6 的值为 1,否则为 0
. gen v6 = inrange(mpg,1,10)
. * 如果 mpg 在 1-10 的范围内,v7 的值为 1,否则为 0
. gen v7 = mpg >=1 & mpg <= 10

5.6 长宽型数据转换

宽型数据和长型数据之间的转换可以使用 reshape 命令。reshape long 转换为长型数据,reshape wide 转换为宽型数据。如果转化出错,可以根据 reshape error 的提示进行修改。

5.7 变量值标签

为变量添加值标签的代码:

. sysuse auto, clear
. gen v1 = mpg > 20
. label define label1 0 "不超过20" 1 "大于20"
. label values v1 label1
. label list
label1:
           0 不超过20
           1 大于20
origin:
           0 Domestic
           1 Foreign

5.8 Mata 矩阵可视化

我们可以使用 Ben Jann 的 heatplot 命令对 Mata 矩阵进行可视化。

. ssc install heatplot,replace
. ssc install palettes, replace
. ssc install colrspace, replace
. mata A = runiform(10,10)
. heatplot mata(A)

这个命令有助于展示方差矩阵或空间误差项。

5.9 正则表达式去除空白符

以下代码可以去除数据中的空白字符或制表符:

gen x2= trim(ustrregexra(x,"/(\r\n\t)+|\r+|\n+|\t+/", ""))
gen x3 = ustrregexra(x2,"[ \t]+|[ \t]+", " ")

6. 图形

6.1 自动调整坐标轴范围

可以使用最大最小值来调整坐标轴的范围,如果需要定期更新图表,那么就可以使用自动调整轴范围这个功能。

sum date
local x1 = `r(min)'
local x2 = `r(max)'
xlabel(`x1'(10)`x2')

还可以适当拓宽轴范围,例如:

sum date
local x1 = `r(min)'
local x2 = `r(max)' + 30
xlabel(`x1'(10)`x2')

6.2 刻度数

自定义刻度数:

. sysuse auto, clear 
. twoway (scatter price mpg), xlabel(#20) ylabel(#20)

此时,x 轴和 y 轴分别设置了 20 个刻度数。

6.3 图例顺序

可以通过以下代码调整图例中的标签顺序:

legend(order(5 "var5" 3 "var3" 1 "var1")) 

6.4 给图片加上文本框

这是一条鲜为人知的技巧,可以通过以下代码在图片中显示文本框并设置格式:

. twoway (scatter mpg weight), text(17 4200  ///
>         "Did you know that you can add text boxes" "inside graphs for some additional info?",  ///
>         size(small) box just(left) margin(l+2 t+2 b+2) fcolor(gs14%80) lw(none))

7. 相关推文

Note:产生如下推文列表的 Stata 命令为:
lianxh 程序, 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