Stata使用小技巧
👇 连享会 · 推文导航 | www.lianxh.cn
🍎 Stata:Stata基础 | Stata绘图 | Stata程序 | Stata新命令 📘 论文:数据处理 | 结果输出 | 论文写作 | 数据分享 💹 计量:回归分析 | 交乘项-调节 | IV-GMM | 时间序列 | 面板数据 | 空间计量 | Probit-Logit | 分位数回归 ⛳ 专题:SFA-DEA | 生存分析 | 爬虫 | 机器学习 | 文本分析 🔃 因果:DID | RDD | 因果推断 | 合成控制法 | PSM-Matching 🔨 工具:工具软件 | Markdown | Python-R-Stata 🎧 课程:公开课-直播 | 计量专题 | 关于连享会
连享会 · 效率分析专题
作者:梁淑珍 (华侨大学)
邮箱:13514084150@163.com
温馨提示: 文中链接在微信中无法生效。请点击底部「阅读原文」。或直接长按/扫描如下二维码,直达原文:
编者按:本文主要摘译自下文,特此致谢!
Source: Asjad Naqvi, 2022, Blog, The awesome Stata Tips collection! -Link-
目录
1. 简介
2. 基本设置
2.1 深色模式
2.2 历史记录
2.3 内存设置
2.4 图像窗口
2.5 数据签名
2.6 添加注释
2.7 更新文件
2.8 系统路径
3. 局部暂元
3.1 将标签存储为暂元
3.2 将值标签存储为暂元
3.3 更改暂元的数据格式
3.4 日期暂元
3.5 重置暂元
4. do 文档
4.1 代码分段
4.2 代码静悄悄运行
4.3 并排堆放 do 文档
4.4 代码缩进
5. 数据处理
5.1 搜索变量
5.2 将首行设置为变量名
5.3 读取目录下所有文件
5.4 回归结果
5.5 条件语句
5.6 长宽型数据转换
5.7 变量值标签
5.8 Mata 矩阵可视化
5.9 正则表达式去除空白符
6. 图形
6.1 自动调整坐标轴范围
6.2 刻度数
6.3 图例顺序
6.4 给图片加上文本框
7. 相关推文
1. 简介
Stata 是一个应用相当广泛的软件,其中还有很多隐藏的功能、快捷方式和命令,可以大大提升用户体验!本文着力介绍一些 Stata 中的好用小技巧,例如在图表和 do 文档中设置标签,自动缩放图轴,暂元,数据管理的快捷方式等。在进行本文的操作时,我们建议读者使用 Stata16 及以上版本。
2. 基本设置
除默认设置外,Stata 还能进行个性化设置。在这一部分,我们主要讲解用户界面和软件的个性化设置技巧。
2.1 深色模式
右击选择首选项
常规
整体颜色方案
,即可自定义颜色模式。深色给 Stata 增添了不少神秘感和高级感,很多用户会选择这个模式。当然,这些模式可任君挑选,依自己的视觉体验选择即可。
2.2 历史记录
如果你在编写代码的过程中不经常使用鼠标,那么可以使用键盘上的 PageUp
和 PageDown
实现 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 代码缩进
如果代码中涉及 for
、while
、if
等语句,最好对代码块进行缩进,这样在看代码的层次时能够一目了然。我们可以点开 视图
,勾选 显示缩进指南
设置。虽然 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 会将标准误、 值、 值等相关参数返回到 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
专题:Stata命令 moremata程序包手动安装方法 专题:Stata程序 Stata程序:最大公约数和最小公倍数 Stata程序:10 分钟快乐编写 ado 文件 Stata程序:Monte-Carlo-模拟之产生符合特定分布的随机数 Stata程序:我的程序多久能跑完? Stata程序:暂元-(local)-和全局暂元-(global) Stata程序:切割文件路径和文件名 Stata程序:是否有类似-Python-中的-zip()-函数 Stata程序:在我的程序中接纳另一个程序的所有选项 Stata 程序:数值求解极值的基本思想 专题:合成控制法 Stata:合成控制法程序分享 专题:内生性-因果推断 Robins - Causal Inference: What if - 数据和程序
课程推荐:因果推断实用计量方法
主讲老师:丘嘉平教授
🍓 课程主页:https://gitee.com/lianxh/YGqjp
New! Stata 搜索神器:
lianxh
和songbl
GIF 动图介绍
搜: 推文、数据分享、期刊论文、重现代码 ……
👉 安装:
. ssc install lianxh
. ssc install songbl
👉 使用:
. lianxh DID 倍分法
. songbl all
🍏 关于我们
连享会 ( www.lianxh.cn,推文列表) 由中山大学连玉君老师团队创办,定期分享实证分析经验。 直通车: 👉【**百度一下:**连享会】即可直达连享会主页。亦可进一步添加 「知乎」,「b 站」,「面板数据」,「公开课」 等关键词细化搜索。