编者按
:本文主要摘译自下文,特此致谢!
Source
:Alan Riley, Stata Blog, 2019, Compatibility and reproducibility.
-Link-
目录
1. 问题背景
2. Stata 的兼容性实现
2.1 do 文档的后向兼容:标注版本号
2.2 do 文档的乱码问题:中文转码
2.3 dta 数据集文件的兼容性
3. 博客原文翻译
4. 参考资料
5. 相关推文
温馨提示:
文中链接在微信中无法生效。请点击底部
「阅读原文」
。
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:一次性转码解决中文乱码问题」获得更多解决方法。另外,上述命令只能转换当前工作路径下的文件,对于子孙文件夹下的文件无能为力了。此时可以使用连玉君老师编写的
ua
和
uall
命令,一次性转换当前工作路径下的所有文件、以及子孙文件夹中的文件。
2.3 dta 数据集文件的兼容性
关于 dta 数据集文件的兼容性,Alan Riley 认为 Stata 开发者团队一直遵循着三个重要原则:
除非必须,永远不改数据集格式;
始终保持完备的向后兼容和跨平台兼容能力。当 Stata 16 出现时,它必须能够读取所有 Stata 历史版本产生的数据集格式。与此同时,无论是 Windows,还是 Mac,抑或是 Linux 等操作系统上的 Stata,其创建的数据集必须能被其他任一操作系统的 Stata 所打开。当然,也包括不同位数的系统 (在这里,中文环境再一次乱码,解决方法请参考前文);
如果可能,至少为最近的一个旧版本 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 之间的数据集兼容性应该没有问题。此外,尽管更改数据集格式对用户来说很痛苦,但我相信,它给我们的开发人员和测试人员带来的痛苦更大。除非必须,我们不会去改格式。这既是为了你们用户,也是为了我们自己。
你可以拿一个 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