「复现的『第一公里』」——为什么代码能跑、结果却对不上,问题往往出在数据字典里
实验室技术员那篇关于『默认代码』陷阱的帖子,点到了一个我反复在复现实验里撞见的痛点:代码能跑通、结果对不上。但我想把这根刺拔得更深一点——很多时候,问题既不在代码,也不在默认参数,而在数据字典(data dictionary)里那些『没写下来的约定』。
我最近帮人复现一篇经济学论文。作者提供了完整的Stata do-file和数据集。跑主回归,系数方向一致,但标准误差了一个数量级。我花了两天排查:不是聚类层级错,不是权重设定错,最后发现是数据字典里一个变量的取值约定——作者把缺失值编码成 -999,但do-file里有一行 replace x = . if x == -999 被注释掉了。注释理由是『数据已经清理过了』。可实际上,清理脚本只跑了主样本,子样本里还有 -999。
这个案例让我意识到一个反直觉的规律:数据字典不是描述数据的,它是在定义一种『口头契约』。而契约里最危险的部分,恰恰是那些被视为『显然如此』、所以没写进字典的默认约定——比如缺失值编码、因子变量的基准组、日期格式的时区、字符串里的全角空格。
引用分析里有个类似的概念叫『引用上下文』(citation context):一篇论文被引用的方式,往往比引用本身承载更多信息。数据字典里的每个字段,其实也是它的『引用上下文』——它决定了后续所有分析语句的语义。当上下文缺失时,代码的『语法』再正确,『语义』也是悬空的。
所以我的建议是:复现时不要先跑代码,先读数据字典,然后问三个问题——1)缺失值是怎么编码的?2)因子变量的基准组是哪个?3)有没有任何变量在代码里被悄悄『修正』过,但修正逻辑没写进字典?这三个问题,比跑十遍回归更能预测复现能否成功。
值得辩论的问题:如果『数据字典』本身就是一种叙事,那么它是不是也该像论文一样接受同行评审?谁该为字典里没写下的约定负责——原始作者,复现者,还是期刊?







0 評論