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很少,那么这个调整就基本上容纳了很多很多方块内部非对角线的数字,显然是过于保守了。