专栏名称: 连享会
连玉君老师团队分享,主页:lianxh.cn。白话计量,代码实操;学术路上,与君同行。
目录
相关文章推荐
高分子科学前沿  ·  同济大学AFM:限域效应优化电化学膜中微污染 ... ·  19 小时前  
高分子科技  ·  北化贾晓龙/杨小平团队、南昆大王浩团队 ... ·  2 天前  
高分子科技  ·  南京林业大学陈楚楚 Carbohyd. ... ·  3 天前  
高分子科技  ·  中科院理化所江雷院士、王京霞研究员团队 ... ·  5 天前  
51好读  ›  专栏  ›  连享会

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

连享会  · 公众号  ·  · 2025-02-20 22:00

正文


👇 连享会 · 推文导航 | www.lianxh.cn

图片
图片

作者: 全禹澄 (复旦大学)
邮箱: [email protected]

编者按 :本文主要摘译自下文,特此致谢!
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 开发者团队一直遵循着三个重要原则:

  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

温馨提示: 文中链接在微信中无法生效。请点击底部 「阅读原文」

  • 专题: 论文写作
    • 连享会:论文重现网站大全
    • 可重复性研究:如何保证你的研究结果可重现?
  • 专题: Stata入门
    • Stata15-Unicode:一次性转码解决中文乱码问题
  • 专题: Stata资源
    • 可重复研究:Stata一马当先
    • 会计期刊论文的结果可重现吗?
  • 专题: 数据处理






请到「今天看啥」查看全文