Categories
读书有感

Cluster Robust Standard Error到底调整的是什么?

Cluster Robust Standard Error(中文译作“聚类调整标准误”,但我觉得这个翻译过于拗口,没有英文本身接地气,所以本文中就沿用英文了)一度让我觉得很神奇。从我在学习计量经济学的时候开始,这就是已经写入教科书的标准操作,默认大家都是要汇报的。然而有意思的是,统计学家们对其并不感冒,基本没见过哪个统计学家做的研究里面一定要搞一个Cluster Robust Standard Error的。这和另外一个著名的经济学发明的东西异曲同工——工具变量法。好像都是只有经济学家关心而统计学家颇为冷漠。

我一直觉得Cluster Robust Standard Error怪怪的,虽然我理解它的数学表达和对应的直觉——属于同一个Cluster里面的样本若是相关怎么办?那么假设它们的协方差为0就属于刻意低估了。但是残差项的协方差矩阵到底涵盖的是什么信息呢?我们知道残差项基本就是捕捉两种信息:一种是纯粹的白噪音,另外一种是被遗漏的变量。对于Cluster Robust Standard Error的一个常见的解释是,在同一个Cluster(比如同一学校里面的学生)更容易受到同样的因素影响,而不同Cluster之间的这些影响因素则不尽相同,所以Cluster Robust Standard Error调整的是这些没有被模型捕捉到的因素。这里就更有意思了。 如果我们担心的残差的来源是这些每个cluster可能包含的外界因素,那么直接去进行固定效应(fixed effect)调整难道不是更好吗?最简单的,我们直接对应每个cluster加一个虚拟变量就完了,这样每个样本就相当于减去了cluster的均值,不就排除了这种怀疑吗?那么是不是在如果已经控制了固定效应之后,我们就不需要再进行Cluster Robust Standard Error的调整了呢?有意思的是,虽然众说纷纭,但是领域内的标准操作还是去继续调整Cluster Robust Standard Error。这一点让我奇怪了很久。

还有一个其实有点自我矛盾的是,如果数据本身来源于一个随机对照试验,那么好像标准操作就是无需再调整Cluster Robust Standard Error。这是说,随机对照试验不仅仅可以保证实验组和对照组可比,还可以保证样本之间不相关?听起来好像并不是那么直接。最后一个让我困惑不解的是,Cluster Robust Standard Error表现好的时候是Cluster的数量趋近于无穷,但普遍的业界标准操作是选择最高的加总层次(aggregation level),比如一个区域有若干学校,数据涵盖若干区域,那么标准操作居然是按照区域聚类而不是学校聚类。这不是跟Cluster Robust Standard Error本身的性质相反吗?

在很长的一段时间里,我就这么半知半解地应对着它。反正有人要看的时候,跑一下也不麻烦,但是我自己是基本上不会主动去看的。相比于针对异方差的Eicker–Huber–White调整,我始终不愿意使用一个自己并不是很理解它背后到底在调整什么的方法。

最近和同事又遇到了这个问题,再也不能浑水摸鱼,于是想去看看这些年有没有人更好地解释了这个问题。不搜则已,一搜则有巨大的惊喜,因为不是别人、正是几位大家出手,把这个问题讲清楚了。这篇文章真的是给我一种“拨开云雾见天明”的清爽感。Abadie, A., Athey, S., Imbens, G. W., & Wooldridge, J. (2017). When should you adjust standard errors for clustering? (No. w24003). National Bureau of Economic Research. 虽然还是一篇工作论文,但是已经有接近900的引用了, 可见这个问题折磨了大家多少年。

这篇文章开门见山,直接指出了Cluster Robust Standard Error存在的意义:要么是样本设计(这里指的是研究设计中数据样本搜集的范围和方式)的问题,要么是实验设计的问题。这一下子就讲明白Cluster Robust Standard Error到底想解决的是什么本质问题了:说到底还是,样本是不是有足够的代表性?

先说第一种原因,样本设计。这里基本就是一个多层次抽样的情况。假设数据搜集过程是这样的:先从整体里面随机选择一些cluster(比如从一个国家里面抽取若干城市),然后再在每个cluster里面随机抽取个体样本。在这种情况下,我们无法从样本数据中本身得知数据搜集的办法,所以分析者为了保险起见,可以计算Cluster Robust Standard Error来避免抽样过程的影响。但其实更好的办法是,直接去了解样本数据是怎么来的。论文中给出了一个极其简洁的例子,两个cluster,然后数据产生过程只取决于cluster+白噪音。大致如下:

  1. 有m个cluster,然后每个cluster里面分别各有一半的样本的D变量为1,其他为0(D可以是实验或对照组的标签,或者性别,等等,反正是我们关心的自变量)。
    cluster = 1:100 # cluster的数量
    n = 1000*length(cluster) #总共的样本量
  2. 结果变量y在每个cluster里面受到D的不一样,比如在一半的cluster里面,D的影响是1,而另一半则是-1,这个系数标记为tau,那么 y_i = tau_cluster * D_i+noise。
    D = rbinom(n = n, size =1, prob = 0.5) #每个个体有50%的概率接受处理D=1
    tau = rep(sample(c(-1,1),length(cluster), replace = T), each = 1000) #每个cluster有着不同的处理效应幅度
    y = D * tau + white_noise
  3. 这时候,可以直接用 y ~D 去做回归估计,或者y ~ D+cluster来做固定效应模型。

通过这个数据产生过程的模拟,然后比较普通标准误和Cluster Robust Standard Error,我们可以知道,Cluster Robust Standard Error调整的其实是每个tau_cluster的变化。因为我们在回归模型里面,假设的是tau对于各个cluster是一样的,所以tau_cluster本身的变化就被归到误差项里面去了。这个时候,Cluster Robust Standard Error是有意义的,可以捕捉这一部分的方差。

但是在这个设定下,如果直接用了固定效应模型,Cluster Robust Standard Error的调整就没有意义了,因为我们已经通过引入cluster这个变量捕捉到了tau_cluster的变化(对于每个cluster来讲,tau_cluster是常数,所以固定效应模型可以直接捕捉),那么残差项里面仅存的是白噪音,不需要额外的调整。

其实到这里,我们大概已经理解Cluster Robust Standard Error的来源了,就是数据生成过程中,异质效应(heterogenous treatment effects)是不是存在、我们的模型是不是已经将其纳入考量。如果异质效应仅仅取决于某些变量(比如上例中的cluster,给定cluster之后效应为常数),那么固定效应模型是最直接的调整方式。如果异质效应取决的因素足以被回归模型捕捉到,那么Cluster Robust Standard Error还是有意义的。但话说回来,如果是因为变量本身不可观测而导致模型不能捕捉异质效应,那么Cluster Robust Standard Error的cluster怎么选?直接保守起见把能观测的上一级cluster直接认为协方差矩阵每一项都存在?

文章中提到的第二种情况,实验设计可能导致需要Cluster Robust Standard Error,其实就是异质效应的另一种来源:异质效应存在于个体上,所以我们无法直接建模控制。

总之,这篇论文至少把这个调整的来源讲清楚了。结论简单说来,就是没事不要去调整Cluster Robust Standard Error,除非你知道在数据收集过程中有显著的缺陷会导致异质效应。此外,如果回归建模的时候能直接把这些变量控制住,就不要把它们用于Cluster Robust Standard Error里面。尤其是在cluster数量比较少的时候——你想啊,Cluster Robust Standard Error基本就是假设协方差矩阵对角线上是一个个的方块,方块里面每个数字不为0,但是方块之外都是0。如果cluster很少,那么这个调整就基本上容纳了很多很多方块内部非对角线的数字,显然是过于保守了。

Categories
经济、IT观察与思考

苏格拉底式提问

最近几个月开始实践一种新的合作方式:向我的合作者们不断问问题,而不是直接给出自己的想法。

这么做是遵循苏格拉底式教学法的一个假设:人们心中很多问题已经有答案了,而只需要一个合适的契机把答案引出来。

效果目前看起来还不错。有时候这也是对我自己更高的挑战:问问题的时候强迫自己把事情想清楚,回到本质而不是拘泥于技术和细节上的完美。

其实更多的时候我也不知道答案是什么,但是至少可以做到把自己知道的想明白,然后把还没想明白的问出来。有的时候这样的问题反而会启发更聪明的人帮我找寻下一步的答案。

感觉学无止境也挺奇妙的。花了这么多年想明白的是我应该问更多问题,而不是基于找寻答案。不时收到大家的反馈说我问题问得好,也是一种受宠若惊的感觉。

Categories
经济、IT观察与思考

古典的因果到允许不确定性的因果关系

虽然知道自己写不好这个题目,但是还是想多少记录一下最近的一些思考。放在这里贻笑大方也无所谓,反正是自家的园子,来者只能客随主便。

这么多年其实做的东西一直没能跳出因果推断的这个小圈子。虽然知道自己的短板在哪里,也知道再不好好去突破那么天花板就挡在那里了。可能开始只是一个非常实用主义者的角度,不是特别关心哲学层面的限制。到后面做的越多,知道的越多,对这个领域的敬畏也就越深。到现在,虽然每天因为工作的原因,还是会跟不熟悉这个领域的人一遍遍灌输因果推断的基本想法和重要性,但是自己其实知道我可以脱口而出的那些套路背后有多少隐藏的假设。稍稍去深思一下那些假设,有的时候也知道很多东西其实并不是站得那么牢靠。

我其实在过去的很长一段时间都怀着对统计意义上因果推断最底层的怀疑:这真的是科学一直在追求的因果关系吗?从开始学习计量经济学的时候,这一层挥之不去的“不相信”就一直顽固地存在着。当然,一开始的时候是因为知道的太少,只是本能地去抗拒一个不能融入我直觉的思维方式。一晃过了十几年,我终于有勇气再去翻看当年写下的无知者无畏的文字,还是挺有意思的。当年没有得到太多的现实应用的锤炼,居然可以在一定抽象的层面来思考这个问题,还是一番挺有意思的大脑锻炼。现在经手了这么多现实的案例,回过头去再看,当年的感悟虽然有灵性,却没有根基。

前段时间给统计之都写了一篇概述因果推断业界应用的科普文,题目起的很大,写起来也让我诚惶诚恐。其实也有跟编辑们讨论过题目是不是太猖狂了,后面大家觉得还好,就这么留下了。不知道有多少人注意到,其实我在里面非常小心地写了一个“限定句”,“这里的 ‘因果’限定为统计意义上的因果效应”。这一句一定要在一开始就写,因为我只能在做出这个限定之后,才能流畅地在一个给定的框架之内写下去。读者们不一定能感觉到作者心里的微妙情绪,但我没法自己欺骗自己。最后一段,我试图跳出这个限定,提到了“个体处理效应”,然后心里仿佛又有一口大钟撞来撞去,不敢再胡扯下去,旋即收笔。一篇不过几千字的文章让我如此胆战心惊,可见背后的思考是让我如何地坐立不安。

那么到底是什么让我如此的忐忑呢?其实就是“因果”这两个字的定义。说到因果,最符合我直觉的就是古典物理或者化学意义上的因与果,比如牛顿力学,比如氢气在氧气中燃烧变成水。这些都是可以用优雅的数学公式直接而具体地刻画的,好似真理一般,让人没法质疑。更让人笃定的则是,这些都是可以被实验验证的。虽然后面知道,古典力学只是在一个局限的环境中才会被遵循的物理定律,化学元素之间的反应也是限定在某些条件之中的,但这仿佛并不影响我对于这种非常机械式的因果的信仰。但问题在哪里呢?数学公式的局限在于,它需要一套假设和公理体系。当这些假设不成立的时候,这个看似精密环环相扣的因果体系就会土崩瓦解。数学家不会去验证假设能不能成立,他们可以得到一个理想条件下的真理,而应用者却不得不面对假设可能不成立的境况。然而我有限的物理或者化学训练并不足以告诉我,当这些假设不成立的时候,我们又如何去构造和验证一套新的理论体系呢?

从确定性到不确定性,其实是我在本科四年学习里面获益最深的一个思考范围的突破。概率论其实是一个非常强的对于思维方式的影响。这种思维方式的影响不在于记住了多少参数分布,而是在于它潜移默化地引入了一个新的假设:因果关系可以不再是一对一的、确定的,而可以是不确定的。这个时候,我们便可以借用概率分布来描述这种不确定性。这一点我其实在很长的一段时间都没有领悟到,虽然我可以熟练地推导各种利用概率来描述的公式。我其实特别喜欢问自己和问别人一个问题,什么是方差?很多人脱口而出,离中心点的距离(平方和)。然而细细想下去,比如我不断地去抛一枚均匀的硬币,每次的结果要么是正要么是负,那中心点的那个永远无法实现的1/2到底是什么?方差又是在描述什么?(想到这里,觉得哈利波特里面那个“九又四分之三站台”更加神奇了。)(另,后面看到一些脑科学的研究,说不确定性其实是对于人们认知的一个极大挑战,因为我们的神经系统从物理层面其实是不那么兼容不确定性的。人类做决策的时候其实是很难吸收不确定性的。)

从确定性到不确定性,其实也是很大程度上改变了我对于因果关系的理解。在确定性的框架之内,因果关系是不需要统计的(因为没有不确定性,我们不需要借助概率的语言来描述这件事情)。当我们放松了确定性这个假设,引入概率之后,因果便不得不被重新定义。我不知道自己花了多久想明白这一点,可能至少五六年的功夫吧(所以我硕士毕业的时候脑子里面对这一点还是一头雾水,虽然我已经天天在积极地讨论计量经济学上的“识别”(identification)这个问题了),而且每次都是一点点局部的进展,经过了很久的磨砺才愈见清晰。很长的一段时间,我是完全把这两种对于因果的定义隔绝在两个平行世界的,绝对不允许两者同时出现在我的思维框架之内。

好了,我现在仿佛终于打通任督二脉,就可以闭关修炼然后期待境界突破了吗?其实并没有。我这几年读了很多相关书籍,统计学的可能多一点,毕竟先要确保自己理解数学工具是怎么来严格地描述这个问题的。应用方面的也不少,主要是想挑战自己把现实和理论连接起来的能力,也便于理解那些抽象出来的框架和假设。然而最让我痛苦的瓶颈则是哲学层面的思考。我试图去读科学哲学,一遍遍,却仿佛还没有找到那个灵感突发的契机(eureka moment)。我试图跟别人聊,去倾听大家的理解,然而这仿佛是一个迷雾森林,大家都在一个特定的范围之内默默地停下了。有人或许试图找到在迷雾中前进的线索,却也是半途折返。我是一个很好的观察者和倾听者,却不是一个合格的冒险家,我根本不知道从哪里开始探寻。

最形象的联想就是在《荒野之息》里面走迷雾森林

有人说,经济学是社会科学之中的物理学。我觉得从面临因果推断这个迷雾森林的角度,经济学和物理学或许面对的是一致的挑战。物理学有些许进展,而经济学在蓬勃发展了半个世纪之后,却陷入了更大的迷茫(我觉得19年诺奖经济学其实某种程度上映射了大家对于这个问题的无能为力)。当应用学科止步不前的时候,大家在等待的或许是哲学和理论上的突破了。当然,我觉得其实我自己都没有窥得现在境况的全貌,只是隐约觉得,我离那个看不见的玻璃墙越来越近了。

(这篇真是的随便写写,大家尽情吐槽,也欢迎砸更多的信息和思考。)

Categories
经济、IT观察与思考

抽象思考的能力

最近开始意识到,工作中有意无意的,我开始越来越倾向于抽象的思考。可能是工作内容变得越来越庞然且繁杂,所以花很多时间在观察不同层面的变化和梳理脉络。解决一个角落上的具体问题很容易,但是真正去理解这些具体问题是如何镶嵌在整体画面上的,其实还是很花时间与精力的事情。

抽象思考其实是说,如何用一个更统一的框架来帮忙理解一系列具体的问题。若是可行,那么解决问题的时候,就不用逐一击破,而是可以一招制胜。但这样做的代价就是,要花很多时间来观察很多问题,然后思考他们的相通之处。有些时候,这样做并不是符合我们的直觉的。

我的个性其实是一个很容易专注的人。对我来说,专注于一件事情、然后把它解决掉其实是很容易实现的。有趣的是,在两年前去进行飞行执照训练的时候,学到了一个词:situational awareness,大意是对周边环境的感知能力。一开始的时候,这对我来说非常难,因为在机舱内就有很多东西需要手脚并用地去操作了,怎么可能再去兼顾周围?对于飞行训练来说,养成感知周边的习惯靠的是把日常的操作变成肌肉记忆,这样大脑就可以空余出来处理额外的信息。跟开车很相似,一开始司机专注于如何控制车速和方向,而久而久之,大家就习惯成自然,开始更多地把精力花在观察路况等等了。

可能多少受益于这样的训练,我开始自然而然地在工作中也有意地去增加自己对于整体局势的感知。尤其是当我开始进入一个相对陌生的领域的时候,以前会很积极地先找到自己可以攻克的问题,边做边学。现在则是宁愿花前期的时间来观察思考,谋定而后动。不知道最后会不会殊途同归,但至少对我来说,这样的模式更有利于我自己建立更坚定的信念。

意识到抽象思考的甜头之后,我也试图找寻一些可以帮助抽象思考的训练,比如去读一些哲学文章,比如复习以前学过的数学。经济学模型其实本身也是一个很好的抽象能力的体现。如何从生动的现实之中找到潜在的规律,然后把这些东西用数学模型描述出来,经济学建模的过程其实挺锻炼抽象思维的。

希望以后我自己可以越来越习惯在越来越抽象的层次思考,这样有利于把问题定义地更清楚,也有利于意识到解决方案的局限性。

Categories
读书有感

高阶的曼妙

最近业余看了一点抽象代数,本以为会根本看不下去,结果没想到抽象代数居然如此好玩。看过了抽象代数,再去看很多东西,仿佛就是降维打击,轻巧曼妙。

环(ring),域(field),群(group),三个相辅相成的抽象概念,笼络了常见的各种代数运算(加减乘除和矩阵运算)和代数定义域(整数,有理数,实数,复数),居然就这么轻轻巧巧地被串起来了。最有意思的是,这一系列对于代数结构的理解,使得“一元高阶多项式有没有一般解”这个问题得到了彻底的解决,让人拍案叫绝。

有意思的是,我最近发觉自己对于英文的理解能力比中文略强,尤其是在数学这块儿,所以我就先去看的英文课程(也有可能是教学风格不同,西方的老师有一种绞尽脑汁深入浅出地倾向)。写这篇日志的时候,翻了翻中文资料,发现豆瓣的一篇帖子讲得非常好,但是豆瓣不显示公式,于是有人很贴心地提供了latex排版并放在GitHub上。我看的英文课程是从环,域,群这三个概念开始讲的,到最后才提供了“五次及以上多项式没有根式解”作为一个实例,让人看得特别有满足感。

抄一下最核心的证明思路:

这样伽罗华(Galois)证明了:一元n次多项式方程能用根式求解的一个充分必要条件是该方程的伽罗华群为可解群。

由于高于四次的一般方程的伽罗华群不是可解群,也就直接推论出高于四次的一般方程的不可解性。

也即伽罗华发现本质就是:域的无数种扩张方式其实就是有限阶的群。n阶对称群对应着n次一元方程,而5阶和5阶以上的对称群不是可解群,也就是五次和五次以上的代数方程没有求根公式。

如果回顾历史,会发现在Galois之前的数学大家,如拉格朗日,解决问题的思路都是降维:试图把高阶方程变化为更低阶的问题。如果每个n阶都可以简化为n-1阶的问题,那么所有n阶方程的解不久解决了吗?结果拉格朗日就被卡在这样的归纳法思路了。

Galois另辟蹊径的地方在于他没有沿用这种简单的归纳法的思路,而是回到了代数的本质。这么想,

  • 人们为了得到一次方程的一般解,需要拓展整数数域,引入有理数。即 的通用解 并不是在整数域之内,而是要引入有理数。
  • 人们为了解决二次方程,又不得不拓展有理数,引入了根式,从而引入了无理数和复数。二次方程的通用解里面必须包括根式,而当 的时候,就不得不引入复数了。
  • 三次方程简化后的辅助方程为二次,四次方程的辅助方程为三次,所以暂时不需要引入新的数域。
  • 五次及以上方程就没这么幸运了, 由于其对应的伽罗华群不是可解群,所以在复数范围内是没有一般解的。

这里有一个很有意思的问题,为什么到五次方程,事情就产生了质变呢?Galois给出了事情的本质:五次及以上的多项式方程不存在在根式定义下的可解群。

可解群本身的定义依赖于正规子群、极大正规子群列及确定极大正规子群列的一系列合成因子。Galois定义了,如果一个群所生成的全部合成因子都是素数,则称这个群为可解的。所以,如果不拓展根式数域,五次及以上方程就没办法变成可解群了。换言之,不是五次及以上方程无一般解,而是加减乘除和根式运算限制了我们对一般解的表达能力。

这里可以看出为什么抽象代数为称之为抽象代数了,因为到这里,对于代数的理解就不仅仅是满足计算目的了, 而是去理解代数本身的结构。素数作为整数域里面的基本元素,不仅仅影响着因式分解,还可以拓展到整个代数结构里面去。某种意义上,我们需要在抽象代数里面重新定义“素数”或者基本元素,然后便有了各种优美的结论。

我在可见的未来之内,估计是不会亲自用到抽象代数了。只是这种思维的曼妙和在(更)抽象层面上洞悉事物本质的爽快感,让人着实欲罢不能。


最后补一句最近的人生感慨。很多时候,我们觉得一个(局部)问题很棘手无法解决,很可能是我们手上的工具限制了我们解决问题的能力。这个时候需要做的不是死磕,而是重新定义问题,从一个更高的层面来看待这个问题,或许就会看到自己曾经的局限性。定义问题永远比解决问题更重要。