Stata:写个像样的dofile有哪些标准动作?

发布时间:2023-05-13 阅读 851

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

作者:张家星 (中南财经政法大学)
邮箱zhangjx@stu.zuel.edu.cn

编者按:本文主要摘译自下文,特此致谢!
Source:Emmanuel Milet. The Do's and Don'ts of a Do-file. -PDF-


目录


1. 热身运动

在正式开始写 do 文件之前,我们需要清楚:尘封多年的 do 文件终究会在某一天重见天日。没有任何注释的代码就像噩梦一般!未来,你甚至可能花费两天时间才理解了自己以前写的代码!为了避免这种情况,请参考如下建议:

1.1 文件位置与命名

  • 关于文件储存位置:do 文件和相关数据应该保存在同一个文件夹,日志文件和输出结果可以保存在子文件夹内。
  • 关于文件夹命名:文件夹名字中尽量不要包含空格,否则 Stata 可能无法正确读入文件路径。

1.2 清除 Stata 内存

在开始写一份新的 do 文件之前,首先需要使用 clearclear matrixclear all 等命令清除 Stata 内存中已定义的程序、矩阵以及已导入的数据。其中,

  • clear 单独使用时指的是清除当前内存中所有的数据和标签;
  • clear matrix 指的是清除内存中由 matrix 命令产生的所有矩阵;
  • clear all 指的是清除内存中的所有内容。

2. 整体布局

2.1 给 do 文件起个好听的名字

为 do 文件起一个明确的名字!例如:0-master.do,1-merge.do,2-stylized-facts.do 等等。当有多个特征事实时,可以设置:2.1-stylized-facts-geography.do,2.2-stylized-facts-count.do 等等,最后再将它们组织在一个 do 文件中。

2.2 有序组织 do 文件

主 do 文件 (master do-file) 常用于组织待执行的 do 文件,当 do 文件较多时尤为重要。

    * =====================
    *      Master file
    * =====================

* 合并 trade 数据和 gravity 数据
* 由于规模限制,每个 country*year 仅保留一个观测值
run 1_merge.do

* 变量标签
run 2_labels.do

* 特征事实
run 3_stylized_facts.do

* 回归
run 4_regression.do

注意:建议使用 run 而不是 do 命令。虽然两个命令都可以执行 do 文件,但是 run 命令在屏幕上不显示任何结果,而 do 命令会在屏幕上显示任何结果。

3. do 文件规范

3.1 为 do 文件写一份说明书

首先,需要在 do 文件的开头写上几行,明确指出该程序的主要目的,包括时间、项目名字、原始数据集、合并后的数据、核心变量解释、结果输出等。

其次,尽可能多的为程序添加注释,比如解释为什么要对一个变量进行缩放 (scale a variable),或是在合并数据前详细说明所使用的数据集。

* ================================================
* Date:August 2011
* Paper:Production and Geography
*
* database used:- Production.dta
*               - Gravity.dta
* output:Prod_Grav.dta
* key variables:
*   - Production in manufacturing sector
*   - Regional distances
*   - Regional price indexes
*
* ================================================

当然,也可以使用 dotemplate 命令自动生成一份 do 文件模板,详见 Stata:dofile模板DIY-速来认领吧

3.2 明确 do 文件的工作地点

当我们定义数据集与 do 文件保存目录时,一个有用的技巧便是使用全局变量。global 定义的变量会在运行期间一直起作用。要调用一个全局变量,需要在变量前使用符号 $

clear all
* 定义当前工作路径
global PATH "F:\Production"
cd $PATH

* 进阶版
global PATH "F:\Production"  //工作路径
global D    "$PATH\data"     //原始数据
global R    "$PATH\refs"     //参考文献
global Out  "$PATH\out"      //结果:图形和表格
adopath +   "$PATH\adofiles" //外部命令 
cd "$D"

* 注意:需要提前在"F:\Production"文件夹内,
* 预先新建"data""refs""out""adofiles"等子文件夹

这样的好处是导入此路径下任何 do 文件或数据集,只需输入 use dataset1, clear 即可,而不用 use F:\Production\data\dataset1, clear。同样,也可以直接将新生成的数据或 do 文件保存在当前工作路径。这将极大提高代码效率,也会使 do 文件结构更加清晰。

3.3 给变量起一个有规律的名字

在使用新数据集时,首先要做的事情便是创建变量。有时我们需要创建很多变量。请遵循:制定自己的规则并坚持下去! 这意味着:

  • 给出明确的名字;
  • 永远按照相同的命名规则。

例如,如果你想在名字的末尾加上数字,比如 export99、export00、export01,那么就坚持规则:“变量的名字” + “两位数字”,并尝试对后续变量采用相同规则。或者,你可能更喜欢在名字和数字之间插入一个下划线:“变量的名字” + “_” + “两位数字”。但请不要混合使用两种命名规则。

关于变量标签,建议制作一个只包含标签的 do 文件。这避免了代码被过多的标签声明卡住,并且使任何修改都变得非常直接:打开 do 文件,更改标签,保存它,然后运行 do 文件。

3.4 为 do 文件每部分起一个明确的标题

对代码中的重要部分给出明确的标题,如 Merging,General Statistics,Labels,Regression in Cross-section 等等。

    * =====================
    * Merge the two dataset
    * =====================

* Production dataset
use Production,clear
sort year pays
save,replace

* Gravity dataset
use Gravity,clear
sort year pays
merge yera pays using Production
tab_merge

3.5 巧用循环语句简洁代码

另一种组织代码的好方法是有效使用循环语句如 foreach

foreach var in varl var2 var3 var4 var5 {
    replace `var'=`var'/6.55957 if year==1999
    gen `var'2=`var'*`var'
    gen l`var'=ln(`var')
}

#delimit 命令能让我们的代码更容易阅读,它允许我们在几行上写一个命令。具体地,#delimit ; 意味着下面的命令会在 Stata 遇见符号 ; 时结束。#delimit cr 意味着再次回到 Stata 的惯常工作方式。画图时这个命令很有用。

* 散点图
sysuse uslifeexp2, clear
#delimit ;
scatter le year , msize(*0.3 ..) 
    title("图1 散点图示例", margin(0 0 3 0) size(*0.8))
    ytitle("预期寿命") 
    xtitle("年份") 
    saving(Fig1_scatter, replace);
#delimit cr
* 注意:一定要在命令的结尾写上 “;”

4. 结果输出

4.1 回归结果输出

回归结果表是 do 文件最重要的输出之一,建议表格中只呈现出最核心的内容,变量细节等可以放在脚注中解释。eststoesttab 命令可以帮助我们按照自己的偏好快速输出结果。比如:

  • 输出 LaTex、cvs、html 等格式文件;
  • 指定显著性水平的符号;
  • 是否使用标签等,详见帮助文件。

建议使用 esttab 命令,因为它可以在 Stata 结果窗口中生成回归表 (这样它就保存我们的日志文件中,防止电脑突然罢工时,我们丢失回归结果) ,并能够按照我们所选的格式导出相应文件。

全局变量在回归时也十分有帮助。为了避免重复这些变量,我们可以定义一个全局变量表示这些变量。

    * =====================
    *      Regressions
    * =====================

* 定义全局变量
global Gravity "gdp_d gdp_o dist_od"

* 下述两行命令的作用是一样的
eststo:xtreg x_od $Gravity            ,fe i(iso_i)
eststo:xtreg x_od gdp_d gdp_o dist_od ,fe i(iso_i)

eststo:xtreg x_od $Gravity border_od  ,fe i(iso_i) // 添加感兴趣的变量

* 在 LaTex 表格中展示回归结果
#delimit;
esttab, b(%5.3f) se(%5.3f) r2 se     label nogaps
        starlevels({$^c$} 0.1 $^b$} 0.05 $^a$} 0.01 );
* 导出 Reg1.tex 格式文件
esttab using Reg1.tex , b(%5.3f) se(%5.3f) r2 se tex label nogaps
       starlevels({$^c$} 0.1 $^b$} 0.05 $^a$} 0.01 ) replace;
#delimit cr

另一种常用的回归结果输出命令是 outreg2 命令,功能基本相同,但与 estout 相比有不同的特点。

  • 优点是:适用于所有回归命令和所有版本 Stata。
  • 缺点是:
    • 需要在每个回归命令之后编写 outreg2 命令;
    • 如果要导出存储的估计值,必须在 outreg2 命令的末尾使用 estout 命令;
    • 只能用于导出回归表格,并不会在结果窗口显示回归结果,因此不会保存在日志文件中。

outreg2 命令如下 (其中 file1.txt 是包含前文回归结果的文本文件):

xtreg 1x countryDum* $Global1,i(year)
outreg2 using file1.txt,nocons label dec(3) label adjr2 drop(countryDum*) replace
xtreg 1x countryDum* $Global2,i(year)
outreg2 using file1.txt,nocons label dec(3) label adjr2 drop(countryDum*) append

4.2 图形输出

图形也是 do 文件最重要的输出之一,常言道:一图胜千言!需要注意的是,当我们以不同的格式保存图片时,应使用命令 graph export 代替 graph save。基本用法如下:

graph save Trade_Distance.gph, replace
graph export Trade_Distance.eps,as(eps) replace
graph export Trade_Distance.png,as(png) replace
graph export Trade_Distance.wmf,as(wmf) replace

两条建议

  • 首先,可以使用 set 命令为输出图形设置统一格式,比如 set schmo1 等,也可以自定义图形输出的格式。
  • 其次,不建议在图形中添加标题,因为 Stata 不太擅长处理长标题。我们可以在论文中为图形添加标题。

5. 小技巧

最后一部分主要介绍一些 Stata 中十分有帮助的命令。

  • set more off:当执行的命令在结果窗口上产生大量输出时,Stata 会在某一时刻停止,等待我们按下 Enter 键或空格键后再继续运行。为了避免这种情况,可以在代码开头加上 set more off
  • quietly:告诉 Stata 不要在结果窗口上显示命令的执行情况。当我们想要通过循环创建大量变量时,这一点尤其有用。
  • capture:允许程序即使遇到错误也能往下运行,这对于耗时很久的程序很有帮助。因为我们不希望程序仅仅因为一条命令行 (例如你写错一个变量名) 中存在微小错误而停止。
  • collapse:一种重新整理数据的有效工具,可以根据原始变量计算出许多统计量,参考如下:
* 计算 exports 的数量,firms 的数量
* 操作后,数据中每个 year-country 仅会保留一个观测值
collapse (sum) x (count) firm,by(year country)
* 更多用法请 help collapse
  • tag():该命令在每次遇到指定变量的不同值或几个变量的不同值时都会创建取值为 1 的虚拟变量。这在处理多个维度的数据集时尤为重要。例如,我们的数据集包括 Year × Country × Product 三个维度,想要统计其中 Country 的数量,这时 tag() 命令将创建一个变量,该变量在每个国家出现时取 1。
egen tag_cty=tag(country)
gen nb_cty=sum(tag_cty)
  • group:其工作原理与 tag() 命令相同。它会新生成一个变量,每当遇到一个变量或一组变量的出现时,取不同的值。在面板回归中,字符串变量不能使用固定效应,解决这个问题的一种方法是创建一个组变量,简单参考如下:
egen country_time=group(country time) 
// 根据 country 和 time 两个变量进行分组

* 结果如下
country	time	country_time
cty1	year1		1
cty1	year1		1
cty1	year2		2
cty1	year3		3
cty2	year1		4
cty2	year2		5
cty2	year2		5
cty2	year2		5

6. 相关推文

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