总有第三只手,在拧那个旋钮
混淆不是「数据有噪声」,也不是「样本不够」。它是一条结构上的通路:有一样东西同时决定了谁接受处理、和结果会怎样。它一个字节的数据都不弄脏,只是让你把别人的功劳记在了 X 头上。
某医院数据显示:住进 ICU 的病人,死亡率是普通病房的十几倍。这个数字说明了什么?
这一题几乎所有人都能答对。有意思的是:同一个人,换个场景就会答错。本章末尾会把那个场景摆出来。
混淆的定义,只有一句
一个变量 C 是 X 和 Y 之间的混淆变量(confounder),如果它同时影响两者:
C
↙ ↘
X → Y
关键在那个「同时」。只影响 X 的东西不是混淆(第 19 章会看到,那种东西反而是宝贝)。只影响 Y 的东西也不是混淆(它只增加噪声,不制造偏差)。必须两边都伸手。
ICU 那个例子里,那只手是「病情严重度」:病情越重,越可能被送进 ICU(影响 X),也越可能死(影响 Y)。于是「ICU 死亡率高」这句话里,混着两样东西:ICU 的真实效果(大概率是救命的),和「进 ICU 的人本来就快死了」。
这里有一个细节值得停一下:混淆并没有让数据变脏。医院记录的死亡率是准确的,样本是全量的,统计是对的。脏的不是数据,是从数据到结论的那一步。
一根滑杆,把 + 拧成 −
光说不够。下面是一台世界机器,我在里面写死了三条箭头,其中 X→Y 的强度永远是 +0.30,不会动。滑杆只动 U→Y 那一支。
把滑杆从 0 拉到 2,你会看到这样一串数:
U→Y 强度 你从数据里看到的 真效应 控制 U 之后 ───────── ──────────────── ────── ────────── 0.0 +0.299 +0.300 +0.302 0.5 +0.053 +0.300 +0.302 1.0 −0.193 +0.300 +0.302 1.5 −0.439 +0.300 +0.302 2.0 −0.685 +0.300 +0.302 # 中间那一列一次都没动过。左边那一列跑了 0.98 个单位,还翻了号。
请仔细看最右边那一列:0.302,一动不动。只要你把 U 放进回归,不管那只手拧得多用力,你都能把真效应捞回来(0.302 与真值 0.300 之间那 0.002 是抽样误差,两万个样本剩下的零头)。
这就是本书前半本要建立的整个直觉:
你在数据里看到的关联
= 沿着【因果通路】流过来的部分 ← 你想要的
+ 沿着【后门通路】绕过来的部分 ← 混淆造成的
「后门」这个词第 10 章会给出精确定义。现在只要抓住画面:从 X 出发,有一条路是逆着箭头往上爬、绕到 U、再顺着箭头下到 Y。这条路和因果无关,但它照样会在数据里制造关联。
第二项的大小和符号,你从数据本身看不出来。上面那五行数据,光看第二列的话,从 +0.299 到 −0.685 都有可能,而真相一直是 +0.300。
「控制」这个词,到底在做什么
把 C 放进回归,通常被叫做「控制 C」或「调整 C」。这个词容易让人误解成「让 C 保持不变」,好像我们真的按住了什么东西。
更准确的画面是:在 C 相同的人里面比较。把所有人按 C 分堆——同样病情的人放一堆——在每一堆内部比 X 和 Y 的关系,最后把各堆的结果按堆的大小加权平均。这就是第 12 章的「调整公式」,而回归是它的一个连续版本。
为什么这样就能去掉后门那一项?因为一旦 C 被固定住,那条「X ← C → Y」的路就断了:在同一堆里,C 不再变化,它也就不再能同时推动两边。第 6 章会把这件事讲成一条通用规则。
「控制」(control)这个词在这里是统计学的用法,指的是「在回归里加一列」或者「分层后再比」。它和物理实验里的「控制变量法」(真的把温度按住不让它变)不是一回事,尽管中文用了同一个词。
这个词用坏了的地方在于,它暗示了一种主动性——好像你控制了它,它就乖了。实际上你只是在数据上做减法(第 18 章会把这个减法算给你看)。减错了地方,是会出人命的(第 11 章)。
「用了我们 SDK 的 App,崩溃率更高。」——这句话大概率是真的,而且和 SDK 的质量关系不大:愿意接第三方 SDK 的往往是功能更复杂、迭代更快、依赖更多的 App,它们本来崩溃率就高。「App 的复杂度」是那只手。
「加班多的团队,交付质量更差。」——项目的难度同时决定了加班量和交付质量。
「参加了培训的员工,绩效提升更多。」——谁被选去培训?往往是本来就上升势头好的人。
这三句话有一个共同的形状:「谁接受了处理」不是随机的,而决定它的那个东西,同时也在影响结果。看见这个形状,你就看见了混淆。
上面那台机器,你把样本从两万加到两亿,−0.685 会变成 −0.6850000…,只是小数点后更多位的错。
这是「大数据能解决一切」这个信念最硬的一堵墙:数据量买的是精度,买不到无偏。第 14 章会把这两件事并排放在一张表上——随机化让偏差归零,样本量让方差缩小,它们各管各的,谁也替不了谁。
DB 和 C 都对,而 C 恰好就是解决 B 的办法。
而那个「换个场景就会答错」的场景是这样的:
某编程语言的用户,代码缺陷率比另一门语言低 30%。所以这门语言更安全。
结构完全一样:语言的选择不是随机的(什么项目、什么团队、什么行业规范),而那些因素同时也在决定缺陷率。但因为这一次结论符合我们的偏好,那只手就变得很难看见了。混淆最危险的时候,不是它藏得深,而是结论正合你意。
A 「数据说 ICU 死亡率高,所以 ICU 有问题」——把「看」当成了「拨」。 B 对,但停在了「无法判断」。其实可以判断,只要 C 选对(第 10 章给条件)。 C 对,但它有一个隐含前提:你得先知道该按什么分堆。分错了会更糟——第 11 章有两个当场把对的变成错的例子。这一章的一句话
混淆是一条结构上的通路,不是数据上的瑕疵;它不改变真效应,只改变你看到的那个数,而且再多的数据也不会让它自己消失。
下一章看一个更过分的版本:不是数字偏了,是方向整个翻过来。1973 年伯克利研究生院的录取数据,全校男性录取率 44.5%、女性 30.4%,差了 14.2 个百分点;而分系去看,六个系里有四个系女性的录取率反而更高。两句话都是从同一张表算出来的。