06-代码的可复现性与文件管理

作者

Simon Zhou

发布于

2025年5月5日

代码
import stata_setup
stata_setup.config('C:/Program Files/Stata18', 'mp', splash=False)
代码
%%stata
// 载入数据集,使用 Stata 的内置数据集 auto.dta
sysuse auto, clear

. // 载入数据集,使用 Stata 的内置数据集 auto.dta
. sysuse auto, clear
(1978 automobile data)

. 

1 为什么要保持代码的可重复性

  1. 代码的可复现性是科学研究的基石之一。
  2. 方便自己和他人理解、使用和验证代码。
  3. 代码的可复现性可以提高研究的透明度和可信度。
  4. 代码的可复现性可以促进科学合作和知识共享。
  5. 代码的可复现性可以帮助我们更好地理解和应用数据分析和机器学习方法。
  6. 部分杂志要求作者提供代码和数据,以便审稿人和读者验证结果。

2 如何实现代码的可复现性

  • log file
    • 记录代码运行的过程和结果,方便后续的调试和分析。
    • 类似于代码的“快照”,可以帮助我们回溯到某个特定的状态。
  • Do file
    • 给合作者和审稿人
    • 提醒自己分析流程
    • 存档,方便后续的复现和修改
  • 版本控制
    • 使用版本控制工具(如Git)来管理代码的版本和变更。
    • 记录每次修改的原因和内容,方便后续的回溯和比较。
  • 代码注释
    • 在代码中添加注释,解释每个函数和变量的含义和作用。
    • 方便自己和他人理解代码的逻辑和思路。
  • 代码规范
    • 遵循统一的代码规范和风格,保持代码的一致性和可读性。
    • 使用合适的命名规则,避免使用过于简短或模糊的变量名。
  • 文档化
    • 为代码编写详细的文档,说明代码的功能、输入输出和使用方法。
    • 提供示例和测试用例,方便他人理解和使用代码。

2.1 代码规范

/* README: 
   1. 创建时间:2025-05-05
   2. 上次修改时间:2025-05-08
   3. 本文档的目的:用于探索数据&绘图&制表&建模
   4. 本文档的依赖项:
      - Stata > 17.0
      - Data: data.dta or other.files
      - packages: estout, outreg2, etc.
   5. 输入数据:output.dta or other.files
   6. 输出结果:results.txt
   7. 如有问题,请联系作者或查看文档。
Notes: 
   1. 本文档的内容仅供参考,作者不对其准确性和完整性负责。
   2. 本文档的内容可能会随时更新,作者不保证其及时性和有效性。
   3. 本文档的内容可能会受到版权保护,未经授权不得转载或引用。
   4. 本文档的内容仅代表作者个人观点,不代表任何机构或组织的观点。
   5. 其他信息:
      - 作者:Simon Zhou
      - 邮箱:
*/

* 代码如下:

// 载入数据集,使用 Stata 的内置数据集 auto.dta
sysuse auto, clear

* 1. 数据探索
describe
summarize

* 2. 绘制散点图
twoway scatter mpg weight

3 Log file

  • 将所有显示在 Stata 命令窗口的输出保存到一个文件中。
  • 方便后续的查看和分析。
  • 为什么需要 log file?
    • 记录代码运行的过程和结果,方便后续的调试和分析。
    • 类似于代码的“快照”,可以帮助我们回溯到某个特定的状态。
    • 分许更加透明和可信。
  • 如何使用 log file?
    • 使用 Log 命令来创建和管理 log file。
    • 创建一个新的 log file
log using filename [, append replace [text|smcl name(logname)]

3.1 append 和 replace 的区别

  • append:将新的输出追加到已有的 log file 中。
  • replace:替换已有的 log file,创建一个新的 log file。
  • 如果文件不存在,appendreplace 的效果是一样的,都会创建一个新的 log file。
  • 如果文件已经存在,而用户没有指定 appendreplace,Stata 会报错来询问用户如何选择。

3.2 text 和 smcl 的区别

  • text:创建一个纯文本格式的 log file,适合于在文本编辑器中查看和编辑,体积较小,只有单色。
  • smcl:创建一个 Stata 默认格式的 log file,适合于在 Stata 中查看和编辑,可以保存各种颜色。

3.3 name(logname) 的作用

  • name(logname):给 log file 起一个名字,方便后续的引用和管理。
  • 如果不指定,Stata 会自动生成一个默认的名字,通常是以日期和时间为基础的字符串。
  • 如果用户给 log file 起了名字(不是 filename),那么用户就可以同时打开好几个 log file。

3.4 结束 log file

  • 如果没有起名字,可以世界使用 log close 命令来结束 log file。
  • 如果用户没有结束 log file,Stata 会在退出时自动结束 log file。
  • 如果用户在 Stata 中打开了多个 log file,用户可以使用 log close logfile-name 命令来结束指定的 log file,或者使用 log close _all 命令来结束所有的 log file。
代码
%%stata
log close // 关闭现有的日志文件 
log using test,append
log close _all // 关闭所有日志文件

. log close // 关闭现有的日志文件 
      name:  <unnamed>
       log:  C:\Users\asus\Desktop\test\Stata-test\Statatest.smcl
  log type:  smcl
 closed on:   5 May 2025, 12:18:32
-------------------------------------------------------------------------------

. log using test,append
(file C:\Users\asus\Desktop\test\Stata-test\test.smcl not found)
-------------------------------------------------------------------------------
      name:  <unnamed>
       log:  C:\Users\asus\Desktop\test\Stata-test\test.smcl
  log type:  smcl
 opened on:   5 May 2025, 12:18:32

. log close _all // 关闭所有日志文件
      name:  <unnamed>
       log:  C:\Users\asus\Desktop\test\Stata-test\test.smcl
  log type:  smcl
 closed on:   5 May 2025, 12:18:32
-------------------------------------------------------------------------------

. 

4 Do file

  • Do file 是 Stata 的脚本文件,用于存储和执行一系列的 Stata 命令。
  • Do file 可以帮助我们组织和管理代码,方便后续的修改和复现。
  • Do file 可以包含注释、变量、循环、条件语句等,类似于其他编程语言的脚本文件。
  • Do file 可以使用 do 命令来执行,也可以直接在 Stata 中打开和运行。
  • Do file 可以使用 doedit 命令来打开和编辑,也可以直接在 Stata 中创建和保存。

4.1 Do file 的基本语法

4.1.1 注释

  • 使用 *// 来添加单行注释,* 作为一行开头时,这一行都是注释。
    • 在 Command 后添加注释使用 // 较好,并在 // 添加一些文字注释,以提醒或解释本行代码用途。
  • 使用 /* ... */ 来添加多行注释。
  • 注释可以放在代码的前面或后面,也可以单独成行。
代码
%%stata
clear all // 清除所有变量和数据集

pwd // 显示当前工作目录
cd "C:\Users\asus\Desktop\test\Stata-test" // 更改工作目录到指定路径
// 注意:请将 "YourUsername" 替换为你的实际用户名

. clear all // 清除所有变量和数据集

. 
. pwd // 显示当前工作目录
C:\Users\asus\Desktop\test\Stata-test

. cd "C:\Users\asus\Desktop\test\Stata-test" // 更改工作目录到指定路径
C:\Users\asus\Desktop\test\Stata-test

. // 注意:请将 "YourUsername" 替换为你的实际用户名
. 
代码
%%stata
*log close // 关闭现有的日志文件
log using Statatest, replace 
// 创建一个新的日志文件,替换现有的文件

. *log close // 关闭现有的日志文件
. log using Statatest, replace 
-------------------------------------------------------------------------------
      name:  <unnamed>
       log:  C:\Users\asus\Desktop\test\Stata-test\Statatest.smcl
  log type:  smcl
 opened on:   5 May 2025, 12:18:53

. // 创建一个新的日志文件,替换现有的文件
. 
代码
%%stata
// 载入数据集,使用 Stata 的内置数据集 auto.dta
sysuse auto.dta, clear 

** 数据分析的探索性描述
sum price
codebook mpg

. // 载入数据集,使用 Stata 的内置数据集 auto.dta
. sysuse auto.dta, clear 
(1978 automobile data)

. 
. ** 数据分析的探索性描述
. sum price

    Variable |        Obs        Mean    Std. dev.       Min        Max
-------------+---------------------------------------------------------
       price |         74    6165.257    2949.496       3291      15906

. codebook mpg

-------------------------------------------------------------------------------
mpg                                                               Mileage (mpg)
-------------------------------------------------------------------------------

                  Type: Numeric (int)

                 Range: [12,41]                       Units: 1
         Unique values: 21                        Missing .: 0/74

                  Mean: 21.2973
             Std. dev.:  5.7855

           Percentiles:     10%       25%       50%       75%       90%
                             14        18        20        25        29

. 
代码
%%stata
ci mean rep78
corr weight length

. ci mean rep78

    Variable |        Obs        Mean    Std. err.       [95% conf. interval]
-------------+---------------------------------------------------------------
       rep78 |         69    3.405797    .1191738        3.167989    3.643605

. corr weight length
(obs=74)

             |   weight   length
-------------+------------------
      weight |   1.0000
      length |   0.9460   1.0000


. 

4.1.2 copy the “Command”

如果用户使用交互页面来选择相关的操作,Stata 会在命令窗口中显示用户操作所对应的命令。

用户可以直接复制这些命令到 Do file 中,方便后续的修改和复现。