分析工作中存在重复操作时,你可以在Stata中编写循环,提升任务执行效率。例如,你可能需要分行业、分区域分别拟合回归模型。在Stata里,你可以遍历列表中的数值与条目,高效完成这类任务。
但如果运行循环时遇到报错,想要定位错误根源往往并不容易。下文将介绍几个排查循环错误的核心工具:set trace、capture、noisily以及if命令。
举个例子,我们使用全国青年女性纵向调查(美国人力资源研究中心,1989)的数据。我们希望构建模型,探究工资水平与工会身份、总工作年限以及是否为大学毕业生之间的关系,同时考察这组关联在不同行业、不同年份下存在怎样的差异。
首先,我们用levelsof命令提取行业分类取值,并将结果存入名为industries的宏变量。这份数据的时间跨度为1968—1988年。针对该区间内的每一个行业、每一个年份,我们分别拟合模型,并通过estimates store保存回归结果。
程序抛出了报错,但我们无法判断究竟是哪个年份、哪个行业导致了该错误。
使用set trace on,我们可以追踪代码的执行流程。注意,该命令会生成大量输出内容;因此我们搭配set tracedepth 1,设定仅追踪第一层嵌套程序。也就是说,我们只追踪代码直接调用的程序(例如regress),但不追踪regress内部所调用的子程序。
Stata默认会追踪所有被调用程序的执行;严格来说,默认最多可追踪高达32000 层的嵌套程序。举个例子:如果循环调用regress,而regress内部又调用了summarize,在默认设置下,Stata 同样会追踪summarize以及summarize所调用的全部程序。
追踪代码执行会产生海量输出,因此我们新建日志文件来保存这些内容。循环执行完毕后,关闭追踪并关闭日志文件。但运行这段代码时,日志文件并未正常关闭:原因是Stata提前报错终止,log close这一行代码来不及执行。后文我们会解决这个问题。现在,先来查看输出结果。
我们可以看到如下结果:
每一行代码开头都会带有标记:短横线代表该行代码已执行,等号代表宏变量已完成展开,用来展示实际运行的命令。例如,以foreach、forvalues和regress开头的代码行均已执行。我们看到第一个拟合的模型对应行业代码 1、年份 68。接着可以看到regress命令内部的追踪代码。滚动到日志末尾就能发现,该模型拟合失败,原因是样本观测值数量不足。
注意,estimates store开头这一行前面既没有短横线,也没有等号,说明这一行并未执行:Stata 在运行到这一行之前就已经报错终止。至此我们定位到:行业代码 1、年份 68 这一组存在问题。但我们仍希望继续尝试对其余年份和行业代码拟合回归模型,下文就来实现这个需求。
接下来,我们给regress命令添加两个前缀:capture和noisily。capture前缀可以捕获所有输出信息,包括报错信息;即便第一个行业--年份组合出现错误,循环依然能够继续遍历其余行业代码。当capture搭配noisily使用时,既能查看命令运行输出,同时也会捕获错误。
此外,如果模型拟合失败,estimates store会因找不到估计结果而报错。因此,我们也给estimates store加上capture前缀。
运行代码后,我们得到如下结果:
现在,即便部分行业与年份组合无法完成模型拟合,循环依旧可以完整跑完。我们可以在日志文件trace2.smcl中搜索关键词 “no observations”,查看哪些行业 - 年份组合未能成功拟合模型。除此之外,还可以使用estimates dir查看所有已保存的估计结果列表。
这里留给大家自行上机尝试,因为运行后会生成一长串结果。根据错误条件执行代码
另一种需求:你可能希望整理出无法拟合模型的行业 - 年份组合清单。使用自己的数据时,或许原本预期不会出现报错,找出这些异常组合,方便进一步排查模型拟合失败的原因。下文我们增加一段代码块,当发生错误时自动执行该段代码。
命令正常执行、无报错时,返回码(_rc)为 0。若命令运行出错,返回码则为非0数值。因此,if_rc != 0时,display与local命令就会执行;该代码块的触发条件就是_rc不等于 0。
第一步,识别引发错误的年份与行业并打印输出。这样我们就可以在日志文件中直接搜索关键词 “error”,快速定位异常取值。第二步,把这些异常取值存入名为nogood的宏变量。宏变量nogood初始为空;每当出现一次错误,就向其中追加内容。循环结束后,输出这个宏变量的内容,即可得到全部异常取值清单。
针对本例数据,这种方式会生成一长串存在问题的年份与行业组合。因此,你可以任选更适合自己的方法:在日志文件中搜索关键词 “error”,或是通过宏变量存储行业、年份的异常清单。
根据表达式条件执行代码
我们已经知道,部分行业 - 年份组合的样本量不足,无法拟合模型。下面介绍如何在观测样本量充足的前提下才执行模型拟合。例如,假设我们要求样本观测值大于500时,才运行回归。
首先,按行业和年份分组,统计所有变量均无缺失值的观测数量。满足该条件的观测总数存放在r(N)中;因此我们设置条件表达式r(N) > 500,仅当该条件成立时拟合模型。
运行代码后可以看到,仅有7个模型拟合成功:
在本篇博文中,你学习了如何追踪代码执行过程,借此快速定位循环内是哪条命令引发报错。通过执行追踪,可以直观查看宏变量展开后的实际内容,从而清楚 Stata真正执行的完整命令。
此外,你还掌握了capture与noisily这两个命令前缀的用法:它们可以让循环完整跑完,既能捕获错误信息,同时也会展示报错内容,方便后续排查。
最后,你了解了如何使用if命令,根据表达式或返回码有条件地执行代码块。利用该方法,可以过滤掉不需要处理的样本分组,同时生成一份待深入核查的分组清单。
北京天演融智软件有限公司(科学软件网)是美国StataCorp官方正式授权的中国核心合作伙伴,自2007年起深耕Stata中国市场,是国内最早、服务最久、最专业的Stata正版授权服务商之一。二十年来专注Stata正版推广、行业培训与本地化技术服务,全程原厂合规授权、可查可溯,保障用户软件正版化、合规化、稳定使用。
我们不仅是软件销售代理商,更是Stata在中国的行业推动者与生态建设者。2012年,我司与厦门大学联合举办中国第一届Stata全国用户大会,开创国内Stata行业会议先河;2015–2017年全国巡回开展20余场免费Stata公开课,普惠大量师生科研用户;2019–2022年连续主办四届Stata洞察数据科学研讨会,所有行业会议全程免会务费,持续推动国内量化数据分析人才培养与学术交流。
目前公司服务客户覆盖全国顶尖双一流高校、数百所综合及财经医药类院校、国家级科研院所、政府统计机构、疾控医疗体系、头部金融机构、跨国企业及上市公司,拥有几百家校企事业单位成功合作案例。凭借原厂正规授权、二十年行业积淀、完善的本地化培训与技术服务体系,成为国内高校、科研机构、企事业单位采购Stata软件的首选合作品牌。

