卷 IV · 算出来CH 14深度 14/24

随机化:花钱买来的那把剪刀

随机化被叫做金标准,但多数人说不清它到底保证了什么。它保证两组人一样——这一章会给你看它们差多少。它保证的是另一件更微妙、也更有用的事。

随机化偏差 vs 方差卷 IV 开篇

▷ 先判一次

一次随机对照试验,每组 50 人。你检查了两组的基线特征,发现「历史活跃度」这一项两组差了 0.75 个标准差,差得挺明显。这说明?

A 随机化失败了,要重新分组B 随机化没问题,但这次结果不能用C 随机化没问题,这个差异在预料之中,而且它的影响已经被算进了置信区间D 应该把「历史活跃度」控制进回归来补救

提示:0.754 这个数字,正是这一章的引擎在 n=50、跑 200 次试验时遇到的最差那一次。

随机化到底剪断了什么

回到第 9 章那把剪刀。随机分配处理,就是把 X 那行赋值语句换掉:

# 观察世界
X := 抛一枚偏心硬币,偏心度取决于 C     # C 决定了谁更可能接受处理

# 随机试验
X := 抛一枚公平硬币                     # ← 和 C 无关,和一切无关

关键在「和一切无关」这四个字。你不需要知道有哪些混淆变量,不需要测量它们,甚至不需要知道它们存在——抛硬币把所有指向 X 的箭头一次剪光,包括你从来没想到过的那些。

✂ 随机化 vs 调整
随机化调整(后门)
剪断哪些箭头全部只有你测到的那些
需要知道混淆是什么吗不需要需要,而且要测到
需要画图吗不需要需要
代价钱、时间、有时候是伦理假设可能不成立

这就是「金标准」的确切含义:随机化不是更准,是让「识别」这个问题从一开始就不存在。

它不让两组一样

这是最常见的误解。下面这台机器跑真实的模拟:每档样本量跑 200 次独立试验,每次都严格随机分组,然后量两组的混淆变量 C 差多少(用标准化均值差)。

   n       两组 C 的平均差    最差的一次     估计值的标准差    估计均值
────────   ──────────────    ──────────     ─────────────    ────────
     50        0.2167          0.7541           1.9062         4.962
    100        0.1568          0.7144           1.4108         4.874
    250        0.1003          0.3911           0.8688         4.978
    500        0.0675          0.2379           0.6086         4.935
   1000        0.0478          0.2375           0.4499         4.928
   2500        0.0322          0.1761           0.3043         4.984
  10000        0.0159          0.0625           0.1443         5.003

# 真效应 = 5.000

n=50 的时候,两组的资历平均差 0.217 个标准差,最差的一次差到 0.754——按常用的平衡标准(<0.1),这是明显的不平衡。而这次随机化一点问题都没有,它就是随机的。

随机化保证的是别的东西:

◆ 随机化保证的三件事
  1. 期望上平衡:任何变量在两组间的差,期望是零。不是「每次都是零」,是「平均起来是零」。
  2. 偏差归零:估计值的均值等于真值。上表最右一列在 4.87 到 5.00 之间跳,围着 5.000 转,没有系统性地偏向任何一边
  3. 剩下的是可算的:残余不平衡带来的误差是随机误差,它随 √n 缩小,而且置信区间已经把它算进去了。

第三条是这一章的核心。请看表里的 √n 关系:样本量从 100 到 10000(×100),不平衡从 0.1568 掉到 0.0159,估计值的标准差从 1.4108 掉到 0.1443——两列都是约 1/10 = 1/√100

而第 2 章那台被混淆污染的机器,样本从两万加到两亿,−0.685 会变成 −0.6850000。差别就在这里。

◆ 偏差和方差,各管各的
                随 n 缩小吗    随机化能治吗    更多数据能治吗
              ─────────────   ─────────────   ──────────────
方差(噪声)      是 ✓           不需要            能 ✓
偏差(混淆)      否 ✗           能 ✓              不能 ✗

样本量买方差,随机化买偏差。谁也替不了谁。

这解释了一件很多人觉得奇怪的事:为什么一个 800 人的随机试验,比一个八千万人的观察数据更可信。因为前者的误差是可以算出来的,后者的误差连大小都不知道

A/B 测试的几个坑,用这一章的语言

如果你做过线上实验,下面这几条大概都遇到过。用剪刀的比喻看,它们都是同一种病:那一刀没剪干净。

  • 按用户 ID 尾号分桶。如果 ID 是按注册顺序发的,尾号就和注册时间相关——箭头没剪断。
  • 让愿意的用户先试新版。这是把剪刀交给了用户。经典的自选择偏差。
  • 只统计「完成了流程」的用户。第 4 章那道门。分母必须用「一开始分进这一组的所有人」。
  • 中途看结果,好了就停。这不影响那一刀,影响的是第三条保证——你的置信区间不再有效(这叫窥视问题 / optional stopping)。
  • 组间互相影响。社交产品里 A 组用户的行为会影响 B 组的体验,这违反了一个隐含假设(SUTVA:一个人的处理不影响另一个人的结果)。这时候需要按社群或地区整块随机化。
✎ 术语正名:「随机」

「随机抽样」(random sampling)和「随机分配」(random assignment)是两件完全不同的事,而中文里都叫「随机」,混淆了大量讨论。

  • 随机抽样:从总体里随机挑一批人来研究。它保证的是外部有效性——这批人能代表那个总体。
  • 随机分配:在已经挑好的人里,随机决定谁接受处理。它保证的是内部有效性——观察到的差异确实是处理造成的。

这本书讲的全是后者。你可以在一个完全不具代表性的人群里做一次完美的随机分配(结论内部有效但不能外推),也可以在一个完美的随机样本里做一次糟糕的分配(结论能代表总体,但那个结论本身是错的)。

▸ 在现实里

为什么医学试验要「双盲」?因为随机分配只剪断了「谁拿到药」这条箭头。如果医生知道谁拿了真药,那么「医生的额外关注」就是一条新的箭头,从分组直接指向结果,绕过了药本身。双盲是在补剪这一刀。

为什么要有安慰剂?同理——「知道自己在吃药」本身有效果。不用安慰剂的话,你测的是「吃药 + 知道自己在吃药」的合并效应。

这两件事在因果图上都是一条从「分组」直接射向「结果」的、绕过了处理的箭头。随机化剪的是进入 X 的箭头,它管不了从 X 之外新长出来的箭头。

对应到线上实验:如果新版本因为多了个功能而变慢了 200ms,那你测到的就是「新功能 + 变慢」的合并效应。想分开,得再设计一组。

✗ 这个直觉是错的
随机分组之后发现某个变量不平衡,说明这次随机化失败了,应该重新分。 在有限样本里,某些变量不平衡是必然的(你检查的变量越多,越一定会有几个「显著不平衡」)。而因为看到不平衡就重新分组,会破坏随机性——那一刀就白剪了。

为什么重分会破坏随机性?因为「重分」这个动作本身依赖于观察到的数据,于是最终的分组不再独立于那些变量。你在剪刀上又接了一条线回去。

正确的做法有两条:

  • 事前:如果你知道某个变量很重要,用分层随机化(block randomization)——先按它分层,层内再随机。这样能保证它平衡,而且不破坏随机性。
  • 事后:把它放进回归做协变量调整。这不是补救不平衡(不平衡本身不是偏差),而是降低方差——把 Y 里能被它解释的部分扣掉,置信区间会窄一些。
◇ 判词

C随机化没问题,这个差异在预料之中,而且它的影响已经被算进了置信区间。

0.754 正是引擎在 n=50、200 次试验里遇到的最差一次。它是随机性的正常产物,不是失败的证据。而 n=50 时估计值的标准差是 1.9062——置信区间已经宽到把这类不平衡的影响包含进去了。

A 「重新分组」——最危险的一个选项,因为它看起来最负责任。重分会让分组依赖于观察到的数据,把那一刀接回去 B 「结果不能用」——过度谨慎。随机化的保证是关于期望和分布的,单次试验的不平衡不构成偏差,只构成噪声。 D 「控制进回归补救」——这个动作本身是可以做的,而且通常值得做,但理由错了:它的作用是降低方差,不是修正偏差(因为本来就没有偏差)。理由错了会导致一个坏习惯:看到不平衡才控制,看不到就不控制——而「看到之后再决定」本身就引入了新的依赖。正确做法是事前就在方案里写死要调整哪些协变量。

这一章的一句话

随机化不让两组一样,它让剩下的差异只是运气;而运气随 √n 缩小、能被算进置信区间,偏差两样都不行。

下一章换一套语言讲同一件事。你会看到一张十个人的表,其中一半的格子永远是空的——因为每个人身上其实有两个数,而他只能走一条路。掀开那一半之后:真 ATE 是 3.730,而只看得见的那一半算出来是 −8.680