1 引言
本文是作者参加计算机设计大赛大数据主题赛的参赛项目文档,删去由其他作者写作的部分1,并略作修改得到的. 本文的原标题是“一带一路对中国和其他沿线国家的影响及政策分析 ——数据科学的视角”.
…
2 主要工作
2.1 数据模型
我们的数据模型如图1所示.
此图在R语言中,用ggdag[1]生成. 这是有向无环图(Directed acyclic graph, DAG),其中边代表因果作用[2].
值得注意的是,在该模型中,我们假定一带一路不会以其他方式影响地区的经济发展水平(即不存在\(X\rightarrow Z\)的线),以避免出现替代指标悖论.
2.2 分析技术
本项目主要利用到以下三种分析技术. 首先注意到数据集中存在许多缺失数据,如图2[3]所示. 缺失数据的删除或填补需要用到一些技术. 分析一带一路的影响,就是要分析某一事件发生后,某一值的变化情况. 该值自身也存在着模型外因素导致的变化趋势,所以我们必须利用某些技术来去除这些因素的影响. 于是,我们运用如 下所述的双重差分和合成控制两种技术.
2.2.1 缺失数据填补
我们的数据集,正和许多类似的真实世界数据集一样,存在着许多缺失数据NA
. 缺失数据的处理方式不外乎删除或填补.
- 对于我们的investment数据集,其缺失普遍存在,故我们采用填补的方法.
- 对于本次大赛提供的世界健康数据集,其缺失更有规律,即对于任意一个国家,缺失一个时间点的数据意味着缺失此前所有数据. 恰当地选择时间范围,再删去个别几个缺失较大的国家2,就在可以避免填补的同时保留大部分数据. 因此,我们选择删去.
对于前者,我们调用R包mice[4],采用linear regression with bootstrap的方法进行缺失数据填补. 首先,对数据进行bootstrap重抽样[5],然后进行线性回归插值,最终计算得到合成的结果. 其中,多元线性回归采用Schafer的算法[6].
2.2.2 二重差分法
二重差分法(Difference-in-Differences, DID)是一种经典技术. 所谓二重差分,就是先把实验组与对照组作差,再对差作差分,考察其随时间的变化情况. 换句话说,此方法假定对于每个固定的\(t\),存在一个固定的内禀的\(\mu\). 具体来说,就是以下模型[7]
\[ P_{t}^{N}=\mu+\frac{1}{J} \sum_{j=2}^{J+1} Y_{j t}^{N} \]
并用如下公式来估计.
\[ \hat{P}_{t}^{N}=\frac{1}{T} \sum_{s=1}^{T}\left(Y_{1 s}^{N}-\frac{1}{J} \sum_{j=2}^{J+1} Y_{j s}^{N}\right)+\frac{1}{J} \sum_{j=2}^{J+1} Y_{j t}^{N} \]
2.2.3 合成控制法
合成控制法(Synthetic Control)是另一种经典技术. 不难发现,DID所要求的条件过高,在现实生活中一般并不成立. 举例来说,实验组可能有其自身特点,导致增长本来就比对照组快. 而所谓合成控制,就是用对照组的数据“合成”出来一个虚拟的实验组,然后应用到事件发生后的情况,得到实验组的反事实数据. 具体来说,就是以下模型[8]
\[ P_{t}^{N}=\sum_{j=2}^{J+1} w_{j} Y_{j t}^{N}, \text{where }w \geq 0,\ \sum_{j=2}^{J+1} w_{j}=1. \]
为了识别合成的权重\(w\),我们需要一些假设,在这里是结构冲击项\(u_{t}\)在同一时段内互不相关,即:
\[ E\left(u_{i} Y_{j t}^{N}\right)=0 \text{, for } 2 \leq j \leq J+1 . \]
于是就有估计 \[ \hat{P}_{t}^{N}=\sum_{j=2}^{J+1} \hat{w}_{j} Y_{j t}^{N}. \]
而\(w\)的估计
\[ \begin{aligned} \hat{w}=\ &\arg\min_{w} \sum_{i=1}^{T}\left(Y_{1 t}^{N}-\sum_{j=2}^{J+1} w_{j} Y_{j t}^{N}\right)^{2},\\ &\text{subject to }w\geq 0,\ \sum_{j=2}^{J+1} w_{j}=1. \end{aligned} \]
此后,我们利用Chernozhukov et al.[9]的方法分析P值和置信区间等信息.
2.3 程序技术
2.3.1 Non-standard evaluation, NSE
本项目使用了一种在R中非常重要的技术,即Non-standard evaluation.[10]
具体来说,让我们看一段代码:
### Using lazy evaluation to replicate a func along country list
<- function(fun) {
repli <- substitute(fun)
ex
for (i in seq_along(country_list)) {
# ...
eval(ex, envir = globalenv())
}
}
repli(placebo_specification_test())
R采用lazy evaluation,只有在真正用到fun
的时候才会对其进行求值,其中fun
的返回值并不必须良定. 这在这里是重要的特性,因为一般的语言具有引用透明(reference transparency)的特点,会将fun
的返回值作为repli
的输入,这会对我们的目标造成不便. 此处,substitute
将参数转变为promise
,而并不对其进行求值;在for
循环内部,调用eval
进行求值,以达到重复执行某个函数的目的.
3 具体细节
3.1 环境
3.1.1 R环境
本项目的R部分使用如下环境生成,base包和部分依赖已省略.
## R version 4.1.0 (2021-05-18)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 20.04.2 LTS
##
## Locale:
## LC_CTYPE=zh_CN.UTF-8 LC_NUMERIC=C
## LC_TIME=zh_CN.UTF-8 LC_COLLATE=zh_CN.UTF-8
## LC_MONETARY=zh_CN.UTF-8 LC_MESSAGES=zh_CN.UTF-8
## LC_PAPER=zh_CN.UTF-8 LC_NAME=C
## LC_ADDRESS=C LC_TELEPHONE=C
## LC_MEASUREMENT=zh_CN.UTF-8 LC_IDENTIFICATION=C
##
## Package version:
## dplyr_1.0.6 ggdag_0.2.3 lubridate_1.7.10 mice_3.13.0
## plotrix_3.8.1 purrr_0.3.4 readr_1.4.0 showtext_0.9-2
## stringr_1.4.0 tidyr_1.1.3 tidyverse_1.3.1 VIM_6.1.0
3.1.2 python环境
…
3.3 数据集说明
国际贸易数据(/data/investment/FDI_untidy.csv
)下载自CEIC数据库. 我们引用CEIC全球数据库中“实际利用的外国资本:按地区分类”和“对外直接投资:国别”两个数据集,逐条下载了中国在利用其他国家资本量(月度数据),和中国对其他国家的直接投资(月度数据). CEIC数据库覆盖的时间范围为1985年12月至2021年4月,每条数据均以月为统计单位,故为了数据的完整性,初步清洗时,以纵轴为月份(自1985年12月至2021年4月),横轴为统计指标(中国利用不同国家的资本,与对不同国家的直接投资),对数据进行了合成与排列.
其中,实际利用的外国资本分为直接投资和其他投资方式. 直接投资包括中外合资,合资开发和独资企业,外资参股公司以及共同开发;其他投资方式包括补偿贸易和加工组装. 数据来源为国家统计局和中华人民共和国商务部. 该数据可反映外国对中国的投资.
对外直接投资指中国国内投资者以现金、实物、无形资产等方式在国外及港澳台地区设立、购买国(境)外企业,并以控制该企业的经营管理权为核心的经济活动. 数据统计来源为中华人民共和国商务部. 该数据可反映中国对外投资.
其他用到的数据集来自世界健康数据集,包括:
under5MortalityRate.csv 数据集记录了1962-2019年不同国家5岁以下儿童死亡率(每千人的死亡人数). 我们认为,该指标反应了一国最基础的医疗水平状况. 相比预期寿命,该指标更好地将研究标的限制在了基础卫生条件,如洁净水源、疫苗接种、家庭卫生条件等. 而对于发展中国家,基础医疗状况和卫生水平的提高,才能最贴切地带来经济发展的动力. 故在预期寿命之外,我们还专门将“5岁以下儿童死亡率”作为研究指标.
infantMortalityRate.csv 数据集记录了1962-2019年不同国家出生婴儿死亡率(每千人的死亡人数). 我们认为,相比5岁以下儿童死亡率,该指标更准确地反映了一国在生育保障上的医疗和健康水平.
3.4 数据清洗
虽然不为人所重视,数据清洗往往是数据分析工作中耗时最久的部分.[12] 不仅如此,数据清洗的目标也往往不被人熟知. 什么数据结构才算是整理好?幸运的是,Hadley Wickham的文章[13]向我们提供了一种通俗易懂的解释:每行应该代表一个观察(observation),每列应该代表一个变量(variable). 根据此种原则,并利用其为此目的开发的R包tidyverse[14],进行数据清洗. 其部分步骤如下所示.
<- function(raw_df) {
process <- raw_df %>%
simplified_df filter(X1 %>% str_detect("^\\d")) %>%
rename(时间 = X1)
<- simplified_df %>%
fliped_df pivot_longer(c(-时间), names_to = "observation", values_to = "val")
<- function(str) {
stdize %>%
str str_replace(pattern = "(.*):(总计|一带一路)", replacement = "\\1/\\2/\\2") %>%
str_replace(pattern = "::", replacement = ":") %>%
str_replace(pattern = "(.*):(.*洲):*(.*)", replacement = "\\1/\\2/\\3")
}
<- fliped_df %>%
sep_df mutate(observation = observation %>% stdize()) %>%
separate(col = "observation", into = c("type", "地区", "国家"), sep = "/")
<- sep_df %>% spread(key = "type", value = "val")
df }
3.5 数据分析
数据建模和分析是传统上受重视的技术. 其主要内容已经详述,这里不再赘述. 对各个国家分别进行的分析结果存储于本项目results
文件夹下的results_IMR
(婴儿死亡率数据)和results_invest
(投资数据)文件夹中. 其中,sens.csv
描述了对测试进行安慰剂检验(placebo test)的情况,p.noeff.csv
描述了测试的P值,ci.csv
描述了结果的置信区间,pdf
文件绘制出了按国家分类的置信区间的情况.
3.6 数据可视化
…
4 总结
4.1 分析结果
%>% filter(`max(ci.sc)`<0) %>% group_by(国家) %>% nest() %>% .[["国家"]]
ci_csv ## [1] "哈萨克斯坦" "斯洛文尼亚" "拉脱维亚" "黑山"
%>% filter(`min(ci.sc)`>0) %>% group_by(国家) %>% nest() %>% .[["国家"]]
ci_csv ## [1] "新加坡" "格鲁吉亚" "白俄罗斯"
%>% .[["median(ci.sc)"]] %>% mean()
ci_csv ## [1] -0.03983766
可见,在一带一路的参与国家中,婴儿死亡率相比预期降低(\(P<0.10\))的国家共有4个. 婴儿死亡率相比预期升高(\(P<0.10\))的国家共有3个. 平均而言,一带一路能够额外降低婴儿死亡率的对数约0.04.
%>% filter(`max(ci.sc)`<0) %>% group_by(国家) %>% nest() %>% .[["国家"]]
cii_csv ## [1] "缅甸" "文莱" "巴林" "也门共和国" "叙利亚"
## [6] "阿塞拜疆" "斯洛文尼亚" "匈牙利"
%>% filter(`min(ci.sc)`>0) %>% group_by(国家) %>% nest() %>% .[["国家"]]
cii_csv ## [1] "印度尼西亚"
%>% .[["median(ci.sc)"]] %>% mean()
cii_csv ## [1] -0.4027635
与预期不符的是,在一带一路的参与国家中,中国对当地的投资相比预期降低(\(P<0.10\))的国家共有8个. 中国对当地的投资相比预期升高(\(P<0.10\))的国家共有1个. 平均而言,参与一带一路反而额外降低中国对当地的投资的对数约0.40.
根据常识,投资(\(Y\))对经济发展水平(\(Z\))的平均因果作用是正的,而经济发展水平(\(Z\))对健康水平(\(W\))的平均因果作用也是正的. 因此,根据我们的模型,在相同的经济发展水平下,参与一带一路能够相比预期增加沿线国家的国民健康水平,或者狭义来说,降低婴儿死亡率. 从这一方面来看,一带一路对沿线国家经济以外的影响,还有待更深的评估.
4.2 不足和展望
我们的报告最显著的不足之处是将不同国家的结论组合的方式显得过于随意,仅仅是计算每个国家的效应然后求平均,没有考虑到国家和国家的权重问题. 类似地,在计算投资额时,可以考虑除去国家的经济总量,以反映中国投资占比占该国家GDP的比例. 进一步地,一组国家总效应的置信区间并不必然是分别的效应的置信区间的函数. 然而,进一步研究这个问题需要更多的数学细节,并超过了本项目的范围.
参考文献
用…替代.↩︎
这些国家往往那时才成立,例如从母国中分裂出.↩︎
此图取自 R for Data Science,以CC BY-NC-ND 3.0 US 发布.↩︎