Stata:正则表达式教程

发布时间:2022-05-30 阅读 225

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 默认的等待时间。此外,我们还可以设置如下等待时间:

  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
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,使得多张图形显示在一个窗口中。

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

2.5 数据签名

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

  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
. 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 中,我们可以给数据集或变量名添加注释。

  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
. 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&Fmpg: 1. is the 41 a mistake? Ask Bob. 2. what about the two missing values?

2.7 更新文件

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

  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
. 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

  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
. 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 储存变量标签,将其传递给图形。代码的框架为:

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

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

3.2 将值标签存储为暂元

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

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

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

  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
. sysuse auto, clear. levelsof make, local(lvls)`"AMC Concord"' `"AMC Pacer"' `"AMC Spirit"' `"Audi 5000"' `"Audi Fox"' `"BMW 320i"' ...
. return listscalars: r(N) = 74 r(r) = 74macros: r(levels) : "`"AMC Concord"' `"AMC Pacer"'..."
. dis r(r)74

3.3 更改暂元的数据格式

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

  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
. 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 日期暂元

  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
. 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 中。

  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
* 第一个代码块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 文档中的代码块,例如:

  • ounter(line
  • ounter(line
  • ounter(line
{    code block}

4.2 代码静悄悄运行

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

  • ounter(line
  • ounter(line
  • ounter(line
qui {     <code block here> }

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

4.3 并排堆放 do 文档

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

4.4 代码缩进

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

5. 数据处理

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

5.1 搜索变量

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

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

5.2 将首行设置为变量名

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

  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
* 法 1:导入 Excel 时,加上 firstrow 选项import excel filename, firstrow clear
* 法 2:外部命令 nrowssc install nrownrow 1
* 法 3:重命名foreach x of varlist _all { local header = `x'[1] ren `x' `header'}drop in 1

5.3 读取目录下所有文件

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

  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
* 列出当前工作路径下的所有文件local x: dir . files "*"dis `x'
* 等价于fs

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

  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
local x: dir . files "*.csv"dis `x'
* 等价于 fs *.csv

5.4 回归结果

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

  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
. 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.6113239pvalue .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,简化代码如下:

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

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

  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
. 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 变量值标签

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

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

5.8 Mata 矩阵可视化

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

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

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

5.9 正则表达式去除空白符

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

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

6. 图形

6.1 自动调整坐标轴范围

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

  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
sum datelocal x1 = `r(min)'local x2 = `r(max)'xlabel(`x1'(10)`x2')

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

  • ounter(line
  • ounter(line
  • ounter(line
  • ounter(line
sum datelocal x1 = `r(min)'local x2 = `r(max)' + 30xlabel(`x1'(10)`x2')

6.2 刻度数

自定义刻度数:

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

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

6.3 图例顺序

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

  • ounter(line
legend(order(5 "var5" 3 "var3" 1 "var1")) 

6.4 给图片加上文本框

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

  • ounter(line
  • ounter(line
  • ounter(line
. 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