核心结论
AI 能帮助起草清洗规则、代码和异常清单,但科研数据不能以“表格看起来整齐”为完成标准。每个分析值都应能返回只读原始记录、变量定义和一次明确的处理;任何删除、替换和派生都由可重跑脚本执行,并留下为什么这样做的记录。
因此,最重要的产物不是一份“清洗后的 Excel”,而是一条持续更新的清洗记录。它把原值、规则依据、脚本输出、人工决定和受影响的分析放在一起。模型可以先标疑点,没有来源和负责人确认的更正不能进入分析数据。
三张随访表,整齐之前先要知道每列是什么
下面是一套教学数据:基线、三个月和六个月三张随访表。参与者编号格式不一,体重同时出现千克和磅,缺失值混用 -9、999 和空白,部分日期还落在计划访视窗口之外。
团队先把原始文件设为只读,再在数据字典中确认几个会影响处理的定义:参与者编号是 P 加六位数字,不能数值化后丢掉前导零;三个月体重原始单位为磅;-9、999 与空白在指定变量中表示缺失;每周活动分钟的极大值只触发核对,不自动删除。
AI 根据这些定义起草脚本,输出到新的处理层。原始层没有被覆盖,分析层也尚未生成,因为异常和合并问题还需要决定。把三层分开不是文件命名习惯,而是确保团队能够重建“原来是什么、代码做了什么、分析最终用了什么”。
一条记录把规则、输出和人工判断连起来
团队使用同一份清洗记录管理已执行转换和待判断问题:
| 编号与原始输入 | 规则及依据 | AI/脚本第一次输出 | 人工核验与当前状态 |
|---|---|---|---|
C-014:m03 weight_lb | 按固定系数换算;保留原字段;数据字典 1.2 | 新建 weight_kg | 测试通过,数据负责人确认;不重复转换已为千克的字段 |
C-015:participant_id=00125 | 按主索引规范补前缀并保留前导零 | P000125 | 与批准的标识映射核对通过 |
C-016:activity_min=4200 | 超过质量检查阈值时只标记 | AI 建议改为 420,理由是“疑似多输一个零” | 拒绝更正;保留 4200,新增 flag_activity_range=1,等待源记录核查 |
| C-017:访视日期早于基线 | 时间顺序不成立 | 交换两次日期以恢复顺序 | 拒绝自动交换;原值不动,暂停该参与者的纵向派生变量 |
| C-018:活动分钟为空,状态为未测量 | 缺失状态按原状态字段映射 | activity_min=0 | 改为缺失并保存 not_measured;回查同类记录 |
C-016 展示了异常值最危险的处理方式。4200 可能是录入错误,也可能来自问卷口径或真实极端活动。模型根据常见范围把它改成 420,看起来更合理,却没有任何源记录依据。团队先保留原值和位置,查看问卷定义、录入备注与源材料,再由数据负责人决定更正、保留、设为缺失或纳入敏感性分析。
原始记录
participant_id = P000418
visit = m06
activity_min = 4200
AI 候选更正
activity_min = 420
reason = probable extra zero
人工决定
原值保持 4200;只新增范围标记;
在源记录核验完成前,不进入自动更正。
模型的候选更正和已经批准的变化不能混在同一状态。否则下一位分析者看到 420,会误以为它来自原始问卷或正式决定,而不知道只是一次猜测。
源记录核查也有顺序。数据负责人先看电子采集系统中该题的原始响应和单位,再看同一次访视的备注;需要联系研究现场时,只发送核查编号和必要字段,不把整份参与者记录复制到聊天工具。若原始响应确为 4200、备注又没有更正依据,数值继续保留并在分析中评估其影响。若现场能提供带日期的正式更正,则清洗记录新增一行,不能直接把旧行改成“原本就是 420”。
团队用两份输出检验这项决定。第一份保留该值,第二份按预先说明排除被标记的极端记录,比较关键描述和模型估计。两份结果若不同,论文需要报告这种敏感性,而不是挑更好看的版本。AI 可以运行两套代码和列出差异,是否构成数据质量问题及怎样解释,仍由研究团队决定。
缺失、零和无法解析要分开
C-018 的错误与异常值不同。零表示实际观察到没有活动,“未测量”表示这次没有得到数值。两者进入均值、分布和模型时含义不同,不能为了生成完整数据集而合并。
重要变量除数值字段外,还可以保留缺失原因:未测、拒答、系统失败、不适用或失访。团队先描述各时点和组别的缺失,再由统计负责人根据分析目的、变量关系和缺失机制决定是否插补。AI 可以起草汇总和插补代码,不得默认用均值、零或模型预测填满。
解析失败也不是“原文缺失”。某个文件打不开或列名错位时,处理记录写明当前技术失败,转人工或修复输入;不能把这批值直接标成参与者未测。数据状态与工具状态分开,后续才知道该联系谁、重跑什么。
合并以后多出二十七行,流程必须停下
三个随访文件在合并前共有 1120 行,脚本合并后得到 1147 行。程序没有报错,变量也都在,行数却出现无法解释的增长。团队暂停派生纵向变量,先检查参与者与访视组合是否唯一。
问题来自一次一对多连接:其中一个映射表为若干访视保留了两条记录。它们可能是重复录入,也可能是合法的重复测量,不能由脚本默认保留第一条。团队列出涉及的编号、来源表和字段差异,由数据负责人决定怎样表示,之后重新运行合并并对账。
合并检查不只看总行数。每个时点的参与者数、唯一键、未匹配记录、类别频数、缺失分布和数值范围都与合并前比较。原始记录数应能与保留、排除和待判断三类之和对应;任何差值都能找到一条代码规则和清洗记录。
这次排查发现,27 条新增记录并非随机分布,而是全部来自三个月访视。其中 19 条在映射表中同时有“完成”和“补录”两种状态,另外 8 条的访视编号重复但采集时间不同。前一种可按经确认的状态优先级处理,后一种可能是真实的重复测量,需要项目人员指定使用哪一次或怎样表示。团队没有写一条笼统的 drop_duplicates(keep='first'),因为“第一条”只是文件顺序,不是科学规则。
处理完成后,对账表显示:1120 条原始访视记录、14 条经确认的重复录入不进入分析、3 条仍待现场核查,其余形成分析层。这里的数字只是本次版本的执行结果;下一版若源记录有正式更正,对账数字随版本更新。正文报告的是最终纳入流程,清洗记录保留每一步的依据。
模糊匹配姓名、日期或自由文本会带来错配与隐私风险。真实研究使用项目批准的标识映射和安全环境,AI 不接触完成任务不需要的身份字段。匹配规则不清时,宁可保留未匹配状态,也不生成一个看似完整的纵向人。
测试锁住的是数据含义,不只是代码语法
单位转换先在人工构造的小表运行:正常磅值应得到预期千克值,空白保持缺失,负值触发错误,已经是千克的字段不能再次转换。参与者编号测试覆盖前导零、缺失和不合法格式;日期测试覆盖边界与时间顺序。
AI 生成代码后,团队比较预期输出与实际输出。代码运行成功只表示语法可执行。若 150 磅被转换两次,程序仍可能顺利完成,却让体重变成错误数值。规则改变后,所有测试重新运行,依赖该规则的正式数据重新生成。
程序化断言也放进流程:主键必须唯一;访视只能来自允许集合;每个派生变量都有输入字段;脚本用相同输入运行两次应得到相同校验结果。断言由 AI 起草时,负责人检查它是否真正覆盖数据字典,而不是只检查表格非空。
派生变量同样登记。例如“随访天数”由实际访视日期减去基线日期得到,“体重变化”由已统一为千克的当前值减去基线值得到。记录中写清输入字段、公式、适用人群和缺失传播规则。某位参与者缺少基线体重时,变化值保持缺失,不能让模型拿同组均值补出一个基线再计算。抽查时,负责人手算几个正常、缺失和边界案例,与脚本结果逐一比较。
NIH 数据管理与共享政策把良好数据管理与严谨性、验证和隐私保护联系起来;FAIR 原则强调数据与元数据的可发现、可访问、可互操作和可复用。可访问不等于公开所有参与者数据,受限材料仍按授权控制。对本案例,数据字典、脚本、版本和来源记录使处理可以理解和重建。
冻结分析版本以前,再从原始文件重跑一次
待判断记录处理完后,团队从只读原始文件和指定脚本生成一个新的分析版本。版本记录输入文件校验值、数据字典、脚本、运行环境和日期。另一名成员按相同材料重跑,核对行数、缺失分布与关键派生值。
冻结并不表示以后不能更正,而是每次更正都产生新版本。若 C-016 最终通过源记录确认应为 420,团队更新依据,重跑处理和分析,并找到所有依赖活动分钟的表、图和正文。旧版本保留,结果是否变化也记录下来。
数据负责人确认变量定义与待判断清单,统计负责人确认单位、编码和分析结构,项目负责人确认访问与共享范围。三方完成相应检查后,这一版本才标为可分析。AI 不能把聊天中临时生成的表格自动升级为正式数据集。
这套随访数据最终留下的不是一张“无空白、无异常”的漂亮表,而是每个值都有来源、每次变化有理由、任何版本都能由脚本重新得到的数据。分析从这一版本开始;模型选择和统计解释,交给下一步的分析流程。