Stata数据处理:快来更新你的Stata-Workflow

发布时间:2022-03-22 阅读 2383

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

作者:初虹
E-mail:chuhong@mail.sdufe.edu.cn
个人公众号:虹鹄山庄

本文编译自 @Asjad Naqvi:The Stata Workflow guide,特此致谢!


目录


作者介绍

Asjad Naqvi,目前在奥地利维也纳工作,任职于维也纳经济与商业大学国际应用系统分析研究所(WU·IIASA),研究兴趣相当广泛,主要包括环境不平等、金融在气候政策中的作用和其连锁影响等。擅长 Stata、Mathematica、NetLogo 等编程语言,在主流社交平台就运营账号,且颇具影响力。

0. 前言

编程时人们往往容易忽略结构化(structuring)文件和文件夹。大多数时候,这被留到了最后一步——论文提交的时候。相反,工作流管理(workflow management)应该是极其重要的,值得放在第一步(first step)来做,否则日后就会浪费很多时间来弄清楚自己到底做了什么、文件到底在哪里、最新的代码保存在哪里等等。这不仅是对自己负责,也是对合作者(co-authors and collaborators)或者试图复制你代码的人负责。一个好的工作流管理系统应该是,当你打开一个旧项目时,你可以立即找出所有的文件在哪里。

A good litmus test of a good workflow management system is that when you open an old project, you can immediately figure out where all the files are.

本指南中,作者将介绍自己的 Stata 工作流管理体系,这些工作流技巧可以扩展到任何编程软件的任何项目。本指南分为六个部分,本文中笔者将第六部分整合进第四部分中。

  • 第 1 部分:文件夹(Folders
  • 第 2 部分:命名规则(Naming conventions
  • 第 3 部分:拆分 dofileSplitting tasks across dofiles
  • 第 4 部分:文件相对路径(Making use of relative file paths
  • 第 5 部分:风格化代码(Styling your code
  • 第 6 部分:链接多个 dofileLinking different dofiles

1. Part1:文件夹的结构组织和内容的「分门别类」

一个项目(project or paper)从开始不成熟的 idea 到最终完成、发表,会涉及到的文件量规模不小。这些文件都应该在文件夹folder)中进行分类(sort)。

仅在数据分析部分,就包括下载的原始数据(raw data)、清洗数据的脚本(script)、生成各种图表(tables and graphs)和所有这些文件的不同版本(version)。除此之外,还有写作部分生成的文件或文件夹,比如文献(literature)资料、Word 或 LaTeX 等文件及版本。

作者认为一个项目的文件结构应该如此所示
作者认为一个项目的文件结构应该如此所示
  • raw:包含所有的原始文件
  • dofiles:包含所有用于处理、清理和分析原始文件的脚本
  • temp:包含从原始数据中生成的中间文件
  • master:包含准备用于分析的最终数据
  • GIS:包含空间地理文件
  • graphs:包含图表

作者在这里还区分了小项目(small project)和大项目(large project)的文件夹结构的不同之处。

1.1 小型项目的组织

作者建议小项目(small project)应该采用的文件夹结构
作者建议小项目(small project)应该采用的文件夹结构

对于这幅组织结构图的大意,作者似乎不需要特意说明,读者也可以不言自明。不过还有两点需要特别注意。

TIP:按照文件夹的使用顺序进行编号。

举个栗子,项目完成过程中,会先获取到原始数据(01_raw),然后再编写 dofiles(02_dofiles)。在写 dofiles 时,你会创建临时文件(03_temp),之后再保存在主文件夹(04_master)中。你也可能有空间数据(spatial data),可以在自己的文件夹中进行(05_GIS)。一旦数据清洗完毕,就可以用来生成表格(06_tables)和图形文件(07_figures)。

添加数字前缀 会让各个文件夹按照你想要的方式排序,这比按字母排序的方式更清晰易懂,不仅方便自己回顾,也能极大地方便别人。

TIP:文件或文件夹名中尽量避免使用空格(spaces)、连字符(-)或大写字母(capital letters)。

因为一些特殊字符在旧系统中会出现错误,比如,有时你可能会看到 URLs 中的空格被替换成 %20~#@!!%^&-。虽然,技术上来说,Stata 可以读取包在双引号 "" 中、含有空格的文件名,但作为一个好的做法是,无论文件名抑或文件夹名,都最好使用下划线underscores)连接。

1.2 大型项目的组织

作者建议大项目(large project)应该采用的文件和文件夹结构
作者建议大项目(large project)应该采用的文件和文件夹结构

作者这里提到的「大型项目」单个数据文件大小以 GB 计,比如作者举例其正在使用的微观人口普查数据(micro census data),脚本的运行甚至要通宵进行。

这里的「数据」文件夹只有原始数据和清洗原始文件的 dofile。目的是为了在主文件夹中生成 最终 的数据文件。这种设置对于那些在数据处理和加工方面非常庞大的项目来说非常有效。

数据文件夹中的 dofile 目的是在做完各种清洗、合并、处理等工作后把所有的东西放在一起,因此数据使用一个单独的文件夹也可以帮助整齐地记录步骤,而且大多数时候,一旦创建了最终的数据集,把数据放在一起的大型脚本就显得多余了,除非需要做一些修改。一旦主文件被创建,数据管理的这一部分基本上应该保持不动。

主数据文件可以应用在多个具体的项目文件(paperX)中,该文件夹与小项目文件夹的结构相同,但它还包含一个设置文件(setup file)用于进一步合并、追加、修改数据。所以这里的「数据」文件夹中的主数据集基本上扮演了论文文件夹中的原始数据的角色。

TIP:扔掉你在特定论文中不需要的变量,每一个未使用的数据点都是内存的一个负担。

在数据集中加载的无用变量会占用内存,如果文件很大,你的电脑也会不堪重负。另外,这也有助于分析部分,因为我们不必滚动浏览几百个「无用」的变量。

TIP:写一个 readme.txt 文件。

虽然看起来很麻烦,但 readme 文件确实有很大的帮助!这里可以包括文件和文件夹的具体次序信息,在哪里以及如何访问原始数据的信息等等。

2. Part2:合适的命名

细看上图,作者的心思不仅花在文件夹的排布上,文件名也起得大有妙处。添加数字前缀有助于分类和与工作流程保持一致;添加版本后缀便于保持跟踪(_v1_v2)等等。版本号也可以用日期来代替,例如 01_setup_210531.do01_setup_210602.do 等。这里的命名规则对所有的 dofiles、图、表、Word 文件均有效,虽然麻烦,但绝对受用。

TIP:当使用日期时,应该遵循 yymmdd年月日)格式,避免 ddmmyymmddyy 的格式。这将自动按照正确的顺序对文件进行排序,最新的文件显示在前面。

TIP:隐藏旧的文件版本。

绝大多数时候,旧版本是多余或无用的(redundant or useless)。大胆删除它们,或把它们扔进一个临时文件夹里。定时做一些清理工作(housecleaning),尽可能地保持主文件夹和子文件夹的整洁。

3. Part3:每个 do 文件只做一件事儿

按照项目完成的顺序(sequence and order)组织 dofiles 将拥有一个清晰的脉络,作者举例如下:

01_setup.do 
02_merge.do 
03_tables.do
04_regressions.do
05_figures.do
06_master.do

当然,每个层级下还可以进一步细化,比如,按照用途再次细分:setup_emissions/setup_economic,或者按照结构细分:table1/table2,或者使用日期做版本控制(但一定要使用 yymmdd 格式)。

* 01_setup_v4.do
	* 01_setup_emissions_v1.do
	* 01_setup_economic_v4.do
* 02_merge_v2.do
* 03_tables_v11.do
	* 03_table1_v1.do
	* 03_table2_v4.do
* 04_regressions_v15.do
	* 04_regression1_v2.do
	* 04_regression2_v6.do
* 05_figures_v2.do
* 06_master_v1.do

项目的初始阶段通常比较混乱,作者建议两点:

TIP:在同一 dofile 中划分代码 (partition the code

如果你要在同一个 dofile 中生成不同的图、表,一定要写清楚便于日后在 dofile 里分割,或者直接分割为不同的 dofile。

TIP:将变量生成(variable generation)移到 dofile 的开头,或者最好是在 setup.domerge.do 中。

理想情况下,文件所需的核心变量应该放在 setup.do 中;如果要从不同的文件中生成变量,也可以放在 merge.do 文件中;如果确实需要在特定的图表文件中生成变量,那也不要把代码放在 dofile 中间,应该把它们都集中在 dofile 的开头,并尽可能地对它们进行注释。

最后一个 dofile *_master_*.do 比较特殊,可以在不破坏数据的情况下一次性运行所有内容。为了做到这一点,最好使用相对路径(relative paths),下节会介绍。

**** <some project info here> ****
clear
<some directory setting stuff here>
<some paths to folders. usually defined as globals>
<other macros for tables/regressions here>

// run all the dofiles
do ./dofiles/01_setup_v11.do
do ./dofiles/02_merge_v2.do
do ./dofiles/03_tables_v4.do
do ./dofiles/04_regressions_v5.do
do ./dofiles/05_figures_v2.do
*** END OF FILE ***

所以,除了 *_master_*.do 之外的 dofiles 主打数据分析,而 *_master_.*.do 则进行 dofiles 管理。

该图展示了作者如何在 master.do 整合其余 dofiles
该图展示了作者如何在 master.do 整合其余 dofiles

TIP:每个 dofile 应该能够独立运行。

任何时候,都应该避免让某个 dofile 依赖于主文件或其他定义的路径等。

TIP:如果你正在运行多个 dofiles,那么要确保当一个单独的 dofile 结束执行时,它总是重置到运行下一个 dofile 所需的目录级别。

在上面的左侧截图中,单个国家的 dofiles 会在特定国家的原始文件夹中进行清洗和合并,但每个国家的 dofile 在最后都被移动到根目录。

总而言之,可以让各个 dofile 依赖于主 dofile 中定义的参数(路径、宏、包等),但每个 dofile 必须能够独立运行,或者至少应该包含允许它独立运行的信息。

4. Part4:在 dofiles 中使用相对路径

相对路径是工作流顺利运行关键,并学着使用宏(globals、locals)定义文件路径。

TIP:文件路径一定要使用正斜杠 /

宏包含全局宏(global)和局部宏(local),区别是一个代码实例结束后,locals 便会消失,而 globals 会永久地存储在内存中,直到关闭 Stata。虽然可能会有风险,但在定义路径方面颇有用处。

clear
*** replace this with your main directory path
global projectdir "C:/Program files/Dropbox/myproject/"
global graphdir "$project/graphs"
global tabledir "$project/tables"
cd "$projectdir"
cd "$graphdir"
cd "$tabledir

你看,这里的主项目路径便是完整的目录,而图表的路径就是相对路径,定义完之后,可以用 $ 来调用。当然,这也可以用 locals 完成,但这意味着所有东西的运行都是一次性的,因此如果你要在不同文件之间交换,并在不同的代码块上工作,请一定要使用 globals

TIP:确保全局名称不与变量名称相冲突。

这对于主数据集完全存储在其他地方的大型项目也非常有用。例如,作者通常会把非常大的文件放在硬盘上,把 dofile、数据子集、图表留在 Dropbox 上。因此,globals 帮助我非常有效地浏览项目中完全独立的部分。

5. Part5:代码风格化

  • 注释:Commenting
  • 跨行拆分过长代码 ///
  • 用于间隔的制表符 tab
* comments on individual lines
// comments on individual lines and after some code
/*   // for marking out code blocks
*/

twoway                               ///
   (connected y1 x1, msize(vsmall))  ///
   (connected y2 x2, msize(vsmall))  ///
       ,                             ///
       xlabel(-1(0.5)1)              ///
       ylabel(-1(0.5)1)              ///
           xline(0)                  ///
           yline(0)                  ///
           aspect(1)

6. 相关推文

Note:产生如下推文列表的 Stata 命令为:
lianxh dofile 习惯 规划 流程 数据处理
安装最新版 lianxh 命令:
ssc install lianxh, replace

相关课程

免费公开课

最新课程-直播课

专题 嘉宾 直播/回看视频
最新专题 文本分析、机器学习、效率专题、生存分析等
研究设计 连玉君 我的特斯拉-实证研究设计-幻灯片-
面板模型 连玉君 动态面板模型-幻灯片-
面板模型 连玉君 直击面板数据模型 [免费公开课,2小时]
  • Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。

课程主页

课程主页

关于我们

  • Stata连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 连享会-主页知乎专栏,700+ 推文,实证分析不再抓狂。直播间 有很多视频课程,可以随时观看。
  • 公众号关键词搜索/回复 功能已经上线。大家可以在公众号左下角点击键盘图标,输入简要关键词,以便快速呈现历史推文,获取工具软件和数据下载。常见关键词:课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法

连享会小程序:扫一扫,看推文,看视频……

扫码加入连享会微信群,提问交流更方便

✏ 连享会-常见问题解答:
https://gitee.com/lianxh/Course/wikis

New! lianxh 命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh