附录 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.md 与 WORKFLOW.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.do、5b_run_mechanisms_lbd_micro_analysis.do、APP_D_run_lbd_micro_analysis.do、SUPP_APP_B_run_micro_tfp_dynamic_analysis.do、SUPP_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.R、Table7.R、Table8.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.RT.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.doT.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.doT.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 in或stop()的错误信息
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.log。split = 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.yml 中 dirs 节点下的每一个键值对 (如 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)
)
...
}该函数具有三重安全保护:
skip参数:尊重config.yml中的skip_stata设置- 路径验证:
normalizePath(..., mustWork = TRUE)— 调用前确保.do文件存在 - 错误捕获:
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 图表脚本模式:
- 读取中间数据:
data_path <- file.path(intermediate_dir, "did_largerolling_mainresults_alloutput_all_results.csv")
df <- read.csv(data_path)数据处理与 ggplot 构建:在
df上进行筛选、聚合、美化保存为 PDF:
save_plot(plot_object, "mainoutputplot",
width = 8, height = 6,
dpi = 600,
output_dir = figures_dir)- 保存图注 (可选):
save_figure_footnote("Notes: ...", figures_dir, "mainoutputplot_note")所有 R 图表脚本均输出到配置文件中定义的全局目录变量 (figures_dir、tables_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 脚本),而是由上一层的分析脚本通过 do 或 include 命令调用:
| 子文件 | 被调用于 | 功能 |
|---|---|---|
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 数据限制
MMS 植物级微数据 (
mms_TFP_micro.dta):来自韩国统计厅内部数据,不可公开。影响了 3 个 Stata 分析脚本的完整执行。但对应的分析产出已通过data/included_datasets/中的 CSV 文件弥补。UNIDO INDSTAT2 数据 (
unido_robustness_dataset.dta):原始通过哈佛图书馆购买,新版本可在更开放的 UNIDO 许可下获取。影响SUPP_APP_C_run_unido_analysis.do。对应中间结果已预存在data/included_datasets/。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 对复现者的建议
- 首次复现:使用 RStudio 打开
.Rproj文件,直接source("master.R")。 - 如仅需图表:设置
skip_stata: TRUE后运行master.R,约 5 分钟内生成全部 .pdf 和 .tex 文件。 - 如需完整 Stata 复现:确保 16GB+ RAM 和 StataMP 许可证,预期 1–2 小时。
- 如遇到微数据错误:在
0_master_run_analysis.do中将RUN_MICRO设为 0,或在 R 启动前通过 Stata 设置global RUN_MICRO = 0。 - 验证成功:检查
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/目录将在这类脚本运行后被填充。