Stata 简介

作者

连玉君

发布于

2025年1月3日

这份讲义旨在介绍 Stata 的界面、主要功能,以及使用 Stata 进行实证分析的工作流程。

我一直秉承「干中学」的理念。因此,在阅读这份讲义时,我强烈建议大家不时停下来,在 Stata 中亲自操作一下。将重点内容记录下来,并形成两份笔记:一份是包含关键 Stata 代码的 dofile,以便日后查阅和调用;另一份是 Markdown 笔记,内含每个知识点的相关链接和参考资料,以及你对关键命令和代码的解释。

0. Stata 概览

0.0 实证分析的流程

  • [1] 一个想法:研究假设
  • [2] 模型设定
  • [3] 变量界定
  • [4] 收集数据、数据清洗、生成变量
  • [5] 统计和回归分析
    • 支持 → [6]
    • 不支持 → [1]-[5]
  • [6] 解释结果、结论

:dog: 讨论:在上述过程中,Stata 的角色和作用是什么?

0.1 Stata 工作流程

图 1 呈现了 Stata 的接本工作流程。

图 1: Stata_intro_实证分析流程

0.2 Stata 基本语法格式

在 Stata 命令窗口中输入 help language 命令,可以查看其基本语法规则。

[U] 11 Language syntax ← Stata 的基本语法格式都在这里

Stata 语法格式

0.3 Stata 学习资源

0.4 Stata 用户指南:最好的入门资料

Stata_手册目录

Stata_手册目录

0.5 Stata 命令概览

Stata 各类方法和模型汇总 → stata.com/features

0.7 推文 · 数据 · 代码:lianxhsongbl

安装

. ssc install lianxh
. ssc install songbl

使用:

. lianxh 
. lianxh DID
. songbl 
. songbl 静态面板

lianxh 命令和 songbl 命令

0.8 Stata 功能概览

Note:点击蓝色链接可以直接打开对应的 PDF 手册,查看命令清单

0.9 你必须掌握的一些 Stata 命令

:apple: PDF:[U] 28 Commands everyone should know

  • Getting help
    • help, search,
    • ssc install, net install
    • lianxh
  • Keeping Stata up to date
    • ado, net, update, ado update
  • Operating system interface
    • pwd, cd, dir, sysdir, adopath, shellout
  • Using and saving data from disk
    • use, save, sysuse, webuse, bcuse
  • Inputting data into Stata
    • import excel, insheet, edit
  • Basic data reporting
    • describe, des2, codebook, fre
    • list, browse, count, inspect
    • table, tabulate, summarize, fsum
  • Data manipulation
    • clear
    • append, merge, reshape
    • generate, replace, egen, drop, keep, rename
    • sort, gsort, order
    • encode, decode
    • by, bysort
    • frames
  • Graphing data
    • twoway scatter / line
    • histogram, kdensity, graph bar
    • graph export
  • Convenience
    • display, cls

1. Stata 主界面

对于新手来讲,请务必花点时间全面了解一下 Stata 的用户界面,以便了解 Stata 的主要功能,这对于有效地使用Stata进行数据分析至关重要。详情参见 Stata user interface

图 1:Stata 主界面

1.1 窗口布局及小技巧

默认情况下,Stata 的主界面会显示以下五个窗口:

  • 结果窗口:正中间面积最大的窗口,用于展示分析结果。
    • 右击后选择「首选项 (P)」,即可设定窗口的配色、字体大小等外观参数。
  • 命令窗口:在此可临时输入简短命令,如 help regressfindit winsorssc hotadopathlianxh DID 等。
    • Esc 键可清空命令窗口中的全部内容。
    • PgUp / PgDn 键可翻看此前执行过的命令。
    • 输入变量名首字母后按 Tab 键,可自动补全变量名或显示备选变量列表。
    • 输入 cls 并回车,可一键清空结果窗口。
  • 历史窗口 (Review Window):列示此前执行过的所有命令。
    • 单击某条命令,则其会显示在命令窗口中,便于修改与检查。
    • 双击某条命令,则立即再次执行该指令。
  • 变量窗口:列出当前数据集中的所有变量及其标签信息。
    • 双击某个变量名,即可将该变量名直接插入至命令窗口中,减少手动输入量。
  • 属性窗口:显示所选变量或数据集的详细信息,包括数据类型、格式、值标签、注释以及存储类型等。这有助于你快速了解并管理变量的属性。

小技巧 (Tips)

  • 窗口布局(适合有一定使用经验的用户)
    • 如果你偏好「一边执行命令,一边查看结果」的简洁工作环境,可只保留 结果窗口命令窗口,同时将 dofile 编辑器 调整至屏幕半侧大小,方便同时查看代码和结果。
    • 如需恢复先前关闭的窗口,只需从主菜单中选择「窗口」进行还原。
  • 窗口属性设置(适用于大多数窗口)
    • 在窗口空白处右击,可设定字体、字号、配色等界面参数。
    • PgUp / PgDn 键可以翻页浏览内容。

极简版窗口布局

我平时关闭主界面中的多余窗口,仅保留 命令窗口结果窗口;同时,我会把 dofile 编辑器设定为屏幕宽度的一半。这样,我就可以在右侧的 dofile 中执行命令,在左侧的结果窗口中查看结果。需要切换窗口时,可以使用快捷键 Alt + Tab。当然,如果你是两个显示器双屏显示,那就更方便了。

若需恢复已经关闭的窗口,可以点击 窗口 (W) 菜单进行设置。

图 2:简洁版 Stata 界面

图 2:简洁版 Stata 界面

1.2 主菜单

Stata 主菜单
  • 顶部和底部
    • 顶部:显示了 Stata 版本和当前内存中已经读入的数据集
    • 底部:左下角显示了当前的工作路径。若执行 dir, use 等命令,默认是浏览或调用该文件夹下的文件。
  • 主菜单
    • 文件 (F):打开/保存文件、导入/导出数据、打开示例数据集、管理项目文件
    • 编辑 (E):复制、粘贴、查找/替换文本、清除结果窗口、用户偏好设定
    • 数据 (D):浏览/编辑数据、创建或修改变量、对数据进行排序、合并拆分数据集、设定变量标签和数值标签
    • 统计 (S):运行回归、检验、面板数据分析、时间序列分析、计量经济学模型估计、非参数统计等各种统计分析方法
    • 图形 (G):绘制散点图、柱状图、线形图、箱线图等图形,定制图表外观与格式
    • 用户 (U):加载用户编写的程序扩展、插件、脚本文件等 (很少用)
    • 窗口 (W):在命令窗口、历史命令窗口、变量窗口等界面元素之间切换与管理
      • 可以临时关闭 / 开启特定窗口
    • 帮助 (H):访问 Stata 帮助文档、检索命令手册、查看更新日志、联系技术支持

建议新用户依次点击上述菜单,以便快速了解 Stata 的主要功能。

1.3 按钮条 (图标)

主菜单下方有一行图标,是一些常用功能的直达通道:

Stata 按钮条

1.4 文件 (F) 菜单

文件 (F) 菜单主要涵盖如下功能:

  • 打开数据文件
  • 导入/导出数据
  • 更改工作路径
  • ……
  • 全都可以用命令实现 (尽量用命令)

这里重点说明一下 导入 (I)示例数据集 两个菜单:

  • 导入 (I):支持多种数据格式的导入,如 .xlsx, .txt
  • 示例数据集:提供了一些可供演练的数据集,包括:
    • Stata 自带的 26 个数据文件,这些文件都可以使用 sysuse 命令调用,如 sysuse auto.dta, clear
    • Stata 手册中使用的各类范例数据文档清单,均可使用 webuse 命令调用,如 webuse nlswork.dta, clear。除了点击菜单,也可以使用如下命令查看上述数据文件列表:
    help dta_examplels
    sysuse dir  // 此处列出的数据文件都可以用 sysuse 命令调用
    help dta_manuals

1.5 Edit (E) 菜单:界面风格

Stata 主界面:Edit 菜单

编辑菜单中的多数功能都一目了然,不再赘述。需要特别关注的是「首选项 (Preference)」子菜单。我们可以根据自己的喜好设定多种 Stata 界面的配色、字体等的风格,并将这些设定风格保存为模板,以便随后调用。

个性化设定

  1. 在 Stata 的任何一个窗口中都可以通过 右击鼠标 来设定 字体属性
  2. Stata 主界面设定:在 Stata 结果窗口中,右击鼠标Preference 可以进一步设定结果窗口(Results)文件浏览器(Viewer)数据编辑器(Data Editor)等窗口的属性,主要涉及字体是否加粗颜色窗口背景色等。
  3. dofile 编辑器设定:打开 dofile 编辑器 (快捷键为:Ctrl+9,或者在命令窗口中输入 doedit ),依次点击 EditPreferences,会弹出如下 Do-file Editor Preferences通用属性 (General) 设定的对话框。详情参阅后文 dofile 编辑器 小节。
  4. 保存/更换模板:上述设定,都可以保存到一个模板中。Stata 支持多种模板,可以让你在早、中、晚使用不同的模板,既能调节心情,又能保护视力。

模板的使用

你可以根据不同场景的需要,设置不同的风格,并保存为多个模板,随后根据需要调用即可。

  • 新建模板:编辑 (Edit)首选项保存首选项设置 (S) → 新建首选项设置,自行定义模板名称,然后 确认 即可。
  • 更换模板:编辑 (Edit)首选项加载首选项设置 (L)

1.6 数据/图形/统计菜单

这三组菜单集合了 Stata 最主要的功能。菜单栏包括文件、编辑、数据、图形、统计、用户、窗口和帮助等功能。每个主菜单下都有多个子选项,提供各种数据管理和分析工具。

  • 数据(D):涉及数据管理与分析,如数据汇总、描述性统计、线性模型、数据编辑器等。常用命令包括:
    • browse: 浏览数据表
    • edit: 编辑数据表
    • describe: 描述内存中的数据概况
  • 图形(G):包含多种图表选项,如散点图、折线图、条形图、饼图、直方图、箱线图等。
  • 统计(S):提供高级统计分析功能,如假设检验、广义线性模型、时间序列分析、生存分析等。
  • 用户(U):可能包含用户设置或自定义选项,如界面布局的个性化设置。
  • 窗口(W):管理打开的窗口,如排列或切换窗口,以便更有效地组织工作空间。
  • 帮助(H):提供文档、教程和支持资源的访问,是一个全面的帮助系统。

此外,界面可能还包括工具栏,其中有常用功能的图标,如新建数据、打开文件、保存等。软件可能还具有数据编辑器或数据查看器,位于中心位置,配有输出、图表和脚本的面板或窗口。

数据/图形/统计菜单

2. Stata 工作流程

2.1 工作流程概览

Source: 连玉君, 陈鑫梅, 2020, 可重复性研究:如何保证你的研究结果可重现?, 连享会 No.124.

图 3 展示了一个典型的实证分析工作流程。你在本地或网盘中的文件夹中存如原始数据文件,然后在 Stata 中执行命令,以实现数据读入、清洗和分析,最后把结果输出成表格和图形,嵌入到 Word 或 TeX 文档中。

简言之,我们要实现「数据 → 代码 → 结果 → 文档」的有机衔接,让研究流程清晰透明,也方便日后重复或更新分析。

Stata 工作流程示意图

图 3:Stata 工作流程示意图

左:本地文件夹

本地文件夹:D:/paper/myAER,其中包含三个文件夹和一个 dofile:

  • “./data0”:存放原始数据文件,如 data_org.xlsx
  • “./dataClean”:存放清洗后的数据文件,如 data_clean.dta
  • “./out”:存放输出结果,如回归表格 Table01.rtf 和图形 Fig01.png
  • dofile_myAER.do:Stata do 文档,记录所有处理过程。

采用这种分类管理方式,无论是查看数据源还是寻找输出文件,都能快速定位。与合作者分享论文复现资料时,也只需分享 dofile_myAER.do 和 “./data0” 子文件夹即可。合作者运行 dofile_myAER.do 后变会自动生成清洗后的数据文件和结果文档。

右:dofile

右上角打开的 dofile_myAER.do 是我们向 Stata 下达指令的脚本文件 (dofile)。具体解释如下:

  • 首先,使用 global path "D:/paper/myAER" 命令,指定了项目文件所在路径,并以此为基础定义了几个相对路径。在后续命令中,便可以使用 $path$data0 等全局暂元来引用这些路径,而不必每次都手动输入完整路径。你的合作者只需酌情修改第 4 行的文件路径 (绝对路径),而无需做其他更改。
  • 接下来,在 dofile 中写好一系列命令,以便完成数据导入、清洗、回归以及结果输出等一整套流程。有了 dofile,只需轻轻点一下执行按钮,就能让整套分析重复进行,也可以让修改和完善工作更有效率。
  • dofile 中的第 15, 20 和 24 行都用于输出结果,分别将清洗后的中间数据,回归表格,以及生成的图形存储到项目文件夹 D:/paper/myAER 中的指定子文件中。随后你只需将这些表格和图形插入论文 Word 文档中即可。

中:Stata 主界面

在 Stata 的主界面中会呈现回归结果、显示输出的图片等。比如,

  • 执行 reg price wei mpg, robust 命令后,可以在 Stata 的结果窗口查看回归结果
  • 进一步执行 esttab using "$path/out/Table01.rtf", replace 命令时,结果窗口中会显示自动输出的 .rtf 文档 (等同于 word 文档) 的存储路径 (单击蓝色链接可以打开此文档)。
  • 执行第 22-23 行的命令后,就会绘制散点图,并将图片以 .png 格式存储到 $out 文件夹中。

小结

总之,dofile 就像一个中心控制台:我们在 dofile 中下达命令,以便从指定路径中导入 Excel, txt, dta 等格式的数据文件,进而进行统计和回归分析,并最终将输出的图形、表格等结果保存到指定文件夹中,以便随后插入 Word, TeX 等写作文档中。

2.2 Stata 安装路径和个人文件夹的设置

安装 Stata 时,文件路径中尽量不要包含中文、空格和特殊字符。否则,会导致涉及读写或保存文档的程序无法运行。我个人通常将 Stata 安装在 D 盘根目录下,如 D:/stata17

我会在 D 盘中另外建立一个文件夹 D:/stata,其中,

  • 新建 personal 文件夹,用以保存我自己的数据和程序文件;
  • 新建 plus 文件夹,用以存放外部命令。

这样做的好处是,无论 Stata 更新到哪个版本,我个人的文件都不会受到任何影响。例如,更新到 Stata 18 后,我只需将 D:/stata17/profile.do 文档复制到 D:/stata18 目录下即可。

Stata 17 目录下的文档结构

Stata 安装目录 D:/stata17/ 的文档结构如下:

D:/stata17:: 
                             --- 解释 ---
├── ado
│   └── base           |  Stata 官方提供的程序文件(按 _, A-Z 分类)
├── docs               |  Stata 电子手册(PDF 格式),便于查阅
└── utilities          |  包含 JAVA、Python 等插件和工具
│  profile.do          |  Stata 启动时自动执行该文件中的命令
│  mp-64.dll           |  Stata 运行所需的动态链接库文件
│  STATA.LIC           |  Stata 的许可证文件,用于验证软件合法性
│  StataMP-64.exe      |  Stata 的主执行文件,用于启动程序
│  StataMP-64_old.exe  |  旧版本的 Stata 执行文件(备份或兼容用途)

说明如下:

  • 不要随意修改 ado/base 目录中的文件,以免影响 Stata 的正常运行。
  • 可以通过编辑 profile.do 文件来定制 Stata 的启动行为,例如设置工作目录或加载常用脚本。后文会详细介绍。
  • 如果需要使用插件或外部工具,可以将相关文件放置在 utilities 目录中,确保路径正确。我们通常无需自行设定,再安装或关联外部插件时,Stata 会自动将相关文件存入此处。

个人文件夹的文档结构

存放我个人文档的目录 D:/stata/ 的结构如下:

D:/stata::
                             --- 解释 ---
├── personal           |  存放个人文档 (数据, dofiles 等)
│   ├── data
│   ├── paper
│   └── ... 
├── do                 |  存放自动生成的日志文件
└── plus               |  存放外部命令

说明如下:

  • personal 目录下可以根据需要设定多个子文件夹,用于分类存储不同项目的文件。基本原则是,一个项目一个文件夹。
  • do 目录用于存放自动生成的日志文件 (log 文件),记录 Stata 运行过程中的命令和输出结果,复现分析过程或排查问题。随后在 profile 文档 部分会有详细介绍。
  • plus 目录用于存放通过 net installssc install 等命令安装的外部命令 (ado 文件)。

当然,你也可以酌情添加其他文件夹。

2.3 工作路径 (Working Directory)

在 Stata 主界面的右下角会显示当前 工作路径/目录(Working Directory),是 Stata 默认的文件读取和保存位置。比如,执行 use mydata.dta 时,默认从当前工作目录下读取 mydata.dta 数据文件 (如果该目录下未保存 mydata.dta 文件,则 Stata 会报错);执行 save newdata.dta, replace 时,newdata 文件会自动保存到当前工作目录下。

要在结果窗口中显示当前工作路径,可以执行 cdpwd 命令。若需切换工作路径,只需在 cd (_c_hange _d_irectory) 命令后写上新的工作路径名称即可,例如 cd "D:/Projects/SJ_paper" (注意:必须是已经存在的文件夹路径)。合理设置工作目录不仅能减少重复输入路径的麻烦,还能让文件管理更加清晰高效,是 Stata 使用中的一项基础但重要的操作。

2.4 profile 文档:开机自动执行的命令

每次启动 Stata 时,他都会到安装目录下查找是否存在名为 profile.do 的 dofile,若有则自动执行该文档中的所有命令 (即,do profile.do)。因此,你可以把一些常规的设定都放在 profile.do 中,比如,plus 文件夹的默认路径,personal 文件夹的路径、显示格式等。

创建和修改 profile.do

Step 1: 查看系统路径。输入 sysdir 命令,确认 Stata 的安装路径 (因人而异):

. sysdir

   STATA: D:/stata17           // !! Stata安装根目录
    BASE: D:/stata17/ado/base  // 官方命令都存放于此
    SITE: D:/stata17/ado/site  // 可以忽略
    PLUS: D:/stata/plus        // (可能没有)
PERSONAL: D:/stata/personal    // (可能没有)

Step 2: 创建 profile.do 文档。在 Stata 命令窗口输入如下命令,以便在 Stata 安装目录 下新建一个名为 profile.do 的 dofile:

doedit "D:/stata17/profile.do"

执行后,会弹出一个空白的 dofile。

Note: 如果执行上述命令后弹出的 profile.do 文档中已经有内容了,则表明你的系统中已经设定了 profile.do 文档,你只需要酌情修改即可。

Step 3: 设定 profile.do 中的内容 → 保存。如下是一个最基本的 profile.do:

*-文件路径设定:外部命令的存放位置
  global path "D:/stata"                 // 个人路径,酌情修改
  sysdir set PLUS `"$path/plus"'         // 外部命令的存放位置
  sysdir set PERSONAL `"$path/personal"' // 个人文件夹位置

我们使用 sysdir set 命令指定了 pluspersonal 文件夹的位置。需要说明的是,global path "D:/stata" 中需要填入你的个人文件夹所在位置,并在该文件夹下预先新建名为 pluspersonal 的文件夹。

Step 4: 查验。重启 Stata,结果窗口应该显示如下信息:

Running D:/stata17/profile.do ...

你还可以做如下测试:

  • 测试 1:在命令窗口中输入 sysdir,显示的信息应该与 Step 1 相同。

  • 测试 2:在命令窗口中输入 ssc install jwdid, replace,安装外部命令 jwdid,结果窗口会显示信息如下:

    . ssc install jwdid
    
       checking jwdid consistency and verifying not already installed...
       installing into D:/stata/plus\...
       installation complete.

可以看到,jwdid 的相关程序文件被正确安装到 Step 3 中设定的 plus 文件夹中。

Step 5: 添加更多的设定。如下是我正在使用的 profile.do 文档,你可以根据自己的需要酌情修改。每次修改完毕后,可以重启 Stata,并按照 Step 4 中介绍的方法进行查验。

*----------------------- profile.do ------------A Sample--
*-基本设定
  set update_query  off  // 不要自动更新
  set more off, perma    // 不显示 -more- 分页提示信息

*-文件路径设定:外部命令的存放位置, 参见 help set 
  global path "D:/stata"   // 统一存放地址
  
  sysdir set PLUS `"$path/plus"'         // 外部命令的存放位置
  sysdir set PERSONAL `"$path/personal"' // 个人文件夹位置  

  cd `"$path/personal"'   // 默认工作路径

*-结果显示格式
  set cformat  %4.3f  //回归结果中系数的显示格式
  set pformat  %4.3f  //回归结果中 p 值的显示格式      
  set sformat  %4.2f  //回归结果中 se值的显示格式   

*-log 文件:自动以当前日期为名存放于 stata/do 文件夹下
* 若 D:/stata/ 下没有 do 文件夹,则本程序会自动建立一个 
  cap cd `"$path/do"'
  if _rc{
     mkdir `"$path/do"'  //检测后发现无 do 文件夹,则自行建立一个
  }
  cap log close
  cap cmdlog close 
  local fn = subinstr("`c(current_time)'",":","-",2)
  local fn1 = subinstr("`c(current_date)'"," ","",3)
  log    using $path/do/log-`fn1'-`fn'.log, text replace
  cmdlog using $path/do/cmd-`fn1'-`fn'.log, replace
*---------------------- profile.do ----------------------

我在码云仓库中放置了两份 profile 文档简化版本完整版本

如果想在 profile.do 中添加更多的设置,可以输入 set 命令查看 Stata 的系统参数设定 ([R] set),也可以输入 cret list 查看你电脑中当前的参数设定。

其它参考资料

2.5 Stata:执行命令和工作机制

我们可以才用过三种方式与 Stata 互动:

  • 点击菜单 (新手适用,老手偶尔为之)
  • 命令窗口 (简单的测试性任务)
  • dofile (主要方式)

Stata 命令的三种执行方式

2.5.1 机制 1:把数据和程序拖入内存中

初学者很怕见到 clear 命令。事实上,如果你了解 Stata 的运行机制,就会明白,clear 是一个非常安全的命令。具体说明如下:

启动 Stata 时,电脑会分配给 Stata 一块 内存空间 (一座大房子)。解读如下:

  • 当我们执行 use D:/myData/auto.dta 命令时,Stata 会把存储于 D:/myData 文件夹中的 auto.dta 文件复制 (copy) 一份,读入内存。随后,执行 sum, reg 等命令时,Stata 都是从内存中读取这个副本数据,而无需再访问硬盘中的数据文件,即 D:/myData/auto.dta。这样的好处是,可以大幅提高运算速度。缺陷在于,但计算机可以分配给 Stata 的内存空间有限时,Stata 会因为无法读入大文件,或运行中出现卡顿现象。
  • Stata 执行程序时也采用了上述逻辑。当我们执行 tabstat var1 时,Stata 会先到 D:/stata17/base/t/ 文件夹下找到名为 tabstat.ado 的程序文件,进而将其读入内存中再执行。当我们再次执行 tabstat var2 时,Stata 会直接从内存中执行 tabstat.ado 副本,而无需再访问硬盘的原始程序文件,即 D:/stata17/base/t/tabstat.ado

Stata 会把「大房子」分成若干个小房间,分类存储 Data, Matrix, 返回值, 程序 等对象。若想清空某个「小房间」,可以使用 clear 房间类型 命令,例如:

  • clear:清空内存中的数据 (分配给 Stata 的内存中的 【Data】 那一块空间)
  • clear matrix:清空内存中的矩阵对象
  • clear results:清空内存中的返回值,如 r(mean), r(N), e(r2)
  • clear all:清空分配给 Stata 的所有内存空间

stata-intro-clear-001

有关 clear 命令的详情,请参阅 help clear,或 [D] clear

作为例子,我们来解释一下如下命令的的含义:

use "D:/myData/auto.dta", clear

上述命令等价于:

clear
use "D:/myData/auto.dta"

也就说,虽然 clear 选项置于命令的末尾,但却是最先被执行的,它会清空内存中已有的数据文件。然后,Stata 从硬盘 (D:/myData/) 中拷贝 auto.dta 文件,并将该副本读入内存。

2.5.2 机制 2:结果呈现和输出

当我们按下图的方式执行 sum price 命令后,Stata 会同时以两种方式输出结果:

  • 方式 1:将部分结果直接呈现于 结果窗口,通常会以特定的格式排列,可读性强。
  • 方式 2:所有计算结果都会存入 内存 (按类别存入不同的 房间)。
    • 这些结果统称为返回值 (return values)。对于 sum, tabstat 等命令,可以使用 return list 命令显示之;对于 regress, logit, xtreg 等回归类命令,可以使用 ereturn list 命令显示之。
    • 这些结果可以被后续代码调用,如 gen x_mean = r(mean)
    • 也可以借助 esttab, outreg2, reg2docx 等命令调用后,输出到 Word 等文档中。

Stata 的返回值机制

简言之,你在 Stata 结果窗口中看到的只是一部分结果,这些结果以及其他相关结果都会被分门别类地存储在内存中,以便其他程序调用。如此以来,我们就可以让多个程序合作,采用「接力」的方式完成复杂的分析任务。

3. Dofile 编辑器

Stata 有三种命令执行方式,对比如下:

  • 点击菜单:直观,但效率低,可重复性差,不推荐
  • 命令窗口:适合一些简短的,测试性的命令
  • dofile:也叫 do文档,适合记录复杂的分析过程,Stata 的程序 (ado) 文件也是在 dofile 编辑器中编写的;便于保存和重复操作,便于分享

任何一个好的研究项目的必备特征就是具有好的重复性,而借助 Do-file 可以轻松地实现结果的可重复性。下面介绍如何使用 Do-file。本节内容主要源于如下推文 (. lianxh dofile do文档):

3.1 新建、保存和打开 dofile

A. 新建和保存 Do-file

方法 1:点击菜单。点击 Stata 主界面第二行倒数第六个按钮 (形似一个空白的记事本上有一支黄色铅笔)。

采用菜单方式新建 dofile

方法 2:使用 doedit 命令。在 Stata 命令窗口中输入 doedit 即可新建一个空白的 Do-file,默认名称为 Untitled.do。更好的处理方法是指定 dofile 的名称和存储路径,例如

  • 输入 doedit myAER,则会在当前工作路径下自动创建一个名为 myAER.do 的 dofile。
  • 输入 doedit D:/paper/myAER,则会在 D:/paper/ 路径下创建一个名为 myAER.do 的 dofile。

Stata_intro_create_dofile_01

我们可以在 dofile 中输入 Stata 命令,随后点击 「保存」 按钮,将其存入指定路径即可。例如,我们可以把新建的 Do-file 保存在 D:/Stata_Ex 文件夹下,名称为 Ex01.do,则该文件的完整存储路径为 D:/Stata_Ex/Ex01.do

注意:Stata 的 do文档 有自己专属的文件类型,后缀为 .do。因此,保存时,请不要更改其默认的文件类型:「Do-file (*.do)」。至于文件名,则没有特殊要求,中英文均可。

B. 打开 dofile

有两种方式可以打开电脑上已经存在的 dofile:命令行方式和菜单方式。

命令行方式

刚才我们新建的 Do-file 的完整存储路径为 D:/Stata_Ex/Ex01.do,因此,我们只需在 Stata 命令窗口中输入如下命令即可打开之 (当文件路径包含空格时,请务必附加半角模式下的双引号):

. doedit "D:/Stata_Ex/Ex01.do"

菜单方式

只需单击 Do-file 编辑器中的 「文件夹」按钮,定位至 Do-file 所在文件夹,找到需要打开的 Do-file 后,双击之即可打开。

打开 Do-file:菜单方式

3.3 dofile 的编写

如果你已经尝试过在命令窗口执行命令,那么,dofile 无非是将这些命令统一记录在一个文档中,以便后需修改和反复执行。

下面就是一个简单的 dofile:

*------------------------sample01.do ----
sysuse "auto.dta", clear

summarize price weight mpg  
scatter mpg weight  
reg mpg weight foreign
esttab, nogap
*------------------------sample01.do ----

在上述代码中,我们按照以下步骤逐步完成分析:

  • 加载数据:使用 sysuse 命令加载 Stata 自带的 auto.dta 数据集。
  • 描述性统计:使用 summarize 命令对变量 priceweightmpg 进行描述性统计,了解数据的基本特征。
  • 可视化分析:使用 scatter 命令绘制 mpgweight 的散点图,直观展示两者之间的关系。
  • 回归分析:使用 reg 命令以 mpg 为因变量,weightforeign 为自变量进行回归分析,探究变量之间的统计关系。
  • 结果输出:使用 esttab 命令将回归结果以简洁的表格形式输出,便于进一步解读和报告。

通过将上述步骤整合到 dofile 中,不仅提高了代码的可重复性,还使得分析过程更加清晰和高效。

3.4 dofile 的执行

你可以执行 dofile 中的部分代码,也可以一次性执行所有代码。你甚至可以在一个 dofile 中执行另一个 dofile 中的所有代码。

局部执行

多数情况下,我们只需要执行 dofile 中的部分命令。做法很简单:选中目标代码,点击下图所示按钮按钮;或按下快捷键 Ctrl+D

Stata_intro_excute_dofile_01

需要说明的是,你只需要选中某行中的一个以上的字符 (包括空格),Stata 就会执行该行的代码 (这与 R 不同)。

全部执行

若不选中任何代码块,而直接按快捷键 Ctrl+D,则 Stata 会一次性你执行 dofile 中的所有代码。

有时候,这种操作可能不是你的本意,而是误操作,此时你可以点击 Stata 主界面中的红色叉号 (第二行最后一个按钮),即可强制中断执行过程。

使用命令

我们也可以通过命令来执行整份 dofile:

do "D:/stata/personal/paper01/sample01.do"

这种方式主要用于大型项目。例如,对于复杂的项目,我们可以将不同的处理任务写在不同的 dofile 中,并将这些 dofile 统一放置在 ../codes 文件夹中。然后,可以在项目的根目录下设定一个名为 master.do 的主文档。这有几个好处:其一,整个项目的文档结构非常清楚;其二,我们可以单独执行某一部分,也可以执行 master.do 中的所有命令,以便运行项目中涉及的所有代码。

*------------------------ master.do ------begin---
global path  "D:/stata/personal/paper01"
cd "$path/codes"

do "01_data_clean.do"
do "02_summarize.do"
do "03_regression.do"
do "04_graph.do"
*------------------------ master.do ------over----

3.5 添加注释语句

为了增加 dofile 的可读性,我们需要添加一些注释语句,主要包括:

  • 列明文档的标题、作者、生成日期等
  • 添加一些大标题,以便使文档结构清晰
  • 解释关键语句的目的和作用

Stata 中有三种添加注释语句的方法:

  1. 单行注释: 在行首使用 * 号,则该行内容会被自动忽略。一次只能注释一行语句。
  2. 行尾注释: 在一行命令之后至少加一个空格再加 // 字符,该行命令中 // 后的内容将被视为注释而忽略。快捷键:选中需要注释的语句,按 Ctrl + /
  3. 多行注释: 将需要注释的内容放在 /* */ 组合字符里边,被该组字符括起来的内容会被忽略。快捷键:选中需要注释的语句,按 Ctrl + Shift + /

3.6 断行:三种方法

当所使用的命令很长需要换行的时候,可以使用以下三种方法来实现对命令的分行操作,从而实现分行后的命令承接上一行的操作:

  • M1. 配合使用 #delimit ;#delimit cr。使用 #delimit ; 命令,可以将换符设置为 ; (Stata 的默认换行符是回车键);使用#delimit cr 命令用来恢复默认换行符。
  • M2. 使用字符组合 /// 来实现上下行的连接。
  • M3. 用注释符 /* */ 来连接上下行,在操作过程中只需将上下行使用注释字符连接起来即可。

下面是一些典型的例子:

三种断行方式

3.7 dofile 编辑器的美化和语法高亮

在 dofile 编辑器中,依次点击:编辑首选项,可以在 常规颜色自动完成 等子选项卡中对 dofile 编辑器的配色、字体等进行个性化设定。

注意:完成本节介绍的各项设定后,可以参照 1.5 小节的方法保存为模板。

详情参见 help dofile[U] 16 Do-files,以及如下推文:

常规-选项卡:字体、字号、缩进等

  • 依次点击:编辑首选项常规

dofile 编辑器设置:常规选项卡

颜色-选项卡:语法高亮

  • 依次点击:编辑首选项颜色 (Colors)
  • 可以根据自己的喜好设定各类元素的配色。

dofile 编辑器设置:颜色选项卡

3.8 良好的代码写作习惯

为了满足可重复性研究的要求,我们的代码不但要能正确执行,还应该清晰、易读。如下是一些 基本建议

  • 所有的操作 (包括: 数据处理、绘图、回归分析、结果输出等) 都要记录在 dofile 中,尽量避免手动处理
  • 每个项目 (每篇论文) 一个文件夹;文件分类存放,文件尽可能按照特定规则命名
  • 工作中,实时保存的是 dofiles,而不是 数据文件
  • 多加注释,以便增强代码的可读性
  • 注意排版,保证美观的同时,也便于查错

这里,先提供一个虚构的「dofile 样本」,以便让各位了解上述原则的基本精神。

  • 首先,在 dofile 的开头,标明了文件的生成日期、作者、作用等;
  • 其次,在「A. 基本设定」部分用全局暂元 global 定义了文件的存储路径和子文件夹的名称简写,以便后续将不同类新的文件分门别类地存放起来;
  • 再次D#.xxxS#.xxxR#.xxx 等部分依次为数据处理、统计分析和回归分析等内容。如此以来,即使 dofile 写的很长,仍然可以通过 Ctrl+F 快捷键快速搜索关键词定位。
  • 最后,值得注意是,我们频繁地使用了 localglobal,尤其是【R. 回归分析】部分。这种做法好处很多,比如,代码的结构看起来很清晰;很容易修改,只需在定义暂元的地方统一做一次修改即可,这可以大幅降低出错的概率;代码变得很简洁,可读性自然就提高了。
*------------------
*- 一个 dofile 范本    www.lianxh.cn
*------------------

* Version 1.2, 2035/1/2
* Author: 连家大公子
* 目的:分析家庭收入对子女学习成绩的影响

*------------
*-A. 基本设定

  global path "D:/myPaper/Income_Mark" //定义项目目录 
  
  // 需要预先在生成子文件夹:data, refs, out, adofiles
  global D    "$path/data"      //数据文件
  global R    "$path/refs"      //参考文献
  global Out  "$path/out"       //结果:图形和表格
  adopath +   "$path/adofiles"  //自编程序+外部命令 
  cd "$D"                       //设定当前工作路径
  set scheme s2color   

*-核心参考资料 (参考文献和文档都存放于 $R 文件夹下)
  shellout "$R/Safin_Federer_2005_Aust.pdf"

*------------
*-D1. 数据导入
  import excel using "$D/Income_Mark.xlsx", first clear
  save "_temp_"  // $D\ 可以省略,应为当前工作路径就是 $D
                 // 如果原始数据文件不大,此步骤可以省略

*------------
*-D2. 数据处理
  gen ……
  winsor2 ……
  ……
  save "data_dealed.dta", replace

*----------------------
*-S1. 基本描述性统计分析
  // 如果数据处理部分未作更新,可直接这里进行后续分析

  *-----表x:基本统计量-------
  use "data_dealed.dta", clear 
  local v " " //填入变量名
  local s "$Out/Table1_sum" //存储的文件名(或路径\文件名)
  logout, save("`s'") excel replace: ///
          tabstat `v', stat(mean sd p50 min max) f(%6.2f) c(s) 

  *-----表x:相关系数矩阵-------
  local v " " //填入变量名
  local s "$Out/Table2_corr" //存储的文件名(或路径\文件名)
  logout, save("`s'") excel replace: ///
          pwcorr_a `v', format(%6.2f) //star(0.05)

*-----------------
*-S2. 分组统计分析
  use "data_dealed.dta", clear  
  *-----表x:组间均值差异检验-------
  local v " " //填入变量名
  local s "$Out/ttable2" //存储的文件名(或路径\文件名)
  logout, save("`s'") excel replace: ///
          ttable2 `v', by(variable) format(%6.2f)

*-------------
*-R. 回归分析
  use "data_dealed.dta", clear    
  global y   "Mark"   //被解释变量
  global x   "Income" //基本解释变量
  global z   "edu_Dad edu_Mum Age##Age ……" //基本控制变量
  global w   "i.year i.industry i.race"    //虚拟变量
 *global opt ", vce(robust)" 
  global opt ", vce(cluster industry)" 
  
  reg $y $x        $opt
  est store m1
  reg $y $x $z     $opt
  est store m2
  reg $y $x $z $w  $opt
  est store m3

  *-----表x:回归结果-------
  local s "using $Out/Table3_reg.csv" //执行时包括这一行会输出Excel表格
  local m "m1 m2 m3"
  esttab `m' `s', nogap compress replace   ///
         b(%6.3f) s(N r2_a) drop(`drop')   ///
         star(* 0.1 ** 0.05 *** 0.01)      ///
         addnotes("*** 1% ** 5% * 10%")    ///
         indicate("行业效应 =*.industry" "年度效应 =*.year")

事实上,你若能在开始时遵守上述基本原则,就会慢慢发现它的好处远远大于你花费在排版上的成本。久而久之,你也会形成自己的代码风格。

下面,着重解释一些最重要的原则。

A. 实时保存 dofile 而不是数据文件

有些人在下班前喜欢把当天处理好的数据另存一份,这是个非常糟糕的习惯!

我的建议是:保存 dofile,而不是数据文件! 原因很简单,一个 dofile 只有几 k 或几十 k,但数据文件往往很大。如果保存了太多版本的数据文件,随后会导致严重的混乱,也就很难保证研究结果的可重复性。有些时候,数据处理环节比较复杂,代码运行时间也较长,可以保存 1-2 次过程数据,从而加快后续处理效率。要注意的是,在 dofile 中保存过程数据时,一定要添加注释语句,并将过程数据与原始数据存放到不同的文件夹中,以免混淆或误删。

B. 空格和注释语句

Stata没有空格和制表符的限制,为了让代码更加美观和易读,要合理使用空格和缩进。

rename k12_unique_id sid 
rename class_unique_id class_id 
rename teacher_name teacher 

*或者这样
rename k12_unique_id     sid 
rename class_unique_id   class_id 
rename teacher_name      teacher 
//可以看到后者更直观。

缩进对代码的跨行阅读也有帮助,在视觉上更容易接受:

// Good 
keep   sid class_id teacher grade1 /// 
       grade2 grade3 pass

// Bad  
keep sid class_id teacher grade1 /// 
grade2 grade3 pass

3.8 文档结构

合理设置文档结构也是实现可重复研究的关键。请参阅如下推文:

如下论文的复现文档都设置了非常严谨的文档结构,供参考:

  • Ewens, M., Xiao, K., & Xu, T. (2024). Regulatory costs of being public: Evidence from bunching estimation. Journal of Financial Economics, 153, 103775. Link (rep), PDF, Google. -Appendix-, github-part-of-Data, -Replication-
  • Nagengast, A. J., & Yotov, Y. V., 2025. “Staggered Difference-in-Differences in Gravity Settings: Revisiting the Effects of Trade Agreements.” American Economic Journal: Applied Economics, forthcoming. Link, PDF, -Appendix-, Google, -Replication-
  • Barwick, Panle Jia, Shanjun Li, Liguo Lin, and Eric Yongchen Zou. 2024. "From Fog to Smog: The Value of Pollution Information." American Economic Review, 114 (5): 1338–81. DOI: 10.1257/aer.20200956 Link, PDF, -Replication-, -Appendix-, Google
 

lianxh.cn