根据本书迄今为止的内容,我们已经涵盖了数据生成过程\(DGPs\)和因果关系的概念。我们讨论了如何隔离我们关注的路径,以及如何通过阻断不想要的后门路径,或者直接隔离想要的路径,来识别我们想要的路径。但这些都只是概念层面的内容。我们实际上该如何操作这些事情呢?
本书的前半部分介绍了概念和直觉,而后半部分将介绍执行方法。我们将深入探讨研究人员常用的方法工具箱。
其中许多方法,尤其是 “回归”,“匹配” 和 “模拟” 章节之后的那些方法,都是围绕简化因果图这一思路展开的。也就是说,在现实世界中,因果图变得极其复杂和精密,要测量并调整所有我们需要的变量会非常困难,就像我在第\(11\)章中谈到的那样。
但存在某些我们可称之为模板因果图的类型,这类因果图能轻易解决1。我们可以问问自己,我们关注的情境和研究问题是否符合这些模板中的某一种。如果符合,相关方法会为我们提供一条识别因果关系的捷径,相较于试图让读者相信你真的想到并阻断了每一条后门路径,这种方式可能更能让阅读你研究成果的人信服2。
那么该如何使用这些方法呢?一如既往,首先我们要对数据生成过程进行建模,并绘制因果图!这些方法无法替代对数据生成过程的理解,实际上,选择哪种方法也取决于对它的理解。其次,我们要问问自己,我们的因果图是否符合使用其中某种方法所需的条件?例如,正如你将在第\(19\)章读到的,要使用工具变量法,必须存在一个 “工具” 变量,它会对我们的处理变量产生影响,且从该工具变量到结果变量的所有路径都必须通过处理变量。如果符合条件,我们就可以使用这种方法。我们的研究设计问题便得到了解决。从这时起,我们就可以开始关注统计问题,而非设计问题了。
第\(16\)章到第\(21\)章的工具箱章节聚焦于 “模板化” 研究设计,在这类设计中,同种因果图以及相应的设计可应用于众多不同场景。这些章节结构相同,包含三个子章节。
原理是什么?:从概念层面概述该方法如何识别因果效应,探究每种方法适用的因果图类型,并演示该方法如何处理数据以得到你所需的结果。
如何实施?:本小节会更深入细节,说明该方法的执行过程,通常会运用回归分析(我们将在第\(13\)章详细探讨)。
专业人士怎么做?:若你想在实际研究项目中真正运用某一方法,基础版本往往不够。本小节会探讨研究人员在实际应用这些方法时,常考虑的额外因素、调整方式或采用的其他方法。这些章节无法涵盖研究人员实际操作的所有内容。因此,设置这些内容的目的,并非向你展示研究人员所知的一切,而是让你了解实际研究人员在思考哪些问题,以及为何思考这些问题。
由于本书相较于正统计量经济学,更侧重于研究设计,所以涉及的统计证明很少。如果你对这些感兴趣,我推荐杰弗里・伍德里奇\((Jeffrey \space Wooldridge, 2016年)\)3的优秀教材。或者,要是你想钻研真正高深的内容,可看威廉・格林\((Willian \space Greene, 2003年)\)4的著作。
还有一个无可否认的事实:“专业人士怎么做” 部分不会告诉你像专业人士那样实际操作所需的全部信息。这是因为专业人士实际的做法是,研读关于这些方法最新研究路径的大量且不断更新的文献,或者至少会阅读许多使用同类通用方法的其他研究,然后在很大程度上效仿它们的做法5。试图以教材形式跟上(研究前沿)是徒劳的,而且每种方法可能都得写一整本书才行。
相反,“专业人士怎么做” 部分着重突出一些最重要的注意事项和拓展内容,为你提供自主去了解相关前沿知识所需的指引。如果你希望获取这些方法更多最新的应用案例,或者了解它们的历史信息,我推荐斯科特・坎宁安\((Scott \space Cunnningham, 2021年)\)所著的\((Causal \space Inference: The \space Mixtape)\)6。
工具箱的所有章节都将包含\(R\)、\(Stata\)和\(Python\)语言的代码示例,向你展示如何通过代码执行这些方法。
这些代码块可能依赖于你需要安装的包。在\(R\)中,任何地方出现\(library(X)\)或\(X::\),或者在\(Python\)中出现\(import \space X\)或\(from \space X \space import\),都意味着如果尚未安装包\(X\),就需要先安装它。在\(R\)中,你可以使用\(install.packages(X)\)来安装;在\(Python\)中,可以使用\(pip\)或\(conda\)等包管理器。在\(Stata\)中,包不需要每次使用时都加载,因此如果有需要安装的包,我会在代码示例中明确说明。在这三种语言中,每个包只需安装一次,之后就可以随时加载使用。
要运行这些代码示例,你可能需要额外安装一个包 ——\(causaldata\),这是我为本书(以及其他几本书本书)制作的数据集包,在这三种语言中都可使用。在\(R\)中安装:\(install.packages(causaldata)\) ;在\(Stata\)中安装:\(ssc \space install \space causaldata\);在\(Python\)中(若使用\(pip\))安装:\(pip \space install \space causaldata\)。
所有数据集都附有说明文档。以\(mortgages\)数据为例:在\(R\)中,使用\(help(mortgages, package='causaldata')\)可查看描述(如果已用\(library(causaldata)\)加载了该包,直接用\(help(mortgages)\)即可)。加载数据后,使用\(libraay(vtable)\),再运行\(vtable(mortgages)\),还能查看每个变量的描述。在\(Stata\)中,变量标签可在 “变量浏览器” 中正常查看,使用\(causaldata \space mortgages\)命令可获取数据集的描述。在\(Python\)中,用\(from \space causaldata \space import \space mortgages\)加载数据后,分别使用\(print(mortgages.DESCRLONG)\)和\(print(mortgages.NOTE)\)可查看数据及变量描述。
这些代码示例是在\(R \space 4.4\)、\(Statat \space 17\)和\(Python \space 3.11\)环境下运行的。如果你的语言版本达到或高于上述水平,应该可以顺利运行!要是版本低于这些,你可能得升级,不过虽然我没在所有旧版本上测试这些代码示例,但只要你的\(R\)是\(3+\)版本、\(Stata\)是\(14+\)版本,即便有些功能可能失效,大概率整体还是能正常运行的。对于\(Python\),强烈建议至少使用\(3.0+\)版本,因为从\(Python2\)到\(Python3\)有很多重大语法变化。对于这三种语言,由于本书出版后可下载的软件包可能会更新,你运行代码后得到的结果或许会有差异7。如果你发现了这样的变化,欢迎联系我。
关于代码的最后一点说明,专门针对\(Stata\):\(Stata\)本质上不允许将一个命令拆分成两行。但有些代码行太长,无法在书中的一行内放下,因此必须拆分!这可以通过在一行末尾使用///
来实现,它的意思是
“这一行还没结束,继续看下一行”。不过,出于某种原因,\(Stata\)规定这一功能仅在你使用\(do\)文件编辑器中的 “执行”
按钮运行代码时有效。如果你只是将代码复制粘贴到\(Stata\)控制台,它是不起作用的。所以,如果你看到一行末尾有///
,要么确保通过\(do\)文件编辑器的 “执行”
功能运行该代码,要么直接删掉///
,并将该行与下一行代码合并(一直合并到遇到一行末尾没有///
的行为止)。
我将这种模板因果图的概念归功于研究人员杰森・阿巴拉克(Jason Abaluck),他成功用这个概念惹恼了因果图纯粹主义者(调侃其对传统因果图思路的突破 )。↩︎
取决于你与谁交流,这些方法可能被称作 “简化式”,或者 “准实验性(方法)” 。↩︎
Wooldridge, Jeffrey M. 2016. Introductory Econometrics: A Modern Approach. Nelson Education.↩︎
Greene, William H. 2003. Econometric Analysis. Pearson Education India.↩︎
当然,有些专业人士一辈子都没超出过他们在教科书里学到的东西。这取决于他们所做的工作,有时这也没什么问题。有些研究问题用那些早已成熟、足以写入教科书的工具就能轻松解答。但在其他时候嘛…… 专业人士做的不少研究其实本可以做得更好。↩︎
Cunningham, Scott. 2021. Causal Inference: The Mixtape. Yale University Press.↩︎
比如,modelsummary
这个 R
语言包在本书出版前刚更新过,更改了它显示的显著性星号级别 ——
我得修改所有示例代码,这样才能让它继续生成我已经写进书中的结果!而且在第一版和第二版之间,有好几个包的变化导致我的代码无法运行了。谁也说不准第二版出版后,又会有哪些包更新
。(说明:“modelsummary” 是 R 包名,保留原名;“significance star levels”
译为 “显著性星号级别”
,准确传达统计学术语含义;整体直译,呈现包更新对代码和书籍内容的影响
)↩︎