真实政策效应 5.0、两组共同的自然增长 2.0。 平行趋势成立时估出 5.02±0.57,91% 的重复实验落在 5±1 内; 处理组本来就涨得快 3.0 时,估成 8.02±0.57,一次都没落进去。 这个偏差加大样本也消不掉——它压的是标准差,不是均值。
上一节算的是「等多久」,有明确的物理量。 这一节算的是「这个政策到底有没有用」——没有对照组,没有重复实验,只有一次已经发生的事。
一、最直觉的办法为什么是错的
最直觉的评估方式是「前后对比」:政策前人均办事量 63,政策后 70,涨了 7,就说是政策带来的。 问题在于:就算什么政策都不发,这个数也会涨。经济在增长、人口在流动、系统在变好, 这些因素全都会推着指标往上走。把总涨幅全算成政策功劳,是典型的「把自然增长算成政绩」。 Demo 里这个陷阱看得很清楚:真实政策效应是 5.0,两组共同的自然增长是 2.0, 处理组的前后对比是 7.0——多出来的 2.0 跟政策毫无关系。 光有「前后」不够,还得有「对照」。 找一个没发这个政策、但其他条件差不多的组,看它同期涨了多少,把这块扣掉。 这就是双重差分(DID)的全部想法。
二、双重差分:一句话的算法
(处理组后减前)减去(对照组后减前)。两个括号里的「前」都被减掉了, 两组共同的自然增长在相减时正好抵消。 Demo 各造 100 个样本,重复 300 次,看估计值的分布:
| 情形 | 估计均值 | 标准差 | 落在 5±1 内 |
|---|---|---|---|
| 平行趋势成立 | 5.02 | 0.57 | 91% |
| 处理组本来涨得更快 3.0 | 8.02 | 0.57 | 0% |
| 第一行:估出 5.02,真值 5.0,差 0.02。这个差是抽样噪声——重复 300 次的标准差是 0.57, | |||
| 0.02 远小于它,属于「测不出来」。 | |||
| 91% 的实验落在真值上下 1 的范围内,说明这个方法在前提成立时是可靠的。 | |||
| 第二行才是重点:处理组本来就涨得快 3.0(比如经济好的区先试点),估计变成 8.02, | |||
| 比真值高 3.0,300 次里一次都没落进 5±1。 |
三、偏差和误差不是一回事
表里两个标准差都是 0.57,但两行的均值差了 3.0。这就是「系统偏差」和「随机误差」的区别。 随机误差:加大样本能压小。标准差从 0.57 到 0.28、0.18……只要样本够多, 估计会越来越稳地贴着某个值。 系统偏差:加大样本一点用都没有。样本翻十倍,标准差从 0.57 掉到 0.18, 但均值还是 8.02,还是比真值高 3.0。 所以「样本量不够」和「方法有偏」必须分开诊断。看到估计值和预期不符, 第一反应不该是「再加点数据」,而是先问「我的前提成立吗」。 加数据只能让错答案更精确。
四、平行趋势是前提,不是假设可以跳过
双重差分能成立,靠的是一个前提: 如果没有这个政策,处理组和对照组的变化趋势会一样。这叫平行趋势。 这个前提不可检验——因为「没有政策的世界」根本观察不到。但可以做两件事来给它找证据: ① 看政策之前的若干期。把两组在政策前 4 期、6 期的曲线画出来, 如果是平行的,就有理由相信政策后也平行。 如果政策前就分叉,那政策后的差异很可能是这个分叉的延续。 ② 做安慰剂检验。把政策时点往前挪两年,用同样的方法算一遍。 如果这个时候也能算出「显著效应」,说明方法本身有问题,它抓到的是趋势不是政策。 所以做政策评估,画图比算数重要。那张「政策前两组曲线」的图, 是整份报告里最该放第一页的东西——因为它决定后面所有数字能不能用。
五、落地:四个动作
第一步,找对照组。同一政策在不同区县、不同批次推开的时间差,是最好的对照组来源。 没有对照组,就只能做描述,不能做因果。 第二步,画平行趋势图。 政策前至少 4 期,越平越好。不平就换对照组,别硬算。 第三步,算 DID 并报置信区间。 只报点估计是不合格的——政策效应 5.0,如果 95% 区间是 [−1, 11],那这个结论等于「不知道」。 第四步,做安慰剂和替换变量检验。换个指标、换个时点、换个子样本,结论还在不在。 在这四步里,这一步最能筛掉「碰巧算出显著」的结论。 最后提醒:AI 在这里的作用是「把该算的算清楚」,不是「给出结论」。政策要不要继续,取决于代价、 公平、可行性,这些都不在数据里。模型最该做的是把不确定性标清楚, 而不是把一个 5.02 说得像 5.00。
六、动手 Demo:政策评估:真实效应 5.0,有选择偏差时估成 8.0
造两组各 100 个样本。处理组基线高 3 分,两组都服共同的自然增长 2.0,处理组额外加真实政策效应 5.0。 做双重差分:(处理组后减前)减(对照组后减前)。 跑两种情形——平行趋势成立、和处理组本来每年多涨 3.0(选择偏差),各重复 300 次,统计估计均值、 标准差和落在真值上下 1 的比例。
def did(bias, seed):
r = np.random.default_rng(seed)
n1 = n0 = 100
t_pre = 63.0 + r.normal(0, 4.0, n1) # 处理组基线高 3
t_post = t_pre + 2.0 + 5.0 + bias + r.normal(0, 4.0, n1)
c_pre = 60.0 + r.normal(0, 4.0, n0)
c_post = c_pre + 2.0 + r.normal(0, 4.0, n0) # 只涨自然增长
return ((t_post.mean() - t_pre.mean())
- (c_post.mean() - c_pre.mean()))
unb = np.array([did(0.0, s) for s in range(300)]) # 平行趋势成立
bad = np.array([did(3.0, s) for s in range(300)]) # 处理组本来涨得快
实跑输出:
--------------------------------------------------------------------
政策评估:真实效应 5.0,有选择偏差时估成 8.0
--------------------------------------------------------------------
真实政策效应 5.0
两组共同的自然增长 2.0(被差分抵掉)
无偏差估计 5.02 ± 0.57
有选择偏差估计 8.02 ± 0.57
情形 估计均值 标准差 落在 5±1 内
-------------------------------------------------------
平行趋势成立 5.02 0.57 91%
处理组本来涨得更快 3.0 8.02 0.57 0%
双重差分的算法一句话:(处理组后减前)减(对照组后减前)。
两组共同的自然增长 2.0 在相减时抵消了。
平行趋势成立时估计 **5.02**,和真实效应 5.0 差 0.02——这个差是抽样噪声,
重复 300 次的标准差是 0.57。
但如果**处理组本来就涨得快**(比如经济好的区先试点),估计变成 **8.02**,高了 3.0。
**这个偏差不会因为样本变大而消失**——它是系统偏差,不是随机误差。
加样本只会把标准差从 0.57 压小,**均值还是比真值高 3.0。**
所以做政策评估,比算 DID 更重要的是**先证明平行趋势**:看政策之前若干期,
两组曲线是不是本来就平行。**不平行,后面算出来的数就不能用。**
这也是「双重差分」和「简单前后对比」的全部区别:后者会把自然增长算成政策功劳。
比如本例的处理组前后对比是 7.0,而真实效应只有 5.0。
done -> _out_39n.txt
先看两组的前后对比:处理组涨了 7.0,对照组涨了 2.0。 如果只做前后对比,结论是「政策带来 7.0」——而真实效应只有 5.0。 双重差分:7.0 − 2.0 = 5.0。这 2.0 的自然增长被差值消掉了,这正是 DID 的核心动作。 300 次重复下估计均值 5.02、标准差 0.57,91% 落在 5±1 内。 说明方法在前提成立时没有系统偏差。 第二行:把处理组的自然增长从 2.0 改成 5.0(多 3.0),估计均值变成 8.02。 真实效应没变,还是 5.0。高的那 3.0 全是选择偏差。 最该记住的是:两行的标准差一模一样(都是 0.57)。 标准差看不出偏差——它只反映随机性。所以「表里误差不大」不能当成「结论可靠」的证据。 要说明:这组数据是我造的,效应值也是我设的。 但 DID 的算法、抽样分布、置信区间的定义都是真的——换成真实面板数据,这套流程一模一样。
30 秒实验
- 把处理组的样本量从 100 加到 1000,重跑有偏差那一组。 标准差会缩到 0.18 左右,均值还是 8.0 上下——偏差不会变小。
- 把 bias 改成 −3.0(处理组本来涨得慢),看估计值。 会变成 2.0 上下,方向反过来——低估和高校是同一个机制。
- 把共同自然增长从 2.0 改成 10.0,看估计值变不变。基本不变:只要两组都是 10.0,相减就抵掉了。
常见误区
- 「政策前后涨了 7,所以政策效果是 7」。 把自然增长算进去了,真实效应只有 5.0。必须减掉对照组的同期涨幅。
- 「标准误很小,所以结论可靠」。标准差 0.57 的两行里,一行准一行偏 3.0——精度高不等于准。
- 「样本不够就加数据」。系统偏差加数据也消不掉,只会让错的答案更精确。先查平行趋势。
自测三问(点开对答案)
1. 为什么「前后对比」会高估政策效果? —— 因为指标本身会随时间自然增长(经济、人口、系统改进)。前后对比把这部分也算成政策功劳。 2. 双重差分的公式是什么,它抵消了什么? —— (处理组后减前)减(对照组后减前)。它抵消了两组共同的自然增长,前提是两组趋势平行。 3. 为什么加大样本消不掉选择偏差? —— 选择偏差是系统性的,不是随机误差。加样本只压小标准差,估计均值仍然偏离真值。政策评估是「事后算账」,城市治理是「事中分派」。 下一节看一个每天要做上千次的决定:这条工单该派给谁。
- ☐ (本节完,下一节 9.2.3 城市治理升级)