Stata的版本兼容性问题:可重复研究

发布时间:2021-03-21 阅读 606

Stata连享会   主页 || 视频 || 推文 || 知乎

温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。

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

课程详情 https://gitee.com/lianxh/Course

课程主页 https://gitee.com/lianxh/Course

⛳ Stata 系列推文:

作者: 全禹澄 (复旦大学)
邮箱: eli-quan@outlook.com

编者按:本文主要摘译自下文,特此致谢!
Source:Alan Riley, Stata Blog, 2019, Compatibility and reproducibility. -Link-


目录


1. 问题背景

大家可能遇到过这样的场景:当我们运行从熟人或网站上得到的 Stata 数据和代码时,发现全是乱码,或者运行过程中报错。在这种情况下,我们不必慌张。因为这些文件内容本身并没有错,问题主要是由 Stata 版本更新带来的。

实际上,为了满足使用者对软件新功能的需求,软件的升级换代不可避免,Stata 亦如此。由此带来的问题是,一些 Stata 旧版本环境下的代码或数据集不会被 Stata 新版本所兼容,概括为「后向兼容」能力。与之对应的是「前向兼容」,即新版本环境下的代码和数据集不能被旧版本正确识别和运行。

为了回应用户关于「兼容性」的问题,Stata 公司总裁 Alan Riley 专门撰写了一篇博客,来解释 Stata 开发者在实现 do 文档和数据兼容性上所做的努力。在下文中,我们将跟随 Alan Riley 的脚步,为大家提供现有 Stata 兼容性问题的解决方案,并介绍一些 do 文档编写过程中的好习惯。

2. Stata 的兼容性实现

2.1 do 文档的后向兼容:标注版本号

do 文档的后向兼容做得很好。Alan Riley 在博客中写道:“无论是商业的还是开源的,Stata 是唯一一个拥有强大内置版本控制系统的统计软件,这使得多年前编写的老脚本也仍能在 Stata 的新版本中运行。”

具体来看,如果打开一个 do 文档后没有乱码,则可以通过标记版本号来指定特定版本的编译方式运行代码。例如,一个 30 年前用 Stata 3 编写的 do 文档,只要在文档顶部标记 version 3,它就可以在 Stata 16 中原样运行。

version 3 // 标记版本号

因此,当撰写一个新的 do 文档时,文档开头标注 Stata 版本号是一个好的习惯。这也意味着,如果 Stata 公司依旧秉持后向兼容的理念,那么多年以后,我们仍可以通过点击 “运行” 按钮,得到完全一样的结果。

除标注版本号外,还有一些好习惯推荐给大家,例如,写好文档信息、设定文件路径、编写日志文件、以及添加目录等。在这里,我们提供一个 do 文档的开头模板,并希望大家能够在每次创建 do 文档时用上。

/* 
Project Name

Data: 		**
Purpose: 	**
Date: 		**
Editor:		**
*/

* Environmental setting
version 16
clear
set linesize 80
macro drop _all


* Directory in someone's laptop 
glo raw_data ""
glo dodir ""
glo results ""
glo process ""

cd "$process"
cap log close 
log using "$dodir\**.log", append

/*
Contents
1. 
  1.1. 
2. 
3. 
*/

do 文档撰写的规范总是与可复现性这个目的分不开。关于可复现性的讨论,详见推文「可重复性研究:如何保证你的研究结果可重现?」

2.2 do 文档的乱码问题:中文转码

Alan Riley 的自信更多源于英文环境,对于中文环境,Stata 并不是太友好。如果打开一个 do 文档后发生乱码,正如本文开头描述的那样,那么这个 do 文档很大可能是包含中文,而且还是用 Stata 13 或更早版本编写。实际上,在 Stata 13 版本之后,Stata 发生了较大的更新,并导致了中文后向兼容的问题。关于 do 文档乱码,目前有两种解决办法:

  • 第一种办法:当发生这种情况的 do 文档数量不多时,可以用 Windows 系统自带的记事本打开的 do 文档,然后 Ctrl+A 全选内容,Ctrl+C 复制全部文本,并粘贴到 Stata 的 do 文档编辑器中。这种方式之所以可以解决乱码问题,是因为记事本可以自动识别各种编码方式的纯文本;
  • 第二种办法相对复杂,但操作步骤更少。这种办法主要用到了 Stata 自带的命令 unicode。具体转换代码如下:
unicode analyze * //任何文件类型皆可
unicode encoding set gb18030 //获取 Stata 的提示信息
unicode translate * //这行代码需要根据 Stata 的提示信息来撰写,并不一定与这里列出的代码一模一样

如果上述代码没有效果,可以参考推文「Stata15-Unicode:一次性转码解决中文乱码问题」获得更多解决方法。另外,上述命令只能转换当前工作路径下的文件,对于子孙文件夹下的文件无能为力了。此时可以使用连玉君老师编写的 uauall 命令,一次性转换当前工作路径下的所有文件、以及子孙文件夹中的文件。

2.3 dta 数据集文件的兼容性

关于 dta 数据集文件的兼容性,Alan Riley 认为 Stata 开发者团队一直遵循着三个重要原则:

  1. 除非必须,永远不改数据集格式;
  2. 始终保持完备的向后兼容和跨平台兼容能力。当 Stata 16 出现时,它必须能够读取所有 Stata 历史版本产生的数据集格式。与此同时,无论是 Windows,还是 Mac,抑或是 Linux 等操作系统上的 Stata,其创建的数据集必须能被其他任一操作系统的 Stata 所打开。当然,也包括不同位数的系统 (在这里,中文环境再一次乱码,解决方法请参考前文);
  3. 如果可能,至少为最近的一个旧版本 Stata 提供前向兼容。

此外,Stata 有大量的外部命令,并且一些命令可能在版本更迭中失效。那些对 Stata 旧版本命令仍然钟情的研究者,希望保存一个 dta 数据集文件后,可以在 Stata 旧版本中运行,此时可以使用 saveold 命令。在 Stata 14、15 和 16 中,saveold 命令保存的数据集文件可以让一直到 Stata 11 都能读取。

saveold filename [, saveold_options]

3. 博客原文翻译

原文: Alan Riley, Stata Blog, 2019, Compatibility and reproducibility. -Link-

下面展示这篇英文博文的中文翻译,希望对正在使用 Stata 的你有所启发。

前几天我看到一条推特,有人抱怨 Stata 公司让每个 Stata 新版本的数据集格式都不同于上一个版本。

这让我想起几年前写给一个用户的一封电子邮件,他对后向兼容性和可复现性有疑问。我将在这篇博文中分享这封邮件的大部分内容,来说明我对这个话题的看法。

我理解用户在遇到软件版本不兼容问题时的挫败感。我想解释我们在这方面的努力,虽然这对已经出现的问题可能于事无补。

推特上关于数据集格式的说法非常离谱。事实上,Stata 16、Stata 15 和 Stata 14 共享相同的数据集格式,因此在三个最新版本的 Stata 之间的数据集兼容性应该没有问题。此外,尽管更改数据集格式对用户来说很痛苦,但我相信,它给我们的开发人员和测试人员带来的痛苦更大。除非必须,我们不会去改格式。这既是为了你们用户,也是为了我们自己。

虽然我的理解是有偏差的,但我还是相信,Stata 在所有统计软件中的后向兼容状况是最好的。据我所知,无论是商业的还是开源的,Stata 是唯一一个拥有强大内置版本控制系统的统计软件包,这使得多年前编写的老脚本也还能在Stata 的新版本中运行。

你可以拿一个 30 年前用 Stata 3 编写的 do 文档,只要这个 do 文档在顶部标记为 "version 3",它就可以在 Stata 16 中原样运行,不需要任何修改。没有坏脚本,也没有坏程序,不需要额外努力。Stata 在最初设计时就考虑到了可重复性,我们希望用户相信,多年以后,即使他们更改了操作系统或计算机架构,或者迁移到一个更新的 Stata 版本,他们用来生成特定分析结果的文档仍然可以运行。

关于数据集格式,Alan Riley 认为自己一直遵循着三个重要原则:

  • 其一, 除非必须,否则永远不改数据集的格式。一个新的 Stata 版本的出现并不意味着我们更改了数据集的格式。我们只在迫不得已需要支持新版本的一些新特性时,才会选择更改数据集格式。这就是为什么 Stata 16 与 Stata 15、Stata 14 共享相同的数据集格式;

  • 其二, 始终具有完全的向后兼容和跨平台兼容能力。当 Stata 16 出现时,它必须能够读取所有历史版本的 Stata 产生的数据集格式,直到 Stata 1。此外,Windows 上的 Stata、Mac 上的 Stata、Linux 上的 Stata (前的最新版都是支持 64 位系统的),以及任何其他硬件平台或操作系统上的 Stata 都必须能够读取在任何其他硬件平台或操作系统上创建的数据集,包括旧的 32 位系统。我们希望,在 Windows 3.1 的 Stata 4 中对一篇期刊论文进行初始分析的研究员,能够在 64 位的 Mac OS 上用最新的 Stata 16 加载出数据集;

  • 其三, 如果可能的话,至少为最近的一个旧版本 Stata 提供前向兼容。我们有两种方法来做到这一点。第一种方法是,如果某个版本的 Stata 需要更改数据集格式,例如在 Stata 14 中更改数据集格式以增强其 Unicode 的能力,那么我们会确保该版本的 Stata 至少能将内存中的数据集保存为以前的格式。我们使用 saveold 命令来做到这一点。在 Stata 14、15 和 16 中,我们更进一步地,让 saveold 命令不仅向前兼容一个版本到 Stata 13,还可以让一直到 Stata 11 的旧版本都能读取。第二种方法是,让上一个 Stata 版本的最后更新能够读取最新版本 Stata 创建的数据集。例如,我们最近发布的 Stata 11 的免费更新,就包含了读取 Stata 12 创建的数据集格式的能力。

总之,我们非常重视可重复性和前向、后向、跨平台的兼容性。

4. 参考资料

  • Alan Riley, Stata Blog, 2019, Compatibility and reproducibility. -Link-
  • Enrique Pinzon, Stata Blog, 2020, Revealed preference: Stata for reproducible research, -Link-
  • Vilhuber, L., J. Turrito, and K. Welch. 2020. Report by the AEA Data Editor. AEA Papers and Proceedings 110: 764–775. -Link-

5. 相关推文

Note:产生如下推文列表的 Stata 命令为:
lianxh 乱码 重现 重复, m
安装最新版 lianxh 命令:
ssc install lianxh, replace

相关课程

免费公开课

最新课程-直播课

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

课程主页

课程主页

关于我们

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

连享会主页  lianxh.cn
连享会主页 lianxh.cn

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

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

✏ 连享会学习群-常见问题解答汇总:
https://gitee.com/arlionn/WD

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