编者按: 这是 Stata Blog 上的一篇推文,由浅入深地讲解了如何从一个简单的任务出发,逐步通过撰写 dofile,adofile 来实现任务的自动化可重复性执行。这篇推文帮助我们在不自觉中学会了编写标准的 Stata 程序 (ado 文件)。
原文地址 :https://blog.stata.com/2018/10/09/how-to-automate-common-tasks/
连享会计量方法专题……
高效进行数据分析的关键是将常见任务自动化。自动化能把你从大量重复性操作中拯救出来,不但节约时间,还能减少出错概率。
本篇让我们使用Stata自动执行一些任务。任务本身并不重要,重要的是熟悉自动化执行任务的流程。
我们选择的任务是将变量标准化——减去变量的均值并除以其标准差。
正如您所知道的,Stata社区中有现成的命令来执行此操作,而且比我们接下来自己写更为便捷(在Stata中搜索 normalize variable);您也可以使用Stata的egen命令对单个变量标准化,但我们打算做的远不止如此。
我认为本文读者是Stata自动化任务的新手。所以,如果您已经是专家,可能对这篇文章不感兴趣,当然也可能会一些新的发现。
1. 使用脚本文件
首先,我们将直接在分析脚本中执行标准化操作。在Stata中,我们将分析脚本称为 do-files,因为它们可以执行某些操作。
让我们把原始变量命名为 x。因为我们不想改变现有变量的内容,所有新建一个变量 xN,其中 N 后缀表示标准化(如果您不喜欢 N 后缀,可以改变,比如 _norm
,也可使用前缀)。Stata 的 summarize 命令将给出原始变量平均值和标准差。
*-----------begin------mydo.do-----
···
summarize x
generate xN = (x - r(mean)) / r(sd)
···
*-----------end--------mydo.do-----
如上,对一个变量标准化只需要两行代码即可。
r(mean) 和 r(sd) 是什么意思,我们又该如何了解它们?
它们分别表示变量均值和标准差的返回值。
在 Stata 中,几乎所有命令都会返回结果。已模型估计为主要目标的命令 (如 regress
, logit
等) 的返回结果以 e() 表示,大多数其他命令以 r() 表示。输入 help summarize
并拉到帮助文件的底部就能看到 summarize
返回的所有结果及其描述。也可以在执行完 summaryrize
命令后输入 return list
命令来查看返回值列表。
既然我们的任务只有两行,那为什么我们要自动化呢?
因为当我们需要大量重复操作时,即使只有两行代码,也极易出错。比如,我们想复制这段代码 100 次进行 100 个变量标准化时,我们必须将代码中变量名 x 更改为 100 个新的变量名称,但是我们往往会忘记。你可能会忘记更改 summarize 中的 x,或是忘记更改 xN,并收到报错消息。或是忘记更改在表达式中的变量名。这三种错误我都犯过。
2. 使用 Do 文件自动化执行
我们将脚本放入自己的do-file中。
normalize.do (1)
version 15.1
summarize x
generate xN = (x - r(mean)) / r(sd)
ps:在文件顶部我添加了版本命令。请切记,一定要为你的do文件标明版本信息!我使用的是 Stata 15.1,一旦标记上,这个脚本将始终以 15.1 版 stata 的特性运行,即使将来用 Stata 42 版运行这个文件(可能 42 版的 stata 早已取消 summarize
命令或完全改变 summarize
的工作方式)但 Stata 会识别出版本号,并按 15.1 版本的语法规则正常运行。
我们通过输入以下命令执行所写的脚本
. do normalize
或者在直接在do文件里添加 do normalize 语句。
我们目前的 normalize.do 并不太有趣。我们需要它来处理除 x 之外的变量。
这是一个版本: