同一张回归表里,系数们不住在同一个世界——Table 2 谬误与一个符号反转的玩具模型
【锚点】只钉一件事:一张多变量回归表里的每一行,估计的是【不同的因果量】。不同的调整集、不同的 estimand、不同的偏倚方向。把它们当成「谁更重要」的排行榜来读,是观察研究里最普遍的一次范畴错误。Westreich 与 Greenland (2013) 给它命了名:【Table 2 谬误】。
【显式】论文的 Table 2 通常长这样:Y ~ 处理 A + 协变量 B + 协变量 C,三行系数并排,各自带星号。读者默认三行在讲同一件事的不同程度。它们不是。
【隐式】为什么?因为「调整」不是一次全局动作,而是【对每个暴露各做一遍】的动作。对 A 而言,调整集应是 A 的混杂因素;对 B 而言,应是 B 的混杂因素。这两套集合一般不同。更糟的是:某个变量对 A 是混杂因素,对 B 可能是【中介】,也可能是【对撞因子】。同一个模型,对 A 是正确调整,对 B 是引入偏倚。
【极难发现】而对撞因子这一条会给出最难堪的结果:一个对结局【毫无因果作用】的变量,在表里能拿到一个显著、方向明确、还带三颗星的系数;而主暴露的系数可以【符号反转】。
下面是我构造的玩具模型,所有数字可手算复核。
【结构方程】 U ~ N(0,1) # 未测量的就医可及性 A ~ Bernoulli(0.5) # 随机分配的处理,与 U 独立 B = 3A + U + ε_B # 处理后记录的生物标志物,ε_B ~ N(0,1) Y = −2A − 2U + ε_Y # 结局,ε_Y ~ N(0,1)
真实因果效应:A 对 Y 的【总效应】= −2;B 对 Y 的因果效应 = 0(B 不在 Y 的结构方程里)。注意 B 的生成结构是 A→B←U,B 是一个【对撞因子】。
【流程节点链路】 起点:结构方程 → 中间节点 1:协方差。Var(A)=0.25,Var(U)=1,Var(ε_B)=1 ⇒ Var(B)=9(0.25)+1+1=4.25;Cov(A,B)=3(0.25)=0.75;Cov(A,Y)=−2(0.25)=−0.5;Cov(B,Y)=3(−0.5)+1(−2)=−3.5 → 中间节点 2:把 Y 同时对 (A,B) 回归的正规方程 [0.25 0.75; 0.75 4.25]·[b_A; b_B] = [−0.5; −3.5] → 中间节点 3:行列式 = 0.25×4.25 − 0.75² = 1.0625 − 0.5625 = 0.5;b_A = (4.25×(−0.5) − 0.75×(−3.5))/0.5 = (−2.125+2.625)/0.5 = +1.0;b_B = (0.25×(−3.5) − 0.75×(−0.5))/0.5 = (−0.875+0.375)/0.5 = −1.0 → 终点:表里写的是「A 效应 = +1.0,B 效应 = −1.0,均 p<0.05」。真实是 A = −2,B = 0。
三个灾难一次到齐: 1. A 的系数【符号反转】(−2 → +1)。药物从「有害」变成「有益」,只因为你「控制了」一个处理后测量的标志物。 2. B 的系数显著且稳健(−1.0),尽管 B 对 Y 的因果效应严格为零。它是被 A 和 U 共同塑造的产物,不是原因。 3. 两个系数在同一个模型里,却对应两个完全不同的 estimand:b_A 是「控制对撞因子后的偏关联」,b_B 是「控制 A 之后的偏关联」。两行都不等于任何一行的因果效应。
【细微】这不是数值巧合,方向可预测。在这个参数化下(B = kA + U + ε_B,Y = βA + cU + ε_Y,Var(A)=0.25),可解得 b_A = β − k·c/2。代入 β=−2、k=3 得 b_A = −2 − 1.5c。符号反转的临界点是 c = −1.33:只要「就医可及性」对结局的保护作用足够强,同一个模型就会把有害说成有益。偏倚的大小和方向,完全由那个你【没测量】的 U 决定。
【显式】这不是虚构的担心: · Griffith et al. 2020, Nat Commun 11:4023 —— 用 DAG 与模拟显示,「住院病人中吸烟对 COVID 看似保护」完全可以由对撞分层凭空产生。 · Munafò et al. 2018, Int J Epidemiol 47:226 —— 系统整理选择偏倚/对撞分层的量级。 · Cole et al. 2010, Int J Epidemiol 39:417 —— 教科书级的图示。
【该怎么做】 1. 一张表只回答一个问题。要报多个暴露,就为每个暴露单独画 DAG、单独定调整集,并【在表注里逐行写明调整集是什么】。 2. 拒绝「全模型」叙事。不要写「在调整了 X、Y、Z 后」,要写「对 A 我们调整了 {…};对 B 我们调整了 {…},因为 B 对 A 是中介/对撞」。 3. 把「不该调的东西」列出来。审稿意见里最有价值的一句不是「你漏控了变量」,而是「你控了一个不该控的变量,请说明它在 DAG 上的位置」。 4. 如果一定要并排,就并排【同一 estimand 的不同估计量】(粗化、IPTW、g-formula),而不是【不同 estimand 的同一张表】。
【留给你的问题】 如果一张表只能有一个因果解释,多暴露观察研究到底该怎么呈现?我的立场:把「主暴露」之外每一行降级为【描述性关联】,明确标注「不可作因果解读」——但这会让大量论文的 Table 2 失去卖点。你愿意付这个代价吗?还是说,更现实的做法是强制每篇论文附上那张 DAG,让读者自己判断哪一行还能读?







0 評論