附录 T — Manufacturing Revolutions — 复现材料审计与运行说明

T.1 Source Map

源文件 用途
README.md 主项目文档、数据清单、运行说明、代码详情
MANIFEST.txt 完整文件清单 (172 条记录)
PACKAGE_INFO.txt 包元数据:173 文件、37 数据、105 代码
documentation/WORKFLOW.md 工作流概览与分块运行指南
config.yml 项目路径与 Stata 设置
master.R 总控 R 脚本 (344 行)
setup/setup.R R 环境配置脚本 (477 行)
setup/setup.do Stata 环境配置脚本 (163 行)
code/0_analysis/0_master_run_analysis.do 顶层 Stata 总控 (77 行)
code/0_analysis/1_main_scripts/0_1_master_run_main_analyses.do 正文 Stata 分析总控 (116 行)
code/0_analysis/2_appendix_scripts/0_2_master_run_appendix_analyses.do 附录 Stata 分析总控 (112 行)
code/0_analysis/3_suppappendix_scripts/0_3_master_run_suppappendix_analyses.do 补充附录 Stata 分析总控 (74 行)
code/1_figures/0_master_run_figure.R 正文图形 R 总控 (42 行)
code/2_tables/0_master_run_table.R 正文表格 R 总控 (40 行)
code/3_appendix/0_master_run_appendix.R 附录图文 R 总控 (124 行)
code/4_suppappendix/0_master_run_suppappendix.R 补充附录图文 R 总控 (108 行)
entrypoints/master_bootstrap.do 从 Stata 反向引导 master.R 的入口脚本

T.2 本文件阅读边界

本文件是一份复现包审计报告,目标是帮助复现者判断:哪些可以完整复现、哪些数据受限、如何分步骤运行、以及每个脚本在整个管道中的角色。本文件不替代原文的方法或结果解读;不重复 README.md 中已有的数据出处与引用细节;不提供原文的因果推断论证。如需原文内容请直接阅读 QJE 发表版论文。


T.3 复现材料总览

T.3.1 1.1 包尺寸与文件组成

根据 PACKAGE_INFO.txt

  • 压缩包大小约 45 MB,解压后约 150 MB
  • 总文件数:173 个
    • 数据文件:37 个
    • 代码文件:105 个
    • 文档与配置文件:若干

代号文件除去后,包内主要包含以下几类:

类别 路径 说明
输入数据 data/input/, data/policydata/, data/naverdata/, data/ngrams/, data/defensedata/ 可直接读取的核心与辅助数据
中间数据 data/intermediate_datasets/ Stata 分析产出的 .csv 文件,包内初始为空
预存中间数据 data/included_datasets/ 非公开微数据分析的中间输出 .csv(见第 1.4 节)
Stata 分析代码 code/0_analysis/ 所有计量分析的 .do 文件
R 出图/表代码 code/1_figures/, code/2_tables/, code/3_appendix/, code/4_suppappendix/ 读取中间数据、生成 LaTeX 表格和 PDF 图形
环境配置 setup/setup.R, setup/setup.do 自动安装依赖包、设置全局参数
日志 log/ 运行日志,初始为空
产出口 output/ 生成的 .pdf 图和 .tex 表,目录对应论文章节

T.3.2 1.2 软件要求

软件 版本要求 备注
R \(\ge 4.3\) 强烈推荐使用 RStudio
Stata \(\ge 17.0\) StataMP 可显著缩短运行时间
操作系统 macOS / Windows / Linux 均可 原始运行环境为 macOS 14.4.1 (Apple Silicon M3)

T.3.3 1.3 Stata 依赖包

setup/setup.do 通过 SSC 自动安装:

包名 用途
reghdfe 高维固定效应线性回归
ppmlhdfe PPML 高维固定效应回归
ftools 快速分组操作
csdid Callaway-Sant’Anna DiD 估计
drdid Double-robust DiD 估计
binscatter 分组散点图
estout 回归结果输出
regsave 回归结果保存
erepost 估计后处理工具
gph2xl 图形导出 (CGD 仓库安装)

[!] gph2xl 不从 SSC 安装,而是从 Center for Global Development 仓库:http://digital.cgdev.org/doc/stata/MO/Misc

[Y] 所有包的安装均已在 setup.do 中自动化,执行 setup.do 或通过 master.R 调用时自动运行。

T.3.4 1.4 R 依赖包

setup/setup.R 自动安装 (共 36 个用户包 + 8 个基础包):

主要图形与数据处理包:

版本 用途
ggplot2 3.5.2 核心图形引擎
data.table 1.17.0 快速数据处理
dplyr 1.1.4 数据操作
kableExtra 1.4.0 LaTeX 表格生成
knitr 1.50 报告生成
yaml 2.3.10 YAML 配置读取
RStata 1.1.2 从 R 内调用 Stata

辅助可视化包:gghighlight, ggnewscale, ggpubr, ggridges, viridis, scales, RColorBrewer, grid, gridExtra, showtext, sysfonts

数据处理与分析包:tidyr, plyr, reshape, reshape2, stringr, magrittr, openxlsx, DescTools, devtools, assertthat, papaja, tinylabels

T.3.5 1.5 硬件要求

配置项 要求
CPU 测试于 Apple Silicon M3 14-core
RAM 16 GB+
额外存储 25 MB – 250 MB
运行时间 StataMP 约 1–2 小时;StataBE 约 2–8 小时

T.3.6 1.6 随机数种子

环境 文件 种子
R setup/setup.R:81 541102832 (base::set.seed)
Stata setup/setup.do:33-34 set seed 1312, set sortseed 1231

[Y] 双环境均有设定种子,可确保伪随机过程的复现性。


T.4 README 运行流程

T.4.1 2.1 总体流程

master.R 是整个复现包的唯一入口。在一个正确配置的环境中,运行 master.R 即可依次完成从数据清洗到最终图表输出的全过程。

宏观流程 (引用自 README.mdWORKFLOW.md):

master.R
 +-- Step 0: 设置项目根目录,打开 log/master.log,读取 config.yml
 +-- Step 1: RStata 配置 -> setup/setup.do (Stata 环境 + 包安装)
 +-- Step 2: code/0_analysis/0_master_run_analysis.do (Stata 全部分析)
 |    +-- 1_main_scripts/0_1_master_run_main_analyses.do (正文 11 个分析)
 |    +-- 2_appendix_scripts/0_2_master_run_appendix_analyses.do (附录 11 个分析)
 |    +-- 3_suppappendix_scripts/0_3_master_run_suppappendix_analyses.do (补充附录 6 个分析)
 +-- Step 3: setup/setup.R (R 环境 + 包安装 + 辅助函数)
 +-- Step 4: code/1_figures/0_master_run_figure.R (正文 7 张图)
 +-- Step 5: code/2_tables/0_master_run_table.R (正文 8 张表)
 +-- Step 6: code/3_appendix/0_master_run_appendix.R (附录 20 张图 + 9 张表)
 +-- Step 7: code/4_suppappendix/0_master_run_suppappendix.R (补充附录 5 张图 + 18 张表)
 +-- Step 8: 关闭日志、报告耗时、清理内存

T.4.2 2.2 详细步骤分解

Step 0 — master.R:60-116:环境设置

# 安装并加载 rprojroot,以 config.yml 所在目录为项目根
root_criterion <- rprojroot::has_file("config.yml")
project_root <- rprojroot::find_root(root_criterion)

# 打开 log/master.log,捕获全部控制台输出
sink(log_file, append = FALSE, split = TRUE)

# 加载 config.yml,将 dirs 子节点全部路径化为全局变量
config <- yaml::read_yaml(file.path(project_root, "config.yml"))
dirs <- lapply(config$dirs, \(p) file.path(project_root, p))
list2env(dirs, .GlobalEnv)

此处 config.yml 中定义的路径包括:

配置键 映射的全局变量 默认路径
code_dir code_dir code
analysiscode_dir analysiscode_dir code/0_analysis
figurescode_dir figurescode_dir code/1_figures
tablescode_dir tablescode_dir code/2_tables
appendixcode_dir appendixcode_dir code/3_appendix
supplementalcode_dir supplementalcode_dir code/4_suppappendix
input_dir input_dir data/input
intermediate_dir intermediate_dir data/intermediate_datasets
included_dir included_dir data/included_datasets
output_dir output_dir output
figures_dir figures_dir output/overleaf_figures
tables_dir tables_dir output/overleaf_tables
figures_appendix_dir figures_appendix_dir output/overleaf_figures_appendix
tables_appendix_dir tables_appendix_dir output/overleaf_tables_appendix
figures_supplementalappendix_dir figures_supplementalappendix_dir output/overleaf_figures_supplementalappendix
tables_supplementalappendix_dir tables_supplementalappendix_dir output/overleaf_tables_supplementalappendix
log_dir log_dir log
setup_dir setup_dir setup

Step 1 — master.R:191-258:Stata 环境设置

master.R 定义了一个 run_stata() 辅助函数,用于安全地将 .do 文件传递给 RStata::stata()

在调用 setup/setup.do 之前,先通过 RStata 设置 Stata 的全局宏:

run_stata(sprintf('global PROJ_ROOT "%s"', root_for_stata), is_file = FALSE)
run_stata('cd \"$PROJ_ROOT\"', is_file = FALSE)
run_stata('pwd', is_file = FALSE)

然后执行 setup/setup.do,该文件完成: - clear all + version 17.0 + set more off - 设置随机种子 (set seed 1312, set sortseed 1231) - Stata 环境参数 (maxvar 30000, type double, scrollbufsize 500000 等) - 验证工作目录是否为项目根 (检查 config.yml 存在性) - 打开 log/setup.log - 逐一检查并安装所需 Stata 包 (ssc install / net install)

Step 2 — master.R:261-279:Stata 全部分析

执行 code/0_analysis/0_master_run_analysis.do

capture program drop master_run
program define master_run
    args masterfile
    display as text "Starting : `masterfile'"
    noisily do "`masterfile'"
    if _rc {
        display as error "Error in `masterfile'  (return code = `_rc')"
        log close
        exit _rc
    }
    display as text "Finished : `masterfile'  (rc = 0)"
end

该程序依次调用三个子模块:

master_run "`main_do'"   // 1_main_scripts/0_1_master_run_main_analyses.do
master_run "`app_do'"    // 2_appendix_scripts/0_2_master_run_appendix_analyses.do
master_run "`supp_do'"   // 3_suppappendix_scripts/0_3_master_run_suppappendix_analyses.do

关键全局宏RUN_MICRO

capture noisily ifndef RUN_MICRO global RUN_MICRO = 1

该宏默认为 1,控制是否执行「微数据 (microdata) 分析」。在正文和附录的 master 脚本中,涉及 3a_run_micro_tfp_analysis.do5b_run_mechanisms_lbd_micro_analysis.doAPP_D_run_lbd_micro_analysis.doSUPP_APP_B_run_micro_tfp_dynamic_analysis.doSUPP_APP_C_run_unido_analysis.do 的代码,均由 if "$RUN_MICRO" == "1" 条件保护。

Step 3 — master.R:283-298:R 环境设置

source(file.path(setup_dir, "setup.R")) 完成: - 安装并加载 36 个 R 包 - 配置 ggplot2 全局主题 (Arial 12pt, 最小化主题, 不含网格线, 自定义坐标轴样式) - 设置 showtext 字体渲染 - 定义三个核心辅助函数: - run_r_scripts() — 安全的 R 脚本执行器 (含路径校验、错误捕捉) - save_figure_footnote() — 图注以 .tex 文件保存 - save_plot() — ggplot 对象以 cairo_pdf 设备保存为 PDF

Step 4–7 — master.R:300-322:R 图表生成

master.R 依次调用 run_r_scripts() 执行四个 R 总控脚本:

r_scripts <- list(
  "Figures R master script"    = "code/1_figures/0_master_run_figure.R",
  "Tables R master script"     = "code/2_tables/0_master_run_table.R",
  "Appendix R master script"   = "code/3_appendix/0_master_run_appendix.R",
  "Supp. Appendix R master script" = "code/4_suppappendix/0_master_run_suppappendix.R"
)

每个 R 总控脚本 source() 对应的单个图表脚本,所有输出均写入 output/ 相应子目录。

T.4.3 2.3 数据流程图

data/input/*.dta, *.csv            (原始输入)
     |
     v
code/0_analysis/* (Stata 分析)
     |
     +- 产出--> data/intermediate_datasets/*.csv   (中间数据)
     |
     +- 产出--> data/included_datasets/*.csv       (非公开微数据的中间产出)
                    |
                    v
           code/1_figures/*.R --(读取)--> 中间数据 --> output/overleaf_figures/*.pdf, *.tex
           code/2_tables/*.R  --(读取)--> 中间数据 --> output/overleaf_tables/*.tex
           code/3_appendix/*.R --(读取)--> 中间数据 --> output/overleaf_*_appendix/*
           code/4_suppappendix/*.R --(读取)--> 中间数据 --> output/overleaf_*_supplementalappendix/*

[Y] 完整管道可通过 master.R 一键执行。Stata 分析 -> 中间 CSV -> R 图表制作,三层分离,设计清晰。


T.5 可复现程度判断

T.5.1 3.1 数据可用性分级

本复现包的数据可用性并非全有或全无,而是按分析等级分层:

分类 状态 涉及内容
完整数据管道复现 [N] 不可行 核心微数据 mms_TFP_micro.dta(植物级面板 1980–1986) 未包含;UNIDO INDSTAT2 数据 unido_robustness_dataset.dta 未包含
处理后数据复现 [Y] 可复现 主要 MMS 面板 (4-digit 1968–1986, 5-digit 1970–1986) 内包含;COMTRADE 贸易数据内包含;政策数据全部包含
数据矩/参数输出复现 [Y] 可复现 来自微数据分析的中间 .csv 输出 (data/included_datasets/ 中 5 个文件) 已预装,使得即使源微数据不可用,R 图表仍可生成
仅代码级审核 有条件 涉及 RUN_MICRO 全局宏的 5 个 Stata do 文件代码存在但依赖缺失源数据

T.5.2 3.2 缺失数据分析详情

缺失数据集1:mms_TFP_micro.dta

  • 位置:预期位于 data/input/
  • 性质:韩国统计厅官方微数据,专有数据,不可公开分发
  • 影响范围:
    • code/0_analysis/1_main_scripts/3a_run_micro_tfp_analysis.do(微观 TFP 分析)
    • code/0_analysis/1_main_scripts/5b_run_mechanisms_lbd_micro_analysis.do(微观 LBD 机制分析)
    • code/0_analysis/2_appendix_scripts/APP_D_run_lbd_micro_analysis.do(附录微观 LBD)
    • code/0_analysis/3_suppappendix_scripts/SUPP_APP_B_run_micro_tfp_dynamic_analysis.do(动态微 TFP)
  • 补救措施:对应的 .csv 中间结果已预放置在 data/included_datasets/ 中,R 脚本直接读取这些预计算结果。

缺失数据集2:unido_robustness_dataset.dta

  • 位置:预期位于 data/input/supp/
  • 性质:INDSTAT2 Rev.3,原始通过哈佛大学图书馆购买;新版本在更开放的 UNIDO 协议下可用
  • 影响范围:
    • code/0_analysis/3_suppappendix_scripts/SUPP_APP_C_run_unido_analysis.do
  • 补救措施:对应的 .csv 中间结果已预放置在 data/included_datasets/ 中。

T.5.3 3.3 可复现性分类表

复现级别 可行? 说明
完整数据管道复现 [N] MMS 微数据和 UNIDO 数据不可公开获取
公开数据子集完整复现 [Y] 所有 MMS 面板、COMTRADE、政策数据均包含在包内
R 端图表与表格完整复现 [Y] 依赖的中间 CSV 文件均在包内 (intermediate_datasets 运行时生成;included_datasets 预装)
Stata 端「有数据」部分的分析 [Y] 28 个 do 文件中有 23 个使用包内数据运行 (不包括 5 个受 RUN_MICRO 保护的脚本)
「仅代码」级别的微数据分析审计 [Y] 5 个受保护的 do 文件代码完整,可供审查逻辑和语法

[N] 如果你没有 MMS 微数据和 UNIDO 数据的访问权限,则相关 Stata 脚本将跳过 (或被 RUN_MICRO=0 跳过)。生成 R 图表不受影响,因为在 data/included_datasets/ 中已预存了来自这些脚本的中间结果。


T.6 代码文件地图

T.6.1 4.1 顶层结构

replicationpackage/
+-- master.R                         # 总控 R 脚本
+-- config.yml                       # 项目配置
+-- replicationpackage.Rproj         # RStudio 项目文件
+-- README.md                        # 主文档
+-- PACKAGE_INFO.txt                  # 包元数据
+-- MANIFEST.txt                      # 文件清单
|
+-- setup/
|   +-- setup.R                      # R 环境设置
|   +-- setup.do                     # Stata 环境设置
|
+-- entrypoints/
|   +-- master_bootstrap.do          # 从 Stata 启动 master.R
|
+-- code/
|   +-- 0_analysis/                  # 所有 Stata 分析脚本
|   +-- 1_figures/                   # 正文图形 R 脚本
|   +-- 2_tables/                    # 正文表格 R 脚本
|   +-- 3_appendix/                  # 附录图形与表格 R 脚本
|   +-- 4_suppappendix/              # 补充附录图形与表格 R 脚本
|
+-- data/
|   +-- input/                       # 原始输入数据
|   |   +-- supp/                    # 附录/补充数据
|   +-- intermediate_datasets/       # Stata 产出的中间 CSV(初始空)
|   +-- included_datasets/           # 预存的非公开分析中间结果
|   +-- policydata/                  # 政策原始数据
|   +-- ngrams/                      # NYTimes n-gram 数据
|   +-- defensedata/                 # 国防数据
|   +-- naverdata/                   # Naver 新闻数据
|
+-- output/                          # 生成的图表输出(初始空)
|   +-- overleaf_figures/
|   +-- overleaf_tables/
|   +-- overleaf_figures_appendix/
|   +-- overleaf_tables_appendix/
|   +-- overleaf_figures_supplementalappendix/
|   +-- overleaf_tables_supplementalappendix/
|
+-- log/                             # 运行日志(初始空)
+-- documentation/
    +-- WORKFLOW.md                  # 工作流文档
    +-- dataset_codebooks/           # 数据集码本

T.6.2 4.2 Stata 分析脚本清单

T.6.2.1 (A) 正文分析 (code/0_analysis/1_main_scripts/)

总控:0_1_master_run_main_analyses.do

# 文件名 功能
1 1_run_growth_analysis.do 主要增长事件研究
2 2a_run_devoutcomes_analysis.do 进一步的发展成果事件研究
3 2b_run_koreatrade_analysis.do 韩国贸易模式分析
4 3a_run_micro_tfp_analysis.do 微观层面 TFP 分析 [!] 需 RUN_MICRO=1
5 3b_run_doublerobust_analysis.do 双重稳健统计分析
6 3c_run_worldtrade_analysis.do 世界贸易模式分析
7 4_run_policy_analysis.do 产业政策分析
8 5a_run_mechanisms_lbd_analysis.do LBD 机制分析
9 5b_run_mechanisms_lbd_micro_analysis.do 微观层面 LBD 机制 [!] 需 RUN_MICRO=1
10 6a_run_linkages_growthprice_analysis.do 增长与价格的关联分析
11 6b_run_linkages_trade_analysis.do 贸易关联分析

T.6.2.2 (B) 附录分析 (code/0_analysis/2_appendix_scripts/)

总控:0_2_master_run_appendix_analyses.do

# 文件名 功能
1 APP_B_run_priceandyn_analysis.do 价格与劳动生产率事件研究
2 APP_B_run_industry_tfp_analysis.do 行业层面 TFP 事件研究
3 APP_C_run_worldtrade_analysis_prob.do 世界贸易模式的概率模型
4 APP_D_run_lbd_micro_analysis.do 微观层面 LBD 分析 [!] 需 RUN_MICRO=1
5 APP_D_run_policy_aggregate_figures.do 汇总政策图形
6 APP_D_run_policy_crowdingout_analysis.do 政策挤出效应分析
7 APP_D_run_policy_mrpk_analysis.do 资本边际回报的政策分析
8 APP_D_run_policy_trade_analysis.do 产业政策的贸易影响
9 APP_E_run_linkages_mechanisms_analysis.do 关联机制分析
10 APP_E_run_linkages_morecomes_analysis.do 额外的关联成果
11 APP_G_run_sutva_analysis.do SUTVA 假定与挤出分析

T.6.2.3 (C) 补充附录分析 (code/0_analysis/3_suppappendix_scripts/)

总控:0_3_master_run_suppappendix_analyses.do

# 文件名 功能
1 SUPP_APP_A_run_policy_trade_1968_analysis.do 1968 年政策贸易模式分析
2 SUPP_APP_B_run_4digit_continuous_analysis.do 4-digit 连续处理变量分析
3 SUPP_APP_B_run_micro_tfp_dynamic_analysis.do 动态微层面 TFP 分析 [!] 需 RUN_MICRO=1
4 SUPP_APP_C_run_unido_analysis.do UNIDO 工业数据稳健性检验 [!] 需 RUN_MICRO=1
5 SUPP_APP_D_run_policy_dissagg_investment_analysis.do 按资产类别分解的投资分析
6 SUPP_APP_E_run_dd_comtrade_analysis.do COMTRADE 数据 DiD 版本分析

T.6.2.4 (D) 辅助子 Do-File(code/0_analysis/subdofiles/)

文件名 用途
1b_main_subrollingloop.do 正文滚窗循环子程序
2b_devoutcomes_subrollingloop.do 发展成果滚窗循环
6b_linkages_subrollingloop.do 关联滚窗循环
6b_linkages_subrollingloop_wcontrols.do 带控制的关联滚窗循环
8b_analysis_sutva_ksic_limitingexposure_largeloop.do SUTVA 受限暴露大循环
APPb_linkages_subrollingloop_simplified.do 简化版关联滚窗循环

T.6.3 4.3 R 图形脚本清单

T.6.3.1 (A) 正文图形 (code/1_figures/)

总控:0_master_run_figure.R

脚本 产物 对应论文图
Figure1.R policyplot.pdf Figure 1: 产业政策时间线
Figure2.R mainoutputplot.pdf Figure 2: 主要产出结果
Figure3.R devcombinedplot.pdf Figure 3: 发展成果合并图
Figure4.R dddtradeplot.pdf Figure 4: DDD 贸易图
Figure5.R capitalplot.pdf Figure 5: 资本图
Figure6.R forwardlinkageplot.pdf Figure 6: 前向关联图
Figure7.R forwardlinkagetrade.pdf Figure 7: 前向关联贸易图

T.6.3.2 (B) 附录图形 (code/3_appendix/)

总控:0_master_run_appendix.R — 18 个图形脚本:

脚本 产物 PDF 功能描述
FigureA1.R appendixnewsplotrobust.pdf 附录 A1: 新闻稳健性图
FigureA2.R appendixpolicyplot.pdf 附录 A2: 政策时间线附录
FigureB1.R appendixrobustoutput.pdf 附录 B1: 稳健产出图
FigureB2.R appendixproductivityprices.pdf 附录 B2: 生产率与价格
FigureB3.R industrytfpfigure.pdf 附录 B3: 行业 TFP 图
FigureB4.R semidd_4digit_plot.pdf 附录 B4: 半参数 DiD 4-digit 图
semidd_5digit_plot.pdf 附录 B5: 半参数 DiD 5-digit 图
semidd_sitc4_plot.pdf 附录 B6: 半参数 DiD SITC4 图
FigureD1.R gg_gridinvest.pdf 附录 D1: 投资网格图
FigureD2.R gg_mrpk_plot.pdf 附录 D2: MRPK 图
FigureD3.R combined_crowdout_plot.pdf 附录 D3: 挤出效应合并图
FigureD4.R trade_ridge_plots.pdf 附录 D4: 贸易脊线图
FigureE1.R gg_devlink_grid.pdf 附录 E1: 发展关联网格图
FigureE2.R gg_rcatotallink_grid.pdf 附录 E2: RCA 总关联网格图
FigureE3.R gg_mechanismlink_grid.pdf 附录 E3: 机制关联网格图
FigureF1.R gg_backwardlink_grid.pdf 附录 F1: 后向关联网格图
FigureF2.R gg_backwardlink_lf_grid.pdf 附录 F2: 后向关联劳力网格图
FigureG1.R gg_io_exposure_figure.pdf 附录 G1: 投入产出暴露图
FigureG2.R gg_control_io_figure.pdf 附录 G2: 控制 I/O 图
FigureG3.R gg_crowdingout_io_figure.pdf 附录 G3: 挤出 I/O 图

T.6.3.3 (C) 补充附录图形 (code/4_suppappendix/)

总控:0_master_run_suppappendix.R — 5 个图形脚本:

脚本 产物 PDF 功能描述
Figure_A1.R newspapeealternative.pdf 补充附录 A1: 新闻替代图
Figure_B1.R tfpmicrodynamic.pdf 补充附录 B1: TFP 微动态图
Figure_B2.R continuoustreatmentplot.pdf 补充附录 B2: 连续处理变量图
Figure_C1.R combined_ddd_unido_figure.pdf 补充附录 C1: UNIDO DDD 合并图
Figure_C2.R combined_dd_rca_alt_figure.pdf 补充附录 C2: DD RCA 替代图

T.6.4 4.4 R 表格脚本清单

T.6.4.1 (A) 正文表格 (code/2_tables/)

总控:0_master_run_table.R

脚本 产物 对应论文表
Table1.R tfpcrosssection_kable.tex Table 1: TFP 横截面
Table2-4.R kable_att.tex Table 2: ATT 结果
kable_trade_att.tex Table 3: 贸易 ATT
kable_invest_att.tex Table 4: 投资 ATT
Table5.R industry_lbd_mechanism_kable.tex Table 5: 行业 LBD 机制
Table6.R plant_lbd_mechanism_kable.tex Table 6: 企业 LBD 机制
Table7.R avg_out_table.tex Table 7: 平均产出结果
Table8.R avg_prices_table.tex Table 8: 平均价格结果

此外,Table2-4.RTable7.RTable8.R 等脚本还会额外生成解释性小结果文件 (results_*.tex),用于在论文中标注特定数值。

T.6.4.2 (B) 附录表格 (code/3_appendix/)

总控:0_master_run_appendix.R — 9 个表格脚本:

脚本 产物 功能描述
TableA1.R tabledescriptive.tex 附录表 A1: 描述性统计
TableC1.R trade_prob_table.tex 附录表 C1: 贸易概率表
TableD1.R industry_lbd_robust_mechanism.tex 附录表 D1: 行业 LBD 稳健性机制
TableD2.R plant_lbd_robust_mechanism.tex 附录表 D2: 企业 LBD 稳健性机制
TableD3.R tradepolicy_kable.tex 附录表 D3: 贸易政策表
TableE1.R avg_lf_output_table.tex 附录表 E1: 平均劳动力产出
TableE2.R avg_lf_prices_table.tex 附录表 E2: 平均劳动力价格
TableE3.R avg_io_moredev_table.tex 附录表 E3: I/O 额外发展
TableE4.R avg_lf_moredev_kable.tex 附录表 E4: 劳动力额外发展

T.6.4.3 (C) 补充附录表格 (code/4_suppappendix/)

总控:0_master_run_suppappendix.R — 18 个表格脚本:

脚本 产物 功能描述
Table_A1.R sectoracttable.tex 行业法律行为表
Table_A2.R japansectoractlisttable.tex 日本行业法律行为表
Table_A3.R pretradepolicytable.tex 预贸易政策表
Table_B1.R tablerollingoutput.tex 滚窗产出表
Table_B2.R tablerollingdevelopment.tex 滚窗发展表
Table_C1.R tablerollingca.tex 滚窗比较优势表
Table_C2.R tablerollingdddrca.tex 滚窗 DDDRCA 表
Table_C3.R tablerollingdaltca.tex 滚窗替代 CA 表
Table_D1.R tablerollingcapital.tex 滚窗资本表
Table_D2.R tablerollingcapital2.tex 滚窗资本表2
Table_E1.R tablerollingforwardoutput.tex 滚窗前向产出表
Table_E2.R tablerollingforwardprices.tex 滚窗前向价格表
Table_E3.R tablerollingforwarddev.tex 滚窗前向发展表
Table_E4.R tablerollingforwardtrade.tex 滚窗前向贸易表
Table_E5.R tablerollingforwardmech.tex 滚窗前向机制表
Table_F1.R tablebacklinkoutput.tex 后向关联产出表
Table_F2.R tablebacklinkprices.tex 后向关联价格表
Table_F3.R backlinkoutputlf.tex 后向关联劳动力产出表

T.7 数据输入与输出关系

T.7.1 5.1 输入数据清单

T.7.1.1 (A) 核心数据集 (data/input/)

文件 格式 来源 说明
mms_merged_harmonized_panel_cleaned4reg_4digit.dta .dta 经济企划院 MMS 数字化 MMS 4-digit KSIC 面板 1968–1986
mms_merged_harmonized_panel_cleaned4reg_5digit.dta .dta 经济企划院 MMS 数字化 MMS 5-digit KSIC 面板 1970–1986
comtrade_worldsitc_panel_cleaned4reg_4digit.dta .dta UN COMTRADE API 世界贸易 4-digit SITC 面板
comtrade_worldsitc_panel_cleaned4reg_4digit_prob_HCIonly.dta .dta UN COMTRADE + GDP 简化版 HCI 行业贸易数据
comtrade_merged_harmonized_panel_cleaned4reg_4digit.dta .dta UN COMTRADE + MMS 韩国配套贸易加行业控制变量
mms_TFP_5digit.dta .dta MMS + 作者计算 5-digit MMS 含 TFP
mms_policy_4digit.dta .dta MMS + 作者计算 4-digit 政策编码 MMS
mms_policy_5digit.dta .dta MMS + 作者计算 5-digit 政策编码 MMS

T.7.1.2 (B) 衍生产品 (data/input/)

文件 格式 来源
pre1973_4digit.csv .csv MMS 1973 年前 4-digit 均值
pre1973_5digit.csv .csv MMS 1973 年前 5-digit 均值
pre1973_trade.csv .csv COMTRADE 1973 年前贸易均值
agg_policyinput.dta .dta MMS 汇总政策投入
agg_policytrade.dta .dta Luedde-Neurath 贸易政策
tradepolicy_panel.dta .dta 贸易政策变量面板

T.7.1.3 (C) 补充数据 (data/input/supp/)

文件 用途
mms_MRPK_5digit.dta 5-digit 资本边际收益产品
mms_continuous_analysis.dta 连续处理变量分析数据
mms_crowding_out.dta 挤出效应分析数据
mms_linkage_mech_4digit.dta 4-digit 关联机制
mms_linkage_mech_5digit.dta 5-digit 关联机制
mms_linkage_more_4digit.dta 4-digit 额外关联结果
mms_linkage_more_5digit.dta 5-digit 额外关联结果
mms_supp_inv.dta 按资产类别的投资数据
unido_robustness_dataset.dta [N] UNIDO 稳健性数据 (包内未含)

T.7.1.4 (D) 政策/来源数据 (其他 data/ 子目录)

文件 位置 来源
policy_commercialbanking_yearbook_loans.csv data/input/ 韩国银行统计年报
policy_kdbbanking_yearbook_loans.csv data/input/ 韩国银行统计年报
policy_taxes.csv data/input/ Kwack (1984, 1985) KDI
acts_table_simple_combined_all.csv data/policydata/ 韩国法律信息中心
japan_legalact_table.csv data/policydata/ Okazaki (1998), Yoshioka & Hirofumi (2016)
tariffs.csv data/policydata/ Luedde-Neurath (1982)
article_info.csv data/naverdata/ Naver News Library API
ngram_political_troop.csv data/ngrams/ NYTimes Chronicle
defense.xlsx data/defensedata/ Choi & Lee (1989)

T.7.2 5.2 预存的非公开分析中间数据 (data/included_datasets/)

这5个文件是从依赖受限数据的 Stata 分析中预计算并保留的:

文件 来源分析 内容
did_crossection_results_microtfp_results_estout.csv 3a_run_micro_tfp_analysis.do 微观 TFP 横截面结果 (Table 1 使用)
did_largerolling_results_microtfp_all_results.csv SUPP_APP_B_run_micro_tfp_dynamic_analysis.do 微观 TFP 动态滚窗结果 (Figure B1 supp. 使用)
did_largerolling_unido_all_results.csv SUPP_APP_C_run_unido_analysis.do UNIDO 滚窗结果 (Figure C1 supp. 使用)
mechanism_prod_micro_results_estout.csv 5b_run_mechanisms_lbd_micro_analysis.do 企业 LBD 机制结果 (Table 6 使用)
mechanism_prod_micro_robustness_results_estout.csv APP_D_run_lbd_micro_analysis.do 企业 LBD 稳健性结果 (Table D2 使用)

T.7.3 5.3 Stata 分析与中间数据的关系

Stata 脚本产出中间数据,存入 data/intermediate_datasets/。以下是关键映射:

Stata 分析 产出的中间 CSV 文件示例
1_run_growth_analysis.do did_largerolling_mainresults_alloutput_all_results.csv
2a_run_devoutcomes_analysis.do did_largerolling_allproductivity_all_results.csv
2b_run_koreatrade_analysis.do did_largerolling_koreatrade_ppml_rca_all_results.csv
3b_run_doublerobust_analysis.do doublyrobust_att.csv, doublyrobust_trade_att.csv, doublyrobust_invest_att.csv
3c_run_worldtrade_analysis.do did_largerolling_worldtrade_ppml_rca_all_results.csv
4_run_policy_analysis.do did_largerolling_mainpolicycapital_results_papermain.csv
5a_run_mechanisms_lbd_analysis.do mechanism_prod_interactions_results_estout.csv
6a_run_linkages_growthprice_analysis.do did_io_main_all_results.csv
6b_run_linkages_trade_analysis.do did_io_comtrade_all_results.csv

T.7.4 5.4 R 脚本与中间数据的映射

R 脚本读取中间 CSV,生成最终的 .tex.pdf 文件。以正文表格为例:

Table1.R
  读取: data/included_datasets/did_crossection_results_microtfp_results_estout.csv
  输出: output/overleaf_tables/tfpcrosssection_kable.tex

Table2-4.R
  读取: data/intermediate_datasets/doublyrobust_att.csv
  读取: data/intermediate_datasets/doublyrobust_trade_att.csv
  读取: data/intermediate_datasets/doublyrobust_invest_att.csv
  输出: output/overleaf_tables/kable_att.tex
  输出: output/overleaf_tables/kable_trade_att.tex
  输出: output/overleaf_tables/kable_invest_att.tex

Table5.R
  读取: data/intermediate_datasets/mechanism_prod_interactions_results_estout.csv
  输出: output/overleaf_tables/industry_lbd_mechanism_kable.tex

Table6.R
  读取: data/included_datasets/mechanism_prod_micro_results_estout.csv
  输出: output/overleaf_tables/plant_lbd_mechanism_kable.tex

[!] 关键设计选择:R 脚本并不直接读取 Stata 的 .dta 文件,而是读取 Stata 分析产出的中间 CSV 文件。这使得 Stata 和 R 之间形成了解耦的「管道」:如果复现者仅修改了 R 图表样式,无需重新运行耗时的 Stata 分析。


T.8 手动复现代码

T.8.1 6.1 RStudio 快速启动

# 1. 双击 replicationpackage.Rproj 打开 RStudio
# 2. 在 RStudio Console 中执行:
source("master.R")

如果不想在 RStudio 中操作,也可从终端:

Rscript master.R

T.8.2 6.2 config.yml 配置

在首次运行前,必须修改 config.yml 底部:

user_dirs:
  stata_path: "/Applications/Stata/StataMP.app/Contents/MacOS/stata-mp"  # 修改为你的 Stata 路径
  stata_version: 17  # 修改为你的 Stata 版本号

user_settings:
  skip_stata: FALSE  # 设为 TRUE 可跳过所有 Stata 分析

常见 Stata 可执行文件路径:

平台 典型路径
macOS StataSE /Applications/Stata/StataSE.app/Contents/MacOS/stata-se
macOS StataMP /Applications/Stata/StataMP.app/Contents/MacOS/stata-mp
Windows Stata 18 C:/Program Files (x86)/Stata18/
Linux /usr/local/stata18/stata

T.8.3 6.3 skip_stata 选项

user_settings:
  skip_stata: TRUE

设为 TRUE 后,master.R 将跳过所有 Stata 脚本,仅运行 R 图表生成部分。这在以下场景中非常有用:

  • 你已经运行过 Stata 分析一次,只想重新生成图表
  • 在没有 Stata 许可证的环境中预览图表质量
  • 调试 R 图表代码

2–6 分钟 即可完成所有 R 图表生成。

T.8.4 6.4 在 Stata 内手动运行单个模块

如果你更偏好在 Stata 中交互式运行 (而非通过 R),可在 Stata 中依次执行:

// 1. 设置工作目录为项目根
cd "/path/to/replicationpackage"
global PROJ_ROOT "/path/to/replicationpackage"

// 2. 设置环境
do setup/setup.do

// 3. 运行全部 Stata 分析
do code/0_analysis/0_master_run_analysis.do

// 4. 或者只运行正文分析
do code/0_analysis/1_main_scripts/0_1_master_run_main_analyses.do

// 5. 或者只运行单个分析脚本
do code/0_analysis/1_main_scripts/1_run_growth_analysis.do

T.8.5 6.5 控制是否运行微数据分析

在调用 0_master_run_analysis.do 之前,可设置全局宏:

global RUN_MICRO = 0  // 跳过微数据分析

单独运行微数据分析:

global RUN_MICRO = 1
do code/0_analysis/1_main_scripts/3a_run_micro_tfp_analysis.do

T.8.6 6.6 从 Stata 反向启动 R

如果希望在 Stata 环境中一键启动整个管道 (包括 R 部分),可使用:

do entrypoints/master_bootstrap.do

该脚本通过 shell Rscript master.R 来调用 master.R,实现从 Stata 内部启动完整复现。

[!] master_bootstrap.do 中的 Rscript 路径默认为 /usr/local/bin/Rscript,根据实际系统需要修改。

T.8.7 6.7 仅重新生成图形的 R 命令

(前提:setup.R 已执行,skip_stata: TRUE 已设置,或 Stata 中间数据已存在)

source("setup/setup.R")
source("code/1_figures/0_master_run_figure.R")   # 仅正文图形
source("code/2_tables/0_master_run_table.R")      # 仅正文表格
source("code/3_appendix/0_master_run_appendix.R")  # 仅附录
source("code/4_suppappendix/0_master_run_suppappendix.R") # 仅补充附录

T.9 运行日志检查结果

T.9.1 7.1 日志文件位置

日志文件 内容 写入者
log/master.log 所有 R 控制台输出 + Stata 调用回显 master.R
log/setup.log Stata 环境验证 + 包安装详情 setup/setup.do
log/0_master_run_analysis.log 所有 Stata 分析的详细执行记录 0_master_run_analysis.do

T.9.2 7.2 检查要点

log/setup.log:应包含

  • "Confirmation: Current working Stata directory is..." — 确认根目录验证通过
  • 每个包的安装状态:"reghdfe is already installed.""Installing reghdfe..."
  • "Setup complete." — 正常结束

log/0_master_run_analysis.log:应包含

  • "RUN_MICRO set to: 1" — 微数据分析开关状态
  • 三个 master_run 调用的 "Starting : ...""Finished : ..."
  • 每个子模块的详细 Stata 输出
  • 结尾 "All Stata master modules completed successfully."

log/master.log:应包含

  • 时间戳 "Starting time: ..."
  • "Set global skip_stata: FALSE"
  • Stata 分析起始/结束标记
  • 每个 R 脚本的 "Starting script: ...""Successfully finished script: ..."
  • 总计耗时 "Total execution time: X.X minutes"
  • Error instop() 的错误信息

T.9.3 7.3 常见日志错误及排查

错误 可能原因 排查方向
Valid Stata executable not found config.yml 中 Stata 路径不正确 检查 stata_path 是否指向实际存在的 Stata 可执行文件
Missing directories: ... 项目根目录检测失败 确认从项目根目录启动 R,或使用 .Rproj 文件
Error in ... (return code = ...) Stata 脚本执行出错 查看 log/0_master_run_analysis.log 中具体脚本的错误信息
Package not found R 包安装失败 手动运行 source("setup/setup.R"),检查网络连接
file ... not found mms_TFP_micro.dta 缺失 这是预期行为:将 RUN_MICRO 设为 0 或接受日志中的警告
Command ... unrecognized Stata 版本过低 确保 Stata \(\ge 17.0\)

T.10 关键代码逐段解释

T.10.1 8.1 master.R — 总控 R 脚本

T.10.1.1 (A) 项目根目录发现 (第 66–73 行)

if (!requireNamespace("rprojroot", quietly = TRUE)) install.packages("rprojroot")
library(rprojroot)
root_criterion <- rprojroot::has_file("config.yml")
project_root <- rprojroot::find_root(root_criterion)
message("Project root directory: ", project_root)

rprojroot::has_file("config.yml") 创建了一个判定标准:从当前目录向上搜索 config.yml。这使得脚本不依赖绝对路径,无论复现者将复制包放在何处,均能自动定位根目录。

T.10.1.2 (B) 日志系统 (第 76–91 行)

log_file <- file.path(project_root,"log","master.log")
initial_sink_number <- sink.number()
sink(log_file, append = FALSE, split = TRUE)
on.exit({
  while(sink.number() > initial_sink_number) sink()
  if (grDevices::dev.cur() > 1) grDevices::dev.off()
  gc()
}, add = TRUE)

通过 sink() 将 R 控制台输出重定向到 log/master.logsplit = TRUE 表示同时输出到控制台。on.exit() 确保即使脚本意外中断,日志也能正确关闭。

T.10.1.3 (C) config.yml 加载与路径全局化 (第 96–116 行)

config <- yaml::read_yaml(file.path(project_root, "config.yml"))
dirs <- lapply(config$dirs, \(p) file.path(project_root, p))
names(dirs) <- names(config$dirs)
list2env(dirs, .GlobalEnv)

config.ymldirs 节点下的每一个键值对 (如 code_dir: "code") 组合成完整路径并注入 R 全局环境。例如 code_dir 变为 /path/to/replicationpackage/code。这使得所有下游 R 脚本都可以用 code_dir 而非硬编码路径。

T.10.1.4 (D) RStata 集成 (第 140–232 行)

if (!requireNamespace("RStata", quietly = TRUE)) install.packages("RStata")
library(RStata)
options(RStata.StataPath = stata_path,
        RStata.StataVersion = stata_ver)

RStata 包是在 R 中直接调用 Stata 的桥梁。master.R 封装了一个 run_stata() 函数:

run_stata <- function(x, is_file = TRUE, stata_echo = TRUE, skip = skip_stata) {
  if (isTRUE(skip)) {
    message("run_stata(): skipping call because skip_stata = TRUE")
    return(invisible(NULL))
  }
  ...
  result <- tryCatch(
    RStata::stata(x, stataEcho = stata_echo),
    error = function(e)
      stop("run_stata(): Stata execution failed:\n", e$message)
  )
  ...
}

该函数具有三重安全保护:

  1. skip 参数:尊重 config.yml 中的 skip_stata 设置
  2. 路径验证:normalizePath(..., mustWork = TRUE) — 调用前确保 .do 文件存在
  3. 错误捕获:tryCatch 包装 RStata::stata 调用,并将 Stata 错误转为 R 错误传递

T.10.1.5 (E) Stata 工作流 (第 245–279 行)

# Set Stata's global root
root_for_stata <- normalizePath(project_root, winslash = "/")
run_stata(sprintf('global PROJ_ROOT "%s"', root_for_stata), is_file = FALSE)
run_stata('cd \"$PROJ_ROOT\"', is_file = FALSE)

# Setup
run_stata(setup_do_file)

# Main analysis
run_stata(master_do_file)

在执行 .do 文件之前,先通过 run_stata(..., is_file = FALSE) 以命令行方式设置 Stata 的全局宏 $PROJ_ROOT 并切换工作目录。这确保了即使 RStata 从 R 会话的不同目录启动,Stata 侧的路径也是正确的。

T.10.1.6 (F) R 工作流 (第 283–326 行)

tryCatch(
  source(file.path(setup_dir, "setup.R")), error = function(e) {
    stop("Failed to run R setup script: ", e$message)
  }
)
if (!exists("run_r_scripts", mode = "function")) {
  stop("Critical: run_r_scripts function not defined after setup.R. ...")
}

在调用 setup.R 后,检查 run_r_scripts 函数是否成功定义——这是一种防御性编程模式,确保下游脚本执行依赖的辅助函数已就位。

T.10.1.7 (G) 运行时间统计与清理 (第 329–344 行)

end_time <- Sys.time()
total_duration_mins <- as.numeric(difftime(end_time, start_time, units = "mins"))
message(sprintf("Total execution time: %.1f minutes", total_duration_mins))
rm(list = ls(all.names = TRUE))
gc()

在完成所有工作后,报告精确的分钟级运行时间,然后彻底清理内存。

T.10.2 8.2 0_master_run_analysis.do — 顶层 Stata 总控

capture program drop master_run
program define master_run
    args masterfile
    display as text "Starting : `masterfile'"
    noisily do "`masterfile'"
    if _rc {
        display as error "Error in `masterfile'  (return code = `_rc')"
        log close
        exit _rc
    }
    display as text "Finished : `masterfile'  (rc = 0)"
end

核心设计模式:

  • master_run 是一个 Stata 程序,封装了「执行子模块 do-file + 错误检查」逻辑
  • 每个子模块执行完后立即检查 _rc,非零则中止并关闭日志
  • 三个子模块串行执行:
master_run "`main_do'"   // 正文
master_run "`app_do'"    // 附录
master_run "`supp_do'"   // 补充附录
  • 全局宏控制 (第 36–38 行):
capture noisily ifndef RUN_MICRO global RUN_MICRO = 1
display as text "RUN_MICRO set to: $RUN_MICRO"

逻辑是:如果调用方 (如 master.R) 未预先定义 RUN_MICRO,则默认将其设为 1(执行微数据分析)。这种设计使得 master.R 可以在调用前插入 global RUN_MICRO = 0 来跳过微数据分析。

T.10.3 8.3 0_1_master_run_main_analyses.do — 正文分析总控

该脚本按论文呈现顺序串行调用 11 个分析 do-file,每个调用包裹在条件错误检查中。调用结构:

local scriptname "`localscriptdir'/1_run_growth_analysis.do"
noisily do "`scriptname'"
if _rc != 0 {
    display as error "Error in `scriptname' (rc = `_rc')"
    exit _rc
}

两个微数据相关项由 RUN_MICRO 条件保护:

if "$RUN_MICRO" == "1" {
    local scriptname "`localscriptdir'/3a_run_micro_tfp_analysis.do"
    ... (同样模式)
}

if "$RUN_MICRO" == "1" {
    local scriptname "`localscriptdir'/5b_run_mechanisms_lbd_micro_analysis.do"
    ... (同样模式)
}

T.10.4 8.4 setup.do — Stata 环境配置

T.10.4.1 (A) 基础环境设置 (第 30–40 行)

clear all
version 17.0, user
set more off
set seed 1312
set sortseed 1231
set maxvar 30000
set varabbrev off
set type double
set scrollbufsize 500000
set tracedepth 2
set linesize 120

关键设置: - set varabbrev off — 强制使用完整变量名,避免缩写歧义 - set type double — 默认使用双精度浮点,确保数值精度 - set maxvar 30000 — 提高变量上限,适应高维固定效应模型

T.10.4.2 (B) 项目根目录验证 (第 69–99 行)

local current_Stata_pwd "`c(pwd)'"
capture confirm file "`current_Stata_pwd'/`expected_file'"
if _rc != 0 {
    display as error "ERROR: Stata's current working directory does not appear to be the project root."
    error 601
}

通过检查 config.yml 是否存在来验证 Stata 的工作目录是否为项目根目录。capture confirm file + if _rc != 0 是 Stata 的经典防御模式。

T.10.4.3 (C) 批量包安装 (第 117–157 行)

local packages "reghdfe ppmlhdfe regsave estout ftools csdid drdid erepost binscatter"
foreach pkg in `packages' {
    capture which `pkg'
    if _rc == 0 { ... continue ... }
    capture noisily ssc install `pkg', replace
    ...
}

每个包先用 which 检查是否存在,不存在才安装,安装后再用 which 验证——形成了「存在检查 -> 安装 -> 验证」的三段保护。

gph2xl 特殊处理 (不来自 SSC):

capture which gph2xl
if _rc {
    capture noisily net from http://digital.cgdev.org/doc/stata/MO/Misc
    capture noisily net install gph2xl, replace
}

T.10.5 8.5 setup.R — R 环境配置

T.10.5.1 (A) 批量包安装与加载 (第 33–78 行)

install_and_load <- function(packages, repos = "https://cloud.r-project.org") {
  installed_package_names <- utils::installed.packages()[, "Package"]
  new_packages <- packages[!(packages %in% installed_package_names)]
  if (length(new_packages) > 0) {
    utils::install.packages(new_packages, repos = repos, ...)
  }
  results <- suppressPackageStartupMessages(
    lapply(packages, library, character.only = TRUE, warn.conflicts = FALSE)
  )
  invisible(results)
}

该函数自动区分「已安装」和「缺失」包,仅安装缺失包,然后全部加载。36 个包在 common_package_list 中集中定义,方便维护。

T.10.5.2 (B) 全局图形主题 (第 89–146 行)

showtext::showtext_auto()
font_family_argument <- "Arial"
font_size_argument <- 12

ggplot2::theme_set(
  theme_minimal(
    base_family = font_family_argument,
    base_size = font_size_argument
  ) +
  theme(
    panel.grid = element_blank(),
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank(),
    ...
    axis.ticks = element_line(linewidth = .4),
    ...
  )
)

通过 ggplot2::theme_set() 设置全局默认主题,使得下游所有 .R 脚本在不显式指定主题的情况下自动应用统一的 Arial 12pt、无网格、最小化风格。showtext::showtext_auto() 启用 showtext 字体渲染,解决 PDF 输出中文字体问题。

T.10.5.3 (C) 三个核心辅助函数

run_r_scripts()(第 197–247 行)

  • 路径规范化:normalizePath(script_path, mustWork = TRUE)
  • 错误处理:tryCatch 包裹 source(),将执行错误转为有意义的错误信息
  • 可配置的逐行回显:source(..., echo = verbose_source_echo)

save_figure_footnote()(第 274–371 行)

  • 将图注文本保存为 .tex 文件
  • 自动创建输出目录
  • 文件名不含路径分隔符的校验

save_plot()(第 400–471 行)

  • 使用 ggsave + cairo_pdf 设备保存图形
  • 自动移除已有文件防止 ggsave 追加页面
  • 保存后验证文件确实已创建

T.10.6 8.6 图形与表格生成 (R 端) 的典型模式

Figure2.R 为例 (从 0_master_run_figure.R 调用),典型的 R 图表脚本模式:

  1. 读取中间数据
data_path <- file.path(intermediate_dir, "did_largerolling_mainresults_alloutput_all_results.csv")
df <- read.csv(data_path)
  1. 数据处理与 ggplot 构建:在 df 上进行筛选、聚合、美化

  2. 保存为 PDF

save_plot(plot_object, "mainoutputplot",
          width = 8, height = 6,
          dpi = 600,
          output_dir = figures_dir)
  1. 保存图注 (可选):
save_figure_footnote("Notes: ...", figures_dir, "mainoutputplot_note")

所有 R 图表脚本均输出到配置文件中定义的全局目录变量 (figures_dirtables_dir 等),这些变量在 master.R 中被注入全局环境。


T.11 生成的输出文件

运行 master.R 成功后,以下文件将在 output/ 目录中生成。

T.11.1 9.1 正文图形 (output/overleaf_figures/)

文件名 内容
policyplot.pdf Figure 1: 产业政策时间线与主要政策工具概览
mainoutputplot.pdf Figure 2: 主要产出结果的事件研究图 (含 4-digit 和 5-digit)
devcombinedplot.pdf Figure 3: 多发展指标合并图 (生产率、出口比较优势、贸易等)
dddtradeplot.pdf Figure 4: DDD 世界贸易模式图
capitalplot.pdf Figure 5: 资本积累与投资结果图
forwardlinkageplot.pdf Figure 6: 前向关联效应 (产出与增加值)
forwardlinkagetrade.pdf Figure 7: 前向关联的贸易渠道效应

T.11.2 9.2 正文表格 (output/overleaf_tables/)

文件名 内容
tfpcrosssection_kable.tex Table 1: HCI 与非 HCI 行业的 TFP 横截面对比
kable_att.tex Table 2: 产出与生产率的双重稳健 ATT 估计
kable_trade_att.tex Table 3: 贸易成果的双重稳健 ATT
kable_invest_att.tex Table 4: 投资成果的双重稳健 ATT
industry_lbd_mechanism_kable.tex Table 5: 行业层面学习效应 (LBD) 机制
plant_lbd_mechanism_kable.tex Table 6: 企业层面学习效应机制
avg_out_table.tex Table 7: 前向关联的平均产出效应
avg_prices_table.tex Table 8: 前向关联的平均价格效应

T.11.3 9.3 附录图形 (output/overleaf_figures_appendix/)

20 个 PDF 文件,涵盖:

  • Appendix A: 新闻覆盖与政策描述 (Figure A1–A2)
  • Appendix B: 多种稳健性检验与行业 TFP(Figure B1–B6)
  • Appendix D: 投资、MRPK、挤出效应、贸易政策 (Figure D1–D4)
  • Appendix E: 发展关联机制 (Figure E1–E3)
  • Appendix F: 后向关联效应 (Figure F1–F2)
  • Appendix G: 投入产出暴露与 SUTVA 检验 (Figure G1–G3)

T.11.4 9.4 附录表格 (output/overleaf_tables_appendix/)

9 个 .tex 文件,对应附录表 A1–E4。

T.11.5 9.5 补充附录图形 (output/overleaf_figures_supplementalappendix/)

5 个 PDF 文件,对应补充附录 Figure A1–C2。

T.11.6 9.6 补充附录表格 (output/overleaf_tables_supplementalappendix/)

18 个 .tex 文件,对应补充附录 Table A1–F3,包含大量滚窗 (rolling window) 稳健性检验和机制分析表格。

T.11.7 9.7 解释性小结果文件

位于 code/2_tables/(正文表格同目录),生成在运行表格脚本时:

  • results_tfpcrosssection_maxtfp.tex / results_tfpcrosssection_mintfp.tex — TFP 横截面极值
  • results_semi_ship.tex / results_ols_ship.tex — 双重稳健性的半参数和 OLS 对比
  • results_log_rca.tex / results_export_share.tex / results_prob_rca.tex — 贸易模式结果
  • results_semi_prices.tex / results_ols_prices.tex / results_min_price.tex / results_max_price.tex — 价格效应
  • results_semi_labor.tex / results_ols_labor.tex / results_semi_labor_4digit.tex — 劳动力效应
  • results_ols_invest.tex / results_semi_invest.tex / results_semi_costs.tex / results_ols_costs.tex — 投资与成本效应
  • results_forwardoutput_nonhci.tex / results_forwardprices_all.tex / results_forwardoutput_all.tex / results_forwardprices_nonhci.tex — 前向关联分解

T.11.8 9.8 输出文件的论文对应关系

所有输出文件的命名和路径均与论文的 Overleaf 项目结构对应,可直接拖入 LaTeX 项目使用:

论文部分 输出路径 文件类型
正文 Figures 1–7 output/overleaf_figures/ PDF 图形 + TEX 脚注
正文 Tables 1–8 output/overleaf_tables/ TEX 表格
附录 Figures A1–G3 output/overleaf_figures_appendix/ PDF 图形 + TEX 脚注
附录 Tables A1–E4 output/overleaf_tables_appendix/ TEX 表格
补充附录 Figures A1–C2 output/overleaf_figures_supplementalappendix/ PDF 图形 + TEX 脚注
补充附录 Tables A1–F3 output/overleaf_tables_supplementalappendix/ TEX 表格

T.11.9 9.9 图表脚本与 Stata 分析的具体对应

以下汇总了从 Stata 分析到 R 图表输出的端到端路径:

Figure 2 (mainoutputplot.pdf) 的生成链

1_run_growth_analysis.do
  -> 产出: did_largerolling_mainresults_alloutput_all_results.csv
  -> 产出: did_largerolling_mainresults_alloutput_4d_all_results.csv
    -> Figure2.R 读取
      -> 输出: output/overleaf_figures/mainoutputplot.pdf

Figure 3 (devcombinedplot.pdf) 的生成链

2a_run_devoutcomes_analysis.do
  -> 产出: did_largerolling_allproductivity_all_results.csv
  -> 产出: did_largerolling_allproductivity_4d_all_results.csv
2b_run_koreatrade_analysis.do
  -> 产出: did_largerolling_koreatrade_ppml_rca_all_results.csv
    -> Figure3.R 读取
      -> 输出: output/overleaf_figures/devcombinedplot.pdf

Table 2-4 的生成链

3b_run_doublerobust_analysis.do
  -> 产出: doublyrobust_att.csv
  -> 产出: doublyrobust_trade_att.csv
  -> 产出: doublyrobust_invest_att.csv
    -> Table2-4.R 读取
      -> 输出: kable_att.tex, kable_trade_att.tex, kable_invest_att.tex

Figure 5 (capitalplot.pdf) 的生成链

4_run_policy_analysis.do
  -> 产出: did_largerolling_mainpolicycapital_results_papermain.csv
    -> Figure5.R 读取
      -> 输出: output/overleaf_figures/capitalplot.pdf

Figure 6–7 (前向关联) 的生成链

6a_run_linkages_growthprice_analysis.do
  -> 产出: did_io_main_all_results.csv
    -> Figure6.R 读取 -> forwardlinkageplot.pdf
6b_run_linkages_trade_analysis.do
  -> 产出: did_io_comtrade_all_results.csv
    -> Figure7.R 读取 -> forwardlinkagetrade.pdf

T.11.10 9.10 跨分析共用数据源的追踪

部分输入数据被多个分析脚本共用,了解这些交叉依赖有助于排查问题:

输入数据 使用者
mms_merged_harmonized_panel_cleaned4reg_4digit.dta 1_run_growth_analysis.do, 2a_run_devoutcomes_analysis.do, 3b_run_doublerobust_analysis.do, 4_run_policy_analysis.do, 5a_run_mechanisms_lbd_analysis.do, 6a_run_linkages_growthprice_analysis.do, APP_B_run_priceandyn_analysis.do, APP_B_run_industry_tfp_analysis.do
mms_merged_harmonized_panel_cleaned4reg_5digit.dta 与上类似,5-digit 版本的灵敏度检验
comtrade_worldsitc_panel_cleaned4reg_4digit.dta 3c_run_worldtrade_analysis.do, SUPP_APP_E_run_dd_comtrade_analysis.do
comtrade_merged_harmonized_panel_cleaned4reg_4digit.dta 2b_run_koreatrade_analysis.do, 6b_run_linkages_trade_analysis.do
policy_commercialbanking_yearbook_loans.csv FigureA2.R(附录图形),4_run_policy_analysis.do
tariffs.csv FigureD4.R(附录图形),4_run_policy_analysis.do, APP_D_run_policy_trade_analysis.do
acts_table_simple_combined_all.csv Table_A1.R(补充附录表格)
ngram_political_troop.csv FigureA1.R, Figure_A1.R(附录和补充附录中均使用)

T.11.11 9.11 辅助子 Do-File 的作用

code/0_analysis/subdofiles/ 中的 6 个文件在整个 Stata 分析流程中承担的是可重复执行的子程序角色。这些文件不自立运行 (不是 master 脚本),而是由上一层的分析脚本通过 doinclude 命令调用:

子文件 被调用于 功能
1b_main_subrollingloop.do 1_run_growth_analysis.do 对产出结果执行滚窗 (rolling window) 灵敏度分析——在不同年份窗口上重复估计主体 DiD 模型,生成大量点估计和置信区间
2b_devoutcomes_subrollingloop.do 2a_run_devoutcomes_analysis.do 对发展成果 (生产率、比较优势等) 执行滚窗分析
6b_linkages_subrollingloop.do 6b_run_linkages_trade_analysis.do 对贸易关联结果执行滚窗分析
6b_linkages_subrollingloop_wcontrols.do 6b_run_linkages_trade_analysis.do 带控制变量的贸易关联滚窗分析
8b_analysis_sutva_ksic_limitingexposure_largeloop.do APP_G_run_sutva_analysis.do SUTVA 稳健性检验的大循环——通过逐步增加行业暴露范围来测试处理效应是否因行业间溢出而变化
APPb_linkages_subrollingloop_simplified.do 附录关联分析脚本 简化版关联滚窗循环

这些子程序的存在使得主分析脚本保持简洁,同时滚窗分析逻辑可被多处复用。复现者通常不需要直接操作这些文件,除非需要调试滚窗分析的具体输出。


T.12 复现结论与剩余限制

T.12.1 10.1 总体评估

评估维度 等级 说明
代码完整性 [Y] 优 所有脚本可在相同环境下直接运行,无缺失代码文件
数据完整性 (公开部分) [Y] 优 所有可公开获取的数据均包含在包内
数据完整性 (全部) [N] 受限 MMS 微数据 (植物级) 和 UNIDO 数据不可公开分发
环境自动配置 [Y] 优 Stata 和 R 的依赖包均可通过 setup.do / setup.R 自动安装
可重复性 [Y] 优 双环境均设定了随机种子
文档质量 [Y] 优 README 详尽、WORKFLOW 清晰、MANIFEST 完整、数据集有码本
设计模式 [Y] 优 Stata 分析 -> 中间 CSV -> R 图表的两阶段管道设计解耦良好
错误处理 [Y] 优 master.R 和 master.do 均有多层错误捕获和日志记录

T.12.2 10.2 数据限制

  1. MMS 植物级微数据 (mms_TFP_micro.dta):来自韩国统计厅内部数据,不可公开。影响了 3 个 Stata 分析脚本的完整执行。但对应的分析产出已通过 data/included_datasets/ 中的 CSV 文件弥补。

  2. UNIDO INDSTAT2 数据 (unido_robustness_dataset.dta):原始通过哈佛图书馆购买,新版本可在更开放的 UNIDO 许可下获取。影响 SUPP_APP_C_run_unido_analysis.do。对应中间结果已预存在 data/included_datasets/

  3. Naver 新闻库数据article_info.csv 是通过 Naver API 获取的加工数据,原始原始数据 (tokenized n-grams) 未提供。

T.12.3 10.3 软件要求

  • [N] 必须同时安装 Stata 17+ 和 R 4.3+ —— 对仅有单一软件环境的用户不够友好
  • [Y] skip_stata: TRUE 选项允许仅用 R 生成图表 (前提是中间数据已存在)
  • [N] StataMP 许可证可以显著缩短运行时间,但非必须

T.12.4 10.4 运行时间

场景 预估时间
StataMP (完整, RUN_MICRO=1) 1–2 小时
StataBE (完整, RUN_MICRO=1) 2–8 小时
StataMP (无微数据, RUN_MICRO=0) 45 分钟 – 1.5 小时
R 图表生成 (Stata 跳过) 2–6 分钟

T.12.5 10.5 对复现者的建议

  1. 首次复现:使用 RStudio 打开 .Rproj 文件,直接 source("master.R")
  2. 如仅需图表:设置 skip_stata: TRUE 后运行 master.R,约 5 分钟内生成全部 .pdf 和 .tex 文件。
  3. 如需完整 Stata 复现:确保 16GB+ RAM 和 StataMP 许可证,预期 1–2 小时。
  4. 如遇到微数据错误:在 0_master_run_analysis.do 中将 RUN_MICRO 设为 0,或在 R 启动前通过 Stata 设置 global RUN_MICRO = 0
  5. 验证成功:检查 log/master.log 中无 Error 字样,对比 output/ 中的图表与发表版本。

T.12.6 10.6 剩余未尽事宜

  • 文中提到的 Naver News Library 原始 n-gram 数据未在包内提供 (仅提供了处理后的 article_info.csv),如需完全重建 Naver 数据管道需自行与 Naver API 交互。
  • UNIDO 数据的新版本可能已在使用不同修订级别的行业分类,复现 SUPP_APP_C 时需注意行业代码匹配。
  • gph2xl 包安装依赖于 CGD 的服务器可用性,如果该服务器不可达,需要手动从其他源安装。
  • 一些 Stata 脚本 (尤其是滚窗循环) 可能产生大量临时数据文件,包初始化为空的 data/intermediate_datasets/ 目录将在这类脚本运行后被填充。