核心结论

数据采集工具不是把研究问题改写成一排输入框。真正能合并、追查的数据,每个字段都要说明从哪里来、填什么类型和单位、哪些值允许出现、空白是什么意思,以及填错以后怎样改。

质量控制也不能等数据收完才开始。等 1,200 行已经回到分析人员手里,再发现六座城市对“份量”的理解不同,很多错误已经无法恢复。正式采集前的小规模试填、调查员培训、采集中监测和修改留痕,都是研究设计的一部分;这种小规模试填后文会简称为预测试。

下面仍以虚拟早餐研究为例。文中展示的是核心字段,不是完整数据字典;模拟数据只用于教学,不含现实店铺或个人资料。

六座城市都填了“份量”,合并以后却不是一回事

假设现场表里只有一列叫“份量”。海川的调查员填整份早餐的总克数,锦城按油条、豆浆、鸡蛋分别填,江州有人写“1 碗”,临安遇到店家不称重便空着。每个人都认真完成了表格,导出的单元格也没有损坏,可这些值不能直接放在同一列比较。

问题不在调查员粗心,而在工具没有说明“份量”究竟指什么。表单负责把数据录进系统;操作手册负责解释现场遇到具体情况怎样判断;数据字典则为每个字段规定名称、含义、类型、单位、允许值、缺失规则和来源。三样材料少一项,团队就会靠口头理解补空白。

同样的问题也会出现在简单的 0 和 1。has_vegetable = 0 应当表示调查员确认组合里没有符合定义的蔬菜,不是“我没看清配料”。如果把不知道也填成 0,软件会把信息不足当成真实的没有,后面的关联模型无法分辨。

所以采集设计的目标不是“所有格子都有值”,而是每个值都知道自己代表什么。合理的空白比编出来的完整数据更有用。

数据字典要能在现场回答“这一格到底怎么填”

下面截取几项核心字段。完整字典还应记录字典版本、创建时间、字段负责人、编码依据和修改历史。

字段角色与含义类型、单位与允许值空白及来源规则
combo_id原始标识;一份早餐组合的唯一编号文本;格式如 C1-S03-B2;全库不可重复不允许空;由系统生成,不手写
shop_id原始标识;组合所属店铺文本;必须能在店铺表中找到不允许空;从抽样名单带入
store_type原始分类;店铺层只能从四个固定选项中选择:早餐摊点、独立门店、连锁门店、食堂窗口不允许自造第五种写法;现场核对
price_cny原始观察;整份组合售价数值,元,保留两位小数;不得为负未标价且无法确认时记缺失并写原因,不能填 0
protein_g估算或参照测量得到的整份蛋白质数值,克,保留一位小数必须带来源;未知不是 0
has_vegetable按手册编码的食物标记整数;0=确认无,1=确认有无法判断记缺失,并进入问题清单
portion_measured份量是否现场实测整数;0=未实测,1=实测与份量来源联动;不是质量总评分
recipe_estimated配方是否依靠参照估算整数;0=有直接依据,1=依靠估算即使营养值不空也必须保留此标记
nutrition_score按冻结公式计算出来的总分整数;0—10现场不填;由五个分项重算
validation_subset是否进入额外参照测量的 120 份复核子样本整数;0=未进入,1=进入由随机抽取名单带入,调查员不能自行更换
reference_protein_g复核子样本的参照蛋白质数值,克,保留一位小数validation_subset=0 时为不适用,不计普通缺失

“不适用”和“漏填”尤其要分开。1,080 份非复核早餐本来就不应有参照蛋白质,它们的空白是研究设计造成的;若 120 份复核样本中有一份该字段为空,才是需要追查的缺失。两者都显示为空单元格,统计意义却完全不同。

现场原始记录、后来估算的数值和由公式计算的结果也要分开管理。价格来自现场观察,蛋白质可能由配方和份量估算,总分则由冻结公式计算。公式生成的字段出错时,应该修正代码并从原始数据重新计算,不要打开表格逐行手改总分。

模拟文件里还有一个 latent_pattern,表示生成虚拟早餐时使用的隐藏模式。真实调查员看不到它,它也不是研究采集变量。分析时若把这个只有数据生成者才知道的“出题答案”放进模型,相当于提前把答案透露给计算过程。研究方法把这种错误叫作信息泄漏。因此,正式分析库要排除这一列,同时在模拟说明中保留它的来源。

NIH 数据管理与共享网站面向受其政策约束的科研项目,具体要求不必原样套到所有研究上;但它强调从计划阶段考虑数据、相关文档、保存和共享,正好说明数据字典不应在投稿前临时补写。

表单可以拦住低级错误,不能替现场猜事实

电子表单应当自动带入 shop_id 和城市,检查 combo_id 是否重复,只在进入复核子样本时显示参照测量字段。价格输入负数可以直接拒绝,店铺类型只能从冻结选项中选择。每次提交还应保存调查员编号、设备时间和同步时间。

营养数值更适合设置警告,而不是轻易设置绝对拦截。若有人输入蛋白质 140 克,系统可以提示“是否把 14.0 误写成 140”,要求重新核对单位和来源;但一份真实的大组合也可能确实很高。未经确认自动改成 14 克,会把一个可见异常变成无痕猜测。

AI 的角色也应停在这里。它可以每天列出疑似单位错误、相互矛盾的字段和需要复核的照片,帮助质控员排优先级。它不能在店家没有配方时生成一个看起来合理的钠值,也不能根据早餐名称静默补齐蔬菜标记。AI 提出的每项修改,都要回到原始材料或人工确认,并留下理由。

逻辑校验比单列范围更有用。例如 portion_measured = 1 时应当存在称重记录;validation_subset = 1 时应有参照测量流程;nutrition_score 必须等于五个分项之和。校验发现矛盾时先挂起记录,不要为让表格“全绿”随便改一边。

表单还要允许现场写备注和上传证据。标准选项负责后续比较,备注与菜单照片负责处理标准选项装不下的边界情况。只留结构化字段,出现新型组合时无法知道调查员当时看到了什么;只留照片,1,200 份又无法稳定分析。两者承担不同工作。

正式开收以前,要先让边界案例把手册弄坏一次

预测试不只是确认按钮能点击。团队应从四类门店各取若干不同组合,让两名调查员独立记录,再比较食品分类、份量、价格和配方来源。豆沙包算不算明确蛋白质食物、咸豆花里的少量葱花是否算蔬菜、套餐可加购的鸡蛋是否属于原组合,这些争议会暴露操作定义的缺口。

遇到分歧,保留两人的原始判断、争议原因和最终决定,把新例子写进手册。然后再找一批记录测试修订后的规则,而不是在会议上觉得“大家都懂了”便结束。培训也要用这些真实边界案例,让调查员先作答、再讨论,单纯演示表单位置看不出理解差异。

正式采集后,质控人员每天查看关键字段缺失、范围警告、同一调查员的异常分布、同店组合重复和同步延迟。若某个城市突然有 80% 的份量未实测,应该在现场仍能补救时追问设备、流程或理解问题,而不是等所有城市结束后把该城删掉。

每日质控表至少应对上几组数:抽样名单有多少店,已经联系和完成多少;完成店铺理论上应有多少组合,数据库实际有多少唯一 combo_id;哪些关键字段为空,哪些记录触发逻辑警告;每名调查员的实测率和估算率落在哪里。数字对不上时先回到流转记录,不能把“理论应有 200 行”当成命令,复制几行把缺口补满。

调查员之间的差异也不是看到就判错。有人负责的区域可能恰好有更多摊点,配方估算率自然较高。质控员要先按城市和店铺类型比较,再抽查原始材料。若同类场景下仍有明显差异,才检查培训理解、设备或记录习惯。这样做比给所有人设一个统一“合格率”更接近数据产生的实际过程。

120 份复核子样本按第 6 篇冻结的随机名单执行。现场人员不能因为某份早餐难称、配方复杂就换成旁边容易测的一份;真无法完成时记录原因,再按预先的同层替补顺序处理。否则复核误差只代表“最容易测的早餐”。

改错没有问题,问题是旧值像从未存在过

现场或质控中发现错误,当然要改。每次修改至少保存原值、新值、修改时间、修改人、理由和证据链接。例如钠含量列 sodium_mg 从 720 改为 1,020,要能看到是店家补发了配方,还是单位换算错误。原始提交库保持只读,经过核查的修订进入清洁版本。

分析库也需要版本。冻结 v1.0 后发现一项确认错误,可以生成 v1.1,附变更清单,并重新运行所有派生计算。已经生成的旧结果不要被直接覆盖,否则论文中的表格无法对应当时使用的数据。冻结的意思是建立稳定参照,不是以后永远不许纠错。

版本文件还要和代码、字典放在同一份发布清单中。只有一张 final_final2.xlsx,没人知道它使用哪版评分;只有分析代码,没有当时的数据,也无法重建表格。冻结时可以为文件计算一个只要内容改变就会跟着改变的数字指纹,研究方法里常叫校验值。把它和生成时间、对应脚本版本一起记录,便能发现文件是否在传输或手工打开后被意外改变。

FAIR 原则强调数据及其说明信息应当可发现、可访问、可互操作、可重用;描述数据名称、来源、时间和版本的这些说明信息,常被统称为元数据。“可访问”不等于所有内容无条件公开。店铺的精确位置、联系人和未公开配方应放在受控映射表中;可共享的分析数据使用编码店铺号,并同时提供字典、计算规则、版本和访问条件。

当抽样流转、缺失原因、未解决警告、修改记录和数据版本都能交代清楚,分析库才算准备好。第 8 篇会真正打开这 1,200 行模拟数据。清洗的目标不是把它修成一张完美表,而是先弄清数据实际发生了什么,再决定每个问题怎样影响描述结果。