「吸烟对低出生体重儿反而是保护因素」——真实数据里的悖论,如何一枪打穿『把能调的变量都调一遍』
【锚点】这一篇只钉一个判断:在回归里“控制更多变量”不等于“更接近因果”。当你把【碰撞点(collider)】放进调整集,你打开了一条本来关闭的非因果路径,可能造出一个方向相反的虚假效应。
【显式】一个被反复复现的真实现象(Wilcox 1993;Hernández-Díaz, Schisterman & Hernán 2006, “The birth weight ‘paradox’ uncovered”, Am J Epidemiol 163:1): - 在全体新生儿里,母亲吸烟 → 婴儿死亡率【升高】。 - 但只看【低出生体重】这一层,吸烟母亲的婴儿死亡率反而【更低】。
同一份数据,换一个分层,效应翻了方向。这不是数据错误,是【碰撞分层偏倚(collider-stratification bias)】。
【隐式】机制只有一步。出生体重 W 同时是两件事的结果: 1. 母亲吸烟 S(S → W,吸烟压低体重); 2. 一组未被测量的易感因素 U(U → W,先天/母体状况也压低体重)。 于是 W 是 S 与 U 的【碰撞点】:S → W ← U。
【流程节点链路】: 起点:总体中 S → 死亡率 为正(吸烟有害)→ 中间节点:按 W 分层(W 是 S 与 U 的碰撞点)→ 中间节点:分层等于对碰撞点取条件,打开了 S ← U 这条非因果路径 → 终点:层内出现 S 对死亡率的负(虚假)关联。
【隐式】为什么层内会反过来?在【低体重】这一层里,一个吸烟妈妈的婴儿之所以低体重,最可能是“被烟压下去的”(一个强而具体的因);而不吸烟妈妈的婴儿之所以低体重,只能归因于 U(易感/病弱)。于是同一层里,吸烟组婴儿在其它维度上反而更“结实”——你比较的不是吸烟的因果效应,而是两组“为什么低体重”的不同配方。
【细微】真正危险的地方:U 从来没进过你的模型,你却因为它而偏了。你以为“我没控制 U,所以 U 不会捣乱”——恰恰相反,是你对碰撞点 W 取条件,才把 U 拉进了层内的比较。而且这个偏倚要显形,还需要 U 也影响结局(死亡率)——这就是为什么悖论出现在“死亡率”上,而不是出现在 U 不碰的某个结局上。碰撞偏倚 = 对撞点取条件 × 该撞点背后的共同因也影响结局。
【极难发现】最深的盲点不是“别调碰撞点”这句口号,而是:碰撞点不是一个变量的固有属性,而是相对于【你问的那个因果问题】才定义的。同一个 W,在“吸烟→死亡率”里是碰撞点(要避开),在“想分离出经由 W 的中介路径”里又变成中介(要调,但要用中介分析而不是普通分层)。调整集没有全局正确答案,只有“相对于 (处理, 结局, 目标 estimand)”的正确答案——这就是后门准则的全部内容。
【结论】“把能调的变量都调一遍”不是稳健,是拿一个未声明的 estimand 去换一个好看的系数。正确顺序是:先画 DAG → 声明要估的因果量 → 按后门准则选最小充分调整集。
【留给你的辩论题】如果临床真的想知道“在低出生体重儿里,吸烟对死亡率的效应”,而 W 恰恰是碰撞点——这个因果量还能不能估?朴素分层显然错了;用主分层(principal stratification)或中介分析能救回来,还是说这个问题本身在因果上就是 ill-posed 的?







0 評論