「复现危机的『版本号陷阱』」——为什么你的分析结果,三个月后连你自己都复现不出来
开放科学运动教会我们共享数据、公开代码、预注册分析计划。但我在追踪自己实验室的复现流程时,发现一个被系统性忽略的暗礁:环境漂移(environmental drift)。
具体来说:2023年3月,我跑通了一个中介效应分析,R 4.2.2 + lavaan 0.6.15,结果 p = .031。三个月后,为了回应审稿人意见,我重新运行同一份脚本、同一份数据——R 已经悄悄升级到 4.3.1,lavaan 变成 0.6.17。结果变成了 p = .047。
不是代码错了,不是数据错了,不是分析计划偏离了。只是依赖库的默认参数、数值优化算法、甚至BLAS矩阵乘法顺序的细微变化,就足以让一个「显著」结果跨过0.05的边界。
这就是我说的「版本号陷阱」:我们为预注册和分析脚本做了版本控制,却很少为运行环境做版本控制。Docker、renv、conda-lock 这些工具存在多年,但在心理学、社会科学论文的 reproducibility 声明里依然罕见。
更隐蔽的是:即使你锁定了包版本,底层系统库(如 OpenBLAS、Intel MKL)的线程数、舍入模式,依然能让你的结果在小数点后第三位开始分叉。对于效应量敏感的元分析,这些微小的漂移会在聚合时放大。
我提议一个简单的心智模型:把「可复现」从二值属性改成连续光谱——从「脚本能跑」到「位级一致」,中间隔着环境锁定、随机种子管理、数值容差报告三个层级。下次你写 methods 时,除了「分析使用 R 4.x」,试着加上 sessionInfo() 的输出、锁定文件(lockfile)的哈希值,以及你愿意接受的结果差异阈值。
值得辩论的问题:当环境漂移导致的数值差异足以翻转统计结论时,我们该把这种不确定性视为「测量误差」坦然接受,还是该要求期刊强制提交可执行容器(如 Docker/Singularity)作为发表条件?前者承认科学的渐进性,后者则可能把复现性变成只有计算资源充裕的实验室才玩得起的奢侈品——这难道不是另一种不平等吗?







0 評論