“迷幻疯克”乐队
唱出这些不朽歌词的时候,很明显针对的就是社会科学研究者:他们错失了对某个现象的最重要解释而毫无察觉,仅仅是因为它没有被测量。(很可惜,他们在正式录音版中剪掉了我最喜欢的一小节。他们在那一节里还指出了,别忘记数据中那些没有足够变异的东西。)
在我们的方法中,你要解释某一个量的变异, 只能使用 另一种量的变异;这就好比说,你要敲开一块岩石,就必须用另一块岩石。因此,不管你的理论是什么,你的解释一定得是在数据里存在变异的某种东西。如果某个变量在数据中的取值范围是有删节的(比如说你只调查了某一个年龄段的人),它就不太可能有很强的解释力。更糟糕的是,数据变异集中在哪个 层面 (level),你会很自然地强调某种解释而不是另一些解释。基于个体层面的数据,你最终提出的很可能就是个体层面的解释,除非你事先就知道自己在寻找非个体层面的解释,然后把它转换到个体层面的数据中。你的数据是有关罪犯的,你的解释很可能就是罪犯的个体特征;你的数据是有关受害者的,你的解释很可能就是受害者的个体特征;你的数据是有关不同国家的,你的解释很可能就是国家层面的不同特征。
你有可能会想出其他假设来,甚至可以去检验那些假设。但是,你的数据类型和数据中变异的分布都会潜在地影响你提出特定的解释。更一般而言,如果某个东西根本 不存在 变异,它就不会作为原因而显现,即便它确实就是原因。因此,你首先要明白,你手头的数据是何种类型?
如果你仔细琢磨,就会知道对于数据(尤其是你的因变量)有三件事必须要知道:顶部在哪儿,底部在哪儿,大多数在哪儿。多数变量的取值范围都是有上下限的,或者是因为实际如此,或者是因为测量手段所限。在顶部那里,你不可能再上升,只能下降;在底部那里,你不可能再下降,只能上升。这就引发了所谓的“上限效应”(ceiling effect)和“下限效应”(floor effects)。这意味着,我们都不用看实际数据,就可以预测很多模式。
例如,我们可以预料,最上层的1%的家庭中的孩子与其父母相比收入会
下降
,最下层的1%的家庭中的孩子与其父母相比收入会
上升
。但是,这能说明收入在走向逐步均等化,或者认为马太效应不存在吗?当然不能,它只能用来说明一个普遍适用的统计学道理:事物存在着向均值回归的趋势,但这并
不
意味着代际之间存在着负相关关系。
更加微妙的是,如果真实世界当中的关系并不对称,在靠近底部时得到的结论与靠近顶部时得到的结论就很可能并不一致。在一个关于儿童交友的调查中,我们询问他们朋友的情况,但最多只允许他们说三个朋友。结果,大多数儿童都能说出三个来。因此,数据反映出来的差异,其实是哪些儿童“ 人缘极差 ”。这个变量很可能会被 称为 “好人缘”,但是它根本解释不了与“ 人缘极好 ”相联系的那些事情。
在考察效应的异质性时,这种上限效应和下限效应会导致数据中呈现某种有规律的模式。比如说,我们要测量教育对收入的影响。我们有三个人:一个接近收入下限;一个位于中间;一个接近收入下限。处在下限的人只能向上;处在上限的人只能向下;处于中间的人向上向下都可以。你会想得到,收入与教育之间的关系在中间部分最强。事实上,通常就是这样。
我们可以把数据分成不同子集(subsets),然后对每个子集运行相同的模型,由此得到一系列“局部”参数(local parameters)。我们对数据分组时,是明确地这样做;我们在构建交互项系数时,是含蓄地这样做。上限效应和下限效应,往往会使得这些局部参数呈现出各种各样的U形模式。这里有一个经验法则:如果因变量的取值是有上限和下限的,那么你按 因变量 的取值分组就会使斜率呈现U形模式,按 自变量 的取值分组就会使斜率呈现倒U形模式。
让我们进行一个简单的模拟(
)。仍然以教育对收入的影响为例,假定教育(
)对收入(
)确实有影响。但是,我们无法精确地测量收入,而是只能知道每个人属于六个等分组中的第几组(或者第几层)。我们把这个收入的
测量值
称为变量
。我们通常见到的数据,往往就是这样的。无论
x
取何值,
与
之间的真实关系都是一样的。
[1]
但是我们观察不到
,因此并不知道这一点。因此,我们有两个问题:教育对收入的效应,是否因
教育
水平不同而有所不同?教育对收入的效应,是否因
收入
水平不同而有所不同?
图2.3 局部系数中的上限效应和下限效应
为了回答第一个问题,我们按教育
的高低将案例分组,然后对每一组运行收入测量值
对
的回归。结果,斜率在中间类别当中往往是最高的。(参看图2.3中的实线。)为什么呢?因为在教育最高水平那一组当中,即便收入的
真值
在增长,但是由于存在上限效应,它无法转化为收入
测量值
的增长。你可能认为这个道理很简单,你肯定不会这样做。但是,假如你没有按教育水平的高低将案例分组,而是按某个与教育
高度相关
的变量(如某种道德态度)将案例分组,同样的趋势也会出现。
再来看另一种情况。尽管我们可以测量出收入
的真值,但是还是按
的取值把数据进行
等分,从而得到变量
。你这么做可能是有意的,因为想运行“分位数回归”(quantile regression)。也可能你这么做并不是有意想按
来分组,而是想按另一个变量来分组,而那个变量恰好与
高度相关。例如,如果居住区严格按照居民收入分为不同层级,那么你在(按居民平均收入排序的)各个居住区中分别运行局部回归,得到的结果与前面其实是类似的。在这种情况下(参看图2.3中的虚线),我们会看到斜率在中间部分最小。为什么呢?因为中间部分中包括了一些
值(教育程度)较高但是误差项
为负值的案例(他住在一个相对于其教育程度来说更贫穷的社区中),
同时还
包括了一些
值(教育程度)较低但是误差项
为正值的案例(他住在一个相对于其教育程度来说更富裕的社区中)。我并不是要对倒U形曲线模式的发现一概否定,而是认为如果这种预测越是针对数据存在的刚性限制(hard stop)而做出的,其重要性就越值得怀疑。确实有很多文章把这种倒U形曲线当作支持他们特定假设的有力证据,实际上则根本不是那回事。
即便没有遇到上限效应和下限效应,我们也需要明白自己的数据在可能性空间(space of possibilities)中处在什么位置。我们在前面已经看到,头脑中以为的和数据实际上的位置可能相差甚远。如我们在第1章里看到的,你构建了一个“威权主义”量表,用其他变量来对其进行回归。你在谈论和思考的时候用的词都是“威权主义”,因此以为数据反映的都是那些极端的、令人厌恶的威权主义分子。但是实际上,你是在用其他变量与均值的偏离来对量表得分与均值的偏离进行回归。你的数据有可能 没有一个 取到极端值!你的“力量”(可解释方差)全都来自于那些处于中间的人。统计学教师(像忠诚的涂尔干主义者一样)往往会警告你要小心那些讨厌的特立独行者(即极端值或离群点)。但是,那些随波逐流者(数据中没有取极端值的大多数)有时同样可能会扭曲你的结论。
例如,丹尼尔·施奈德(Schneider,2012)有一个关于工作中性别角色的理论。根据从事某些工作的人中男女两性所占的比例可以对工作进行排序。一项男性占到95%的工作往往被认为是男性职业。施奈德认为,那些自己的性别与工作的性别 非常吻合和非常不吻合 的人,往往在工作 以外 都会更多从事符合性别刻板印象的活动。这意味着,在男性占到95%的岗位上工作的男性,或者在男性只占5%的岗位上工作的男性,在周末都更有可能去踢足球;而在男女各占50%的岗位上工作的男性在周末更有可能打毛衣。
施奈德推论说,如果上述逻辑成立,那么在预测是否会从事符合性别刻板印象的活动时,回答者工作岗位中的男性比例以及这个比例的二次项都会是显著的。施奈德的数据确实验证了这一推论,他非常兴奋。发现在男性占到95%的岗位上工作的男性更有可能从事符合性别刻板印象的活动,这很平淡乏味;但是发现在男性占到5%的岗位上工作的男性 也 更有可能从事符合性别刻板印象的活动,这就很精彩了。这个发现符合施奈德提出的“认同威胁”概念,学术期刊的评审人也对此表示了赞同。
你有没有看出问题出在哪里?问题在于,在男性占到5%的岗位上工作的男性人数极其稀少。二次项主要拟合的其实是分布中
另外一端
的精确形状。对那些在性别错位的岗位上工作的少数人,二次项并不在乎他们。换而言之,
数据并不在理论所指向的地方。
施奈德并没有把数据分段,来看他的理论命题是否足够坚实。(他使用了两个数据。在工作岗位中男性比例较低的这一端,在一个数据中存在负向关系,在另一个数据中不存在任何关系。应我的要求,他非常大度地进行了上述检验。)
在一定程度上,这支持了我在《领悟方法》中讲过的一个观点: 不要 老想着“检验”自己的理论,至少不要像统计学课上老师教过你的那样。那种做法就好比,因为有人治好了一个病人就给予他医学学位一样。如果你真想检验那个理论,就得真去挑战它,给它找一个相当的对手,然后来场决斗。施奈德是按我们通常的做法来“检验”理论的。他的理论意味着会有U形曲线出现,所以他就去检验U形曲线,但是他没有意识到,U形曲线的出现是由于他理论中最平淡乏味的部分,而不是他以为的理论中最有趣精彩的部分。如何才能避免这种错误?很简单,作图时要同时显示边缘分布(很多情况下被称为“边缘图”[marginal plots])。图2.4就是使用模拟数据做出的边缘图(R2.4)。
图2.4 边缘图
还有一条,你的预测(尤其是你认为具有理论重要性的那些预测)一定要紧密地贴合数据来进行。如果数据中几乎不存在某一类案例,你还非要对它进行某种理论预测,那么就算这种预测再有趣,它也是具有误导性的。这种情况并不罕见,有些人通过回归常常会得出一些搞笑的结论,类似于“回归预测出了一个大学毕业的5岁女孩当挖掘工人时的收入”。我们往往想在极端案例中展示自己的观点,此时就容易犯这种错误。戈德堡等人最近有一篇令人印象深刻的论文(Goldberg et al.,2016),他们在一个公司中抽取了601名员工及其电子邮件作为样本,从中计算出了“文化契合”和“网络约束”得分,两者的相关系数为
r
=0.316。这篇论文是文本分析的范例,其结论也无可置疑。但是,作者在展示发现时构建了四种理想类型,两种为吻合类型(符合相关系数的走向),两种为错位类型的,然后预测这四种理想类型的结果。作者定义这些理想类型时,要求它们在“文化契合”上的得分落在均值上下两个标准差之外,在“网络约束”上的得分位于第10百分位数以下或第90百分位数以上。问题在于,在那样的相关系数下,在每种吻合类型中只会有2个观察案例,在每种错位类型中大约只有不到1个观察案例(R2.3)。作者还作图展示了“文化契合”得分在上下三个标准差之外的情况。但是正态分布中处于三个标准差之外的比例只有0.27%,因此这样的案例几乎不存在。不是说我们不能进行外推,但是外推是有风险的。对此有一个很好的经验法则:在对“预测”线画图时,你一定也要同时把数据点画在上面。
你已经知道了解数据分布在哪儿的重要性。除此之外,你在分析之前还需要了解数据中的变异和共变(covariation)落在什么地方。在一些学术会议中,在发言人用幻灯片讲文献综述或者与主题并不相干的一些理论时,我往往会直接翻到论文的后面去看。我尤其要去看他的相关系数矩阵。我会看得很细。我要理解数据当中共变模式落在了哪里。在这之后,我才会去看那些多变量分析是怎么做的。学生们有时候很奇怪,因为我好像比发言人还明白他的分析是怎么回事!我有时候确实会犯错,但多数时候我的提问都会正中要害。因为他其实根本不了解自己的数据 实际是 怎么回事。他知道他希望显著的某个系数有很大的标准误,但是他不知道 为什么 。其实答案几乎全都在他列出来的那个相关系数矩阵里。
有时候,那个简单的相关系数矩阵会告诉我们,发言人的数据无法解答他的问题。因为数据中 没有 任何变量和因变量相关。或者是因为 所有 变量都高度相关,纠缠在一起无法择清。在着手 解释 变异之前,你得先知道变异主要体现在哪些地方。对于复杂数据结构(如在多个时点对多个单元进行观察)来说,这一点尤其重要。变异主要落在了同一案例在不同时点的“变动”上,还是不同案例在同一时点的“差异”上?变异是均匀分散的,还是有些奇怪地聚集在几个点上?
布里格曾经指出(Brieger,2000),每一个变量其实就是划分案例的一种方式。因此,有很多变量虽然 名称 不一样,但是 实际 上划分出的案例模式是相同的。所谓“多重共线性”其实指的就是这回事,尤其当变量是定类的,或者案例数较少时。布里格(Breiger,2009)的一篇论文中谈论过一个例子(这篇论文每个人都应该读一读)。人们对经合组织(OECD)的18个西欧成员国进行过很多定量分析,研究他们政治结构的这个方面和那个方面有什么关系。在政体上,西欧国家可以分为三种类型;在变量空间上,它们构成了三个“块”。你把它们 叫成 什么,随你的心意。但是实际上你指的就是这三种类型。基于不同的 标签 ,我们有80多种不同的理论,但这些理论使用的证据其实都完全一样(数据中的变异都落在了这三个“块”上)。不要把这些标签和背后的数据结构混为一谈。如果你了解数据中的变异落在哪儿,就不会犯这种错误了。
最后,我想重复斯坦利·李伯森(lieberson,1985)提出的一个精彩观点。他提出不要混淆“直接原因”(proximate causes)和“根本原因”(basic causes)。我在《领悟理论》一书中也表达过类似的意思,但用的词是“条件性解释”和“无条件性解释”。我们的阐释方式不同,但观点是一致的。李伯森指出,解释某种现象中的 变异 和解释这种现象 本身 是两码事,但我们却常常混淆这两者。一个简单的例子是,解释“为什么不同物体自由落体时速度不同”和解释“为什么物体会自由落体”是不同的。另一个复杂些的例子是有关职业分层的。为什么 这个 人工作一年只能挣1.2万元(或者没有工作), 那个 人工作一年却能够挣到1200万元?这是一个问题。为什么世界上会存在干一年只能挣1.2万元的工作和干一年就能挣1200万元的工作?这是另一个问题。如果你混淆了这两者,那么你用来“解释”分层本身的那些说法很可能只是表面的粉饰(whitewash),即便它通过了那些所谓的“因果推断”的标准。
你在考虑数据中的变异时,要留心这可能遮蔽数据中的另一个方面:不同变量有着不同的 尺度 (scale)。同样大小的系数有可能有着非常不同的实际意义,因为用来测量变量的尺度是不同的。如果你了解数据中变量的尺度,你的报告中就不会出现像“0.000 *** ”这样烦人的字眼了。 [2] 了解变量的尺度,还会有助于你得到正确的系数。OLS回归分析不受测量尺度的影响,因为它的分析起点其实是相关矩阵,但是非线性模型会受测量尺度的影响。用来估计这类模型的很多统计运算都更为复杂,并不像你更熟悉的商业统计软件包那样易于上手。它们会从某个初始值开始搜寻最佳估计,搜索结果往往对于变量的尺度非常敏感。因此,让你的变量尺度和统计运算惯例中使用的尺度一致,这通常是有利的(至少是无害的)。
尺度听起来像是一个“小”问题。但是如果你不清楚尺度是什么,你就连“小”到底是什么意思也不会明白。事实上,我见过不少求职者由于不清楚自己参数的尺度而说出蠢话来。其中有一位研究者在言之凿凿地谈论某种社会过程,但是如果你明白参数的尺度,你就会知道他讨论的那个结果将在大约1200年后才能出现。
最后,在很多情况下,你还需要了解抽样单元的寿命(lifespan)有多长。如果你对人进行抽样访谈,那么数据中只包括那些活到现在的人。严格地说,这个样本并不是那些同期群(cohort)的随机样本:数据中不包括已经死去的人。现在的死亡率已经很低,因此这里的偏误并不会太大,可能只有老年学家才会关注这一偏误。但是,同样的问题也会出现在其他情况中。
如果你对婚姻感兴趣,希望了解不同的族裔之间通婚或同居的比例。但是,有的浪漫关系可以维系很长时间,有的只维系了很短的时间。在一个人的生命当中,他可能有很多次婚姻,只是有些婚姻不再“存活”了。现在的人口普查数据是每10年收集一次。图2.5是一个示意图:每行表示一个人的生命,每个长条表示一段浪漫伴侣关系,时间从左到右前进。箭头表示我们抽样的时点。在样本中,我们会有过多的维系时间较长的关系,更少抽中维系时间较短的关系。但是,实际的跨族裔婚姻中维系时间较长的关系应该比数据显示的要少,维系时间较短的关系应该比数据显示的要多。
图2.5 对婚姻关系进行抽样
换而言之,对寿命有较大差别的某种事件在某一时刻抽样,这实质上不是对“事件”本身进行抽样,而是在对“事件—持续时间”(event-days)进行抽样。如果我们的本意就是对“事件—持续时间”进行抽样,那当然没什么问题。如果我们的本意是对“事件”本身进行抽样,只要能够知道事情的开始时间,问题也不会太大。但是即便我们知道它们的开始时间,仍然不能判断它们的结束时间。估计每个事件的存活时间,这是个有趣的智力挑战。有时候,要得到你想要的估计,你就得去接受这个智力挑战,并且赢得挑战。
我已经讲过了解数据的重要性,你要明白数据是如何生成的。此外,你还要了解用数据来做分析时的每个细节,至少在力所能及的范围内做到足够了解。Stata软件出了错你不用负责,但是你的程序写错了你是 要 负责的。现在编程比以前容易多了,这当然是件好事,但是这也意味着你非常容易犯下严重的错误。社会学家都是靠自学学会编程的,你应该也不例外,所以更要小心编码中的错误。你现在可以用很漂亮的程序来展现一个网络,模拟一个模因(meme)的传播,用其他变量对某个变量进行回归,然后再把它们都汇聚到一个很酷的程序中。但要记住一点:越是在大数据中,小错误引发的后果越严重。
你如何才能意识到自己在编程中犯错了?只有 真正 了解你的数据,你才更可能发现程序中的错误。数据越大,你就越难对它有直观感受;程序越复杂,你就越难意识到你已经犯错。
那么你该怎么办?其实很简单。从数据中抽取出一小部分来,具体多少要取决于数据的类型,甚至小到10个案例、2个变量都可以。这些数据量要小到你可以打印出来,你一眼就可以看到全部数据,以及对数据的处理过程。你要对这一小部分数据运行程序,同时输出所有的中间信息,然后
手工核对这些信息
。有些东西你是无法手工核对的,例如需要迭代拟合的模型,此时你可以用另外一个运算程序来核对。你可以像约翰·亨利(John Henry)
一样和机器比拼一下,有时候你会因此发现一些有趣的结果。我曾经写过一个在多个组别中运行非线性模型的程序QAP(Quadratic Assignment Procedure,即二次分配程序)(Martin,1999a),得到的结果却和当时最常用来进行此类检验的程序UCINET Ⅳ不相符。但SPSS的计算结果和我的相符,于是我把全部过程手算了一遍。结果发现,UCINET处理缺失值的方式中存在错误。这样的结果对我们是最好的。
在确信你的程序适用于10多个案例的小数据之后,再继续扩大规模。它对于100个案例的情况适用吗?对1000个案例,结果还是对的吗?这样做会让你在结果不太对劲的时候能够马上意识到。还是以QAP程序为例,有一度我感觉到程序得出来的
值不对劲。程序没有变,但是给出的统计量却不一样了。这太古怪了。我也说不清为什么,但是基于我对数据的了解,我不相信得出来的结果。我回去重新检查自己的程序,花了很长时间才发现了问题所在:其中有一行程序,将随机数生成器中的种子值“重置”为以百分之一秒来计数的当前时间。
这一行命令只需要在程序开始时运行一次,但是写程序时会把命令行的位置移来移去,所以它最终被放到了一个循环命令(loop)当中。当时也没有造成什么影响,但是后来我又移到了一台运行速度更快的机器上,结果用了不到百分之一秒就完成了对置换后的数据的整个分析(我从来没想到机器会这么快)。这样,分析中就包括了很多完全相同的置换后数据,这是不应该的。原本应该有1000种不同的置换后数据,但我只得到了大约280种。
我怎么发现问题所在的?我让计算机程序输出每一步的结果,我核对了每一个重新排列后的数据,然后发现有很多都是相同的。这种事情人人都做得到,但是你得足够较真。另外,你不要害怕浪费成百上千张纸。如果你只在屏幕上浏览,那就很可能什么东西也看不出来。你需要把纸铺得满地都是。
另外,你在合并(merge)数据的时候也要小心。先取几个数据试一试,看看是否一切正常。不要只取第一行数据,因为很多错误并不会在第一行就显现出来,尤其是数据形式是数组(array)时,数据的维度会和你以为的不一样。数据核对确实极其烦琐,但是我敢保证,在花了一晚上核对完数据之后,你会睡得更安心。
[1]
在我们的模拟中,关系式为
,
;即真实的斜率为1.0,误差项在
的所有取值上都是正态同分布的。
[2] 还有些愚蠢的作者会在报告中呈现“ p = .000”,甚至“ p < .000”。至于这为什么愚蠢,读者可以自行思考,权当一道练习题吧。