RRIOLU精灵学院
设备场景

研究资料包能够解压,为什么仍不等于别人可以复核结果

可打开是格式层事实,可复核是版本、来源、环境和执行层结果。用manifest、稳定标识、来源关系与一次洁净环境重跑,才能知道资料包是否真的可复核。

读者收到一个资料包:CSV能在表格软件中打开,脚本能显示文本,PNG图表也能浏览。可是一运行脚本,就缺少套件、找不到原始资料,或产生与包内不同的图。文件都“正常”,复核却没有起点。

资料包可解压、文件可打开,只证明容器和基本格式可读;要让别人复核图表,还必须固定对象版本、校验文件集合、记录输入—活动—输出关系,并交付软件环境、参数、随机状态、排除规则和执行回执。

可打开是最低层检查

解压成功说明容器结构没有明显损坏。CSV可读说明某个工具能解释分隔与编码,脚本可见说明它是文本,图表可看说明渲染器支持格式。这些检查都没有验证文件集合是否齐全、版本是否固定或图表是否由当前脚本生成。

第一份回执只写格式层:哪些文件能打开、使用什么工具、出现哪些警告。不要把“文件可读”直接升级为“资料可复现”。

若脚本在开头读取网络地址、用户目录或未包含的共享盘,即使本机偶然运行成功,资料包也没有独立提供输入。把外部依赖列成对象,不用“作者电脑能跑”作为证据。

先固定资料包究竟是哪一版

DataCite的版本关系与Zenodo的DOI设计都把持续演化的资料集合和固定发布版本分开。一个概念DOI可以指向持续更新的资料集合,真正执行分析时仍要记录具体版本、文件名、大小与下载日期。

DataCite和Zenodo都区分持续演化的概念对象与具体版本对象。资料包说明页保存概念标识,执行清单保存具体版本标识;若平台没有版本DOI,就用仓储版本号、发布日期和文件哈希固定对象。

“访问日期”只能说明何时看过页面,不能证明之后下载到的字节。若仓储更新文件但保持顶层标识,只有版本字段和哈希能把分析锁回实际输入。

资料包修订不覆盖旧包。新增数据、修正脚本或改变环境时,产生新package ID,记录变更原因、影响图表和前后版本关系。

manifest把收齐与未变分开

BagIt要求manifest逐一列出payload文件及其校验值。资料包可以用相同原则建立逐文件SHA-256表,覆盖数据、脚本、环境锁、参数、说明和预期输出。

BagIt把对象收齐定义为complete,把逐文件校验通过定义为valid。complete先比较目录与清单差集,valid再重算每个哈希。只给压缩包一个总哈希,失败时无法定位具体文件;只列文件名,又无法发现字节变化。

接收端在解压后独立重算,不复制发送方的“已验证”结论。清单多出、少掉、路径重复、大小写冲突或哈希不同分别记录,先解决对象层问题,再讨论代码运行。

研究资料包能够解压,为什么仍不等于别人可以复核结果 配图 1
研究资料包能够解压,为什么仍不等于别人可以复核结果 配图 1

包内图表也进入manifest。若图表哈希与记录一致,只说明收到作者提供的那张图;还要重跑脚本,才能判断它是否可由当前输入产生。

来源关系回答“这张图怎样产生”

PROV-O以实体、活动和责任者组织来源。可以把原始数据、清洁数据、脚本、环境和图表视为实体,把下载、筛选、转换、拟合与绘图视为活动,并记录执行或审核者。

稳定版本与manifest固定输入字节,PROV-O式输入—活动—输出关系再把脚本、环境、参数和结果连接到一次运行。每个正式图表引用run ID,不只写“由analysis.py生成”。

运行记录包括实际输入object ID、脚本提交、命令、工作目录、开始结束时间、退出码和输出object ID。若脚本被改过但文件名没变,提交ID与哈希可以指出差异。

责任者字段不是为了把错误推给个人,而是让复核者知道谁能解释资料、谁执行运行、谁确认排除规则,以及自动系统在哪一步介入。

环境、参数和随机状态都属于输入

软件名称与大版本不足以重建环境。保存操作系统或容器标识、解释器、套件锁、系统库、区域与编码设置,以及硬件相关选择。安装说明应从空环境开始,而不是依赖作者机器已有状态。

参数不能只藏在脚本默认值。把命令行、配置文件、环境变量和实际解析后的参数写入日志。默认值随软件版本改变时,复核者才能知道原运行采用什么。

随机分析保存随机算法实现、种子与并行设置。种子相同在不同算法、库或硬件上不一定产生逐字节相同结果,因此还要说明允许的数值误差和比较方法。

研究资料包能够解压,为什么仍不等于别人可以复核结果 配图 2
研究资料包能够解压,为什么仍不等于别人可以复核结果 配图 2

筛选、排除和人工判断也必须记录。CSV可能已经删除异常值,但如果原始输入和排除表不在包内,读者无法知道哪些观察被移除或为何移除。

FAIR把详细来源、清楚许可与领域标准列为资料可再利用条件。能下载和能运行不表示允许再分发,也不表示资料适合新的研究问题;许可与适用边界要跟对象一起交付。

在空目录做真正的接收测试

接收者创建空目录或新容器,不读取作者用户目录。先验证manifest,再按README建立环境,用记录的单一入口命令运行。任何手工补文件、修改路径或猜参数,都写入差异日志。

接收端在空目录按锁定环境运行,保存命令、日志、输出哈希、差异和无法复核的步骤。文件可打开验证格式可读,洁净环境重跑验证记录是否足以重新产生关键结果。

输出比较分层:表格检查行列、类型和关键值;数值结果按预先声明容差比较;图表比较其基础数据与绘图参数,不只做像素截图相似度。完全一致不是所有研究的合理要求,但允许差异必须事先定义。

若运行失败,先分类为缺对象、环境无法建立、参数不明、运行错误、输出差异或来源断链。分类后才能决定补交文件、修订说明还是质疑方法。

执行回执说明复核到哪里

回执记录package ID、验证时间、接收者、平台、manifest状态、环境构建、运行命令、退出码、关键输出比较和例外。补交资料后产生新回执,不覆盖第一次失败。

相同输出证明计算路径可重复,方法学复核才评价设计、偏差与结论。重跑得到同一张图,仍可能共同复现了错误筛选、不合适模型或有偏输入。

资料包valid、脚本运行成功或图表一致,都不能证明输入数据完整代表研究对象或统计推断正确。执行复核的价值是让方法讨论建立在固定版本、完整文件和可追查运行之上。

若资料包只供阅读,作者可以明确标为“参考材料,不含可执行复现环境”。诚实限定比用“可复现”包装一组能打开的附件更有用。

交付前做四种失败演练

作者在发布资料包前复制一份测试包,依次制造四种小故障。先删除一个被脚本读取的CSV,确认manifest差集与运行日志都会指出缺对象;再修改一个输入值,确认哈希变化与输出差异能被连接起来。

第三次移除环境锁中的一个依赖,观察安装步骤是否会静默采用其他版本。第四次更改随机种子或排除规则,确认回执能显示参数改变,而不是把新输出误认成相同运行。

研究资料包能够解压,为什么仍不等于别人可以复核结果 配图 3
研究资料包能够解压,为什么仍不等于别人可以复核结果 配图 3

因为这四类失败分别发生在对象、字节、环境和决策层,单一“运行失败”不足以指导修复。测试结果列出预期故障、实际检测点、错误信息和补救动作。若某个故障没有被发现,就先补清单或日志,再发布资料包。

最小目录让接收者不必猜入口

根目录放机器可读manifest和给人的README。data目录分raw、intermediate和analysis-ready;code目录保存脚本与版本;environment目录保存锁文件或容器说明;config目录保存参数;results目录保存预期关键输出;provenance目录保存运行与排除记录。

README只承担导航,不重复所有证据。它写明package ID、具体版本、许可、单一入口命令、预计资源、预期输出和已知限制。机器可读文件保存对象ID、哈希、输入输出关系与参数,避免一段散文同时充当说明、清单和执行记录。

入口命令先检查manifest,再建立或核对环境,随后运行分析,最后生成执行回执。任何一步失败都停止,不自动下载未登记资料或改写原始输入。需要联网取得公开依赖时,记录URL、版本和哈希,并允许接收者预先缓存。

无法逐字节一致时先定义比较规则

浮点计算、并行排序、随机算法和绘图库版本可能让文件哈希不同,却仍得到数值等价结果。作者在运行前定义比较层级:哪些输出必须逐字节一致,哪些表格按键排序后比较,哪些数值允许绝对或相对误差,哪些图只比较基础数据。

容差不能在看到差异后临时放宽。它应来自数值方法、测量精度或业务用途,并写入配置。接收回执同时保存实际差值和判定阈值,让后来者判断“通过”如何得出。

如果输出只在GPU与CPU之间出现差异,记录硬件、库和算法路径,再判断是否落在预定边界。若没有预定边界,就写成“可运行但输出一致性未验证”,不要为了完成任务改称完全复现。

缺少原始数据时限定复核层级

有些资料因隐私、许可或体积不能公开原始输入。此时资料包仍可提供字段说明、生成过程、合成样本、环境、脚本和聚合结果,但必须说明接收者只能复核代码执行或结果格式,不能独立重建原分析数据。

受限数据可通过受控环境让授权复核者运行,并发布不泄露内容的回执。回执说明验证了哪个版本、哪些步骤、哪些输出与误差,不用“第三方验证”掩盖未公开范围。

把复核层级写成可读格式:对象完整性、环境可建、代码可运行、关键输出一致、方法学已审查。某一层通过不会自动带动后一层通过,也不会因原始数据受限而把前面已经完成的证据作废。

资料来源

  • DataCite:《Versioning》,发布或更新于 2020-04-06
  • Zenodo / CERN:《What is DOI versioning?》,发布或更新于 2026-04-11
  • RFC Editor / BagIt authors:《The BagIt File Packaging Format (V1.0)》,发布或更新于 2018-10-01
  • Scientific Data / FAIR原则作者组:《The FAIR Guiding Principles for scientific data management and stewardship》,发布或更新于 2016-03-15
  • World Wide Web Consortium:《PROV-O: The PROV Ontology》,发布或更新于 2013-04-30