查看原文
其他

Stata使用小技巧

连享会 连享会 2023-10-24

👇 连享会 · 推文导航 | www.lianxh.cn

连享会 · 效率分析专题

作者:梁淑珍 (华侨大学)
邮箱: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 历史记录

如果你在编写代码的过程中不经常使用鼠标,那么可以使用键盘上的 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 会将标准误、 值、 值等相关参数返回到 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 搜索神器:lianxhsongbl  GIF 动图介绍
搜: 推文、数据分享、期刊论文、重现代码 ……
👉 安装:
. ssc install lianxh
. ssc install songbl
👉  使用:
. lianxh DID 倍分法
. songbl all

🍏 关于我们

  • 连享会 ( www.lianxh.cn,推文列表) 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 直通车: 👉【**百度一下:**连享会】即可直达连享会主页。亦可进一步添加 「知乎」,「b 站」,「面板数据」,「公开课」 等关键词细化搜索。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存