Categories
经济、IT观察与思考

归纳法对世界的改造

从简单的统计模型,到后面的计量经济学,到机器学习,到现在的人工智能,过去的二十年是归纳法大发展的二十年。为什么只看二十年呢,因为二十年前的园主不知世事,超出认知范围之外了。

经济学在大规模应用计量经济学之前,一直是和物理学神似的,也被叫做社会科学中的物理学。而计量经济学的发展与突破也不是纯属巧合,主要是大规模经济金融数据的爆发。

早期的计量经济学,无论是宏观还是微观,其实都还是有深深的“结构化”的影子,就是需要一个结构化的模型来解释为什么会这样,有一堆变量和与之相对的系数,然后再用数据来估计系数。现在回头看,这个时期的计量经济学还是停留在一个“辅助”的阶段,数据的价值只是帮助计算系数。

然后计量经济学就向着弱结构化的方向一去不复返。可以说这是理论的发展赶不上数据的爆发,也可以说是人们渐渐失去了对结构化的理论的执念。这大概等同于量子力学之于传统物理学的革命,人们开始接受这个结构的模糊化。可就算是在这个阶段,人们的执念还是“因果关系”,直到今日计量经济学还是把因果推断作为其存在的哲学本源,试图从归纳法的角度倒推演绎法需要的因果关系。

然后随着机器学习的大爆发,人们从开始的“预测”和“因果推断”是两回事,到逐渐的审问自己,为什么对因果有这么强烈的执念?退一步说,到底什么是因果关系?这个时候才发现,因果关系其实在哲学上的定义也不是那么得清晰。园主在这里就不挖太深了,否则填因果这个坑就要填好久。

这些年,随着大语言模型的爆发,人工智能好像又解锁了一个新的阶段。虽然一边说着大语言就是一个预测方向无意的突破,另一边园主却看到人工智能落地层面对于结构化关系的依赖性慢慢减弱。以前我们的解决办法是对一个问题不断地细分梳理,然后逐个攻破。而现在大模型的冲击就是,我们真的有必要这样分解问题本身吗?如果深度学习模型本身可以就自动学出来一个等同于以前结构化的东西,就算我们没有办法把它明确的表达出来,哪又如何呢?

到这里,深度学习无疑是冲击到一个哲学层面的问题。当数据远远超过了理论的发展的时候,是不是演绎法的价值就远远不及归纳了?我们是像以前那样路径依赖,一定要对问题做一个外科手术一样精准的分解,还是可以容忍结构慢慢演变成一个黑盒子,给它无尽的自适应的能力,然后只需要关注结果就可以了?

这一波深度学习对于人工智能的冲击,我觉得体现到最后, 其实可能是一个去结构化的冲击。我们选择放弃对于结构关系的清晰表述,然后拥抱强化的预测能力对于世界的适应和改造。

人们对于深度学习和大模型的恐惧在于我们无法解释、进而无法控制。一旦我们适应和接受,下一步就是挖掘其无尽的潜力,实现下一轮生产力的爆发。

无论如何,我还是看好科技发展与世界进步的,就算过程中会有无尽的波折。

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观察与思考

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

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

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

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

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

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

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

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

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

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

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

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

Categories
读书有感

重温概率论和线性代数

年底的节奏比较舒缓,就有更多的时间来重新拾起一些东西。先是百无聊赖的浪费了一些时间看剧打游戏看小说,基本就是一种不动脑子的打发时间的模式。后面觉得着实无聊了,开始想有什么可以看的。不知怎么的,就动了重温数学的念头。搜了一下网上的各种公开课,发现MIT的线性代数(Gilbert Strang)和Harvard的概率论基础(Joe Blitzstein)评价比较高,就打开youtube开始跟课。

线性代数我其实偷了个懒,没有去跟那个完整版的,而是简单地看了一下Strang教授今年发布的2020版。一共只有五部分,每一部分大概一刻钟,我看之前还在想这个是怎么做到的。看完了,就明白这75分钟的高屋建瓴之处了。大一的时候学线性代数,虽然分数不错,但是其实学了一堆计算却不知所云。后面学到高等计量开始频繁地用到线性代数,才多少有了一些事后的感悟。现在再去看线性代数,觉得这东西真的挺美的,一点一点地串联起多少问题。

话说到这里,多少有点“我吃了七个烧饼发现饱了,是不是直接去吃第七个就好了的”味道。我需要略带羞耻地承认,我大学以后的数学基本都是靠学经济学才学会的(学会指的是有一些理解而不仅仅是记忆公式和定理)。大一一上来的微积分,动不动各种极限和证明,直接懵掉了。概率论学了什么完全不记得了,印象中好像只有一本很薄的小册子,各种证明,然后考试一片茫然。线性代数也是,死记硬背了一堆证明却不知所云。

类似的,我对计量经济学也有差不多的体验。其实第一次学(初级)计量经济学的时候也是一脸懵,第二次学(中级计量)稍微好了一点,后面一遍又一遍地学计量(或者广义地说,线性模型),我才逐渐开始理解回归模型。回头看,这实在是一个成本巨大而痛苦的过程。可是代价如此之高是因为老师教得不好呢,还是因为这些东西本来就难?我现在已经没法回到原点去体会另外一条路径了。只是重温这些基础课程的时候,更容易跟着这些大家公认优秀的教师的思路,来站在更高的层面欣赏数学本身的美,而不仅仅是当作工具。

数学这种学科,学懂了和没学懂差别太大了。学懂了,再厚的教科书都觉得如若无物,要用的时候信手拈来(英文我习惯用internalize来描述这种状态)。没学懂的话,基本就是记住了一堆程序化的操作流程(procedure)却忘记了他们的来龙去脉。这种差别会深刻地影响日后的学习或研究。这两年面试了上百人,我所在意的其实不是一个面试者记住多少公式和模型(比如我允许他们随时google),而是他们是不是真正理解他们用到的模型本身。把统计模型学成了一堆procedure其实是一件非常危险的事情。

概率论这门课我是老老实实地跟完全程的。毕竟是一个学期的内容,34节课,每节课接近一个小时,加起来就有三十多个小时。我并没有快进或者跳跃(主要是在电视上放起来快进比较麻烦),所以陆陆续续花了四五天的时间才把全程跟完。如果是第一次学这门课,这种节奏几乎是不可能的,因为新的信息量其实可能很大。只是我对于这些内容多少熟悉,所以实践起来更像是复习直觉而不是学习知识。这也是让我可以有机会去由衷地感慨原来概率论可以如此简单明了。我开始以为我会经常走神,尤其是已经非常熟悉的内容。结果很多时候,我居然全神贯注地又听了一遍那些熟悉的定理和公式。Blitzstein确实把这门课讲得很深入浅出。印象最深的是他在推导正态分布的时候,明明是那么无趣的定积分和极坐标变换问题,居然可以讲得那么好玩。又一次验证了高斯发现正态分布时候那种“天赐”的感觉。数学的美往往就在这种时刻。凭什么,一切繁琐的符号最终化为这么简洁优雅的记号?

正好在2020年的最后一天和新年交界的时点,看完了这门30多个小时的课程。让我忍不住记录一下,这种别致的、超级满足的跨年方式。

Categories
事儿关经济

说说我所认识的“最小二乘君”(配图版)

由于近些年常常跟搞数据分析的人混迹在一起,所以很多时候说话方式有点偏向机器学习了...顺便心里暗暗的忧伤一下当年的心路历程(不知道我的基本轨迹的可以先去看看CV..)。这里聊作一二记录,讲讲我所认识的“最小二乘法”(下称最小二乘君)。那个,语言稍显浮夸,大家随便看看哈,别较真。

<锲子>

是写小说的时候大家都兴先来个“锲子”么。7年前,我还是一个年幼无知的大学新生儿。当时我们系开了两门传说中各挂50%的数学课:微积分和线性代数。同学们大都学的死去活来,我也学的死去活来,一度开始怀疑自己的智商...其实现在想想,我也不知道当年为什么学的那么痛苦,现在随手用个微积分貌似都很水到渠成的样子。嗯,可能是老师授课方式不够好吧。那年直到期末考试,我也不知道我学了一年的微积分有什么用处,除了背下来少数的几个证明推导和学会了一堆算微积分的“技巧”之外。

从前有棵树,叫高树,树上挂了很多人……挂了很多人的高树...

线性代数也是一样的。当年翻看某本计算机类入门书(可能是算法与数据结构),前言一开始就是一行金字,大意是“矩阵论是当代计算机基础×××”。然后翻翻后面的果然看不懂,于是默默的去图书馆把这本书还了,然后借了一本黄皮的泛着金光《矩阵论》回来。同样悲催的,啥也没看懂,然后默默的放弃了我在这个领域深修的打算,乖乖的回去上必修课了。(所以我当年学习高级计算机知识的一腔热情就被这么无情的浇灭了哇!果断考完当时的计算机等级考试——C语言和数据库就扔掉编程了...)

线性代数一直学到最后,我还是以为这东西就是来替代“高斯消元法”解联立方程式的...什么特征根啊,奇异值分解啊,格拉姆-施密特正交化啊,直到最后我也没明白是干嘛用的,除了会算几个数之外...没想到,那日一别,重逢已是花落花开好几轮之后...当真是良辰美景虚设!只是万万没有想到,他乡遇旧友,而这厮竟和日后的最小二乘君紧密相连,难分难舍。

138112_091242423086_2良辰美景虚设