1. 数据完整性概述

我做生物信息学这行快十年了。刚入行那会儿,大家最关心的是算法跑得快不快,结果好不好看。数据完整性?说实话,很少有人提。直到有一次,我帮一家药厂做RNA-seq流程审计,对方QA问:“你怎么证明你的比对参数没改过?”我愣了一下——我确实改过,但改完没留记录。嗯,从那以后,我算是彻底明白了,数据完整性不是空话,它是生信流程的命根子。

数据完整性,定义很简单:数据在整个生命周期里是完整、一致、准确的。但在生信里,这个“生命周期”特别长——从原始测序数据、比对、定量到统计报告,每一步都可能有丢数据、改参数、被覆盖的风险。你想想看,一个样本的原始fastq动辄几十GB,中间产生的临时文件、日志、配置文件成千上万。没有一套原则来管,审计的时候你连自己跑过啥都说不清。

那这套原则是什么?就是ALCOA。它最早是1990年代美国FDA在《数据完整性指南》里提出的,本来针对的是制药行业的手写记录和电子记录。后来21 CFR Part 11把电子记录也纳入了,ALCOA就变成了数据合规的“铁三角”之一。我们生信人虽然不直接造药,但分析结果会用在临床诊断、药物审批上,所以必须遵守同样的规矩。

ALCOA五个字母到底代表什么?

每个字母背后是硬核要求。别觉得它只是概念,每条都能直接落地到你的pipeline里。

  • A – Attributable(可归属):每一步操作是谁做的?哪台服务器?什么账号?生信里就是记录谁登录了、跑了什么命令、用了哪个版本的软件。
  • L – Legible(清晰可辨):数据要能看懂。是文本别用二进制缩写,是表格别用乱码。我曾经见过一个同事拿Excel存的质控结果,编码是UTF-16,结果换了台机器就变成“口口口”。
  • C – Contemporaneous(同步记录):事情发生的时候就要记,不能事后补。比如跑比对的时候,日志应该实时写入,不能等跑完了再手动写一个“我当时用了STAR 2.7.9”。
  • O – Original(原始记录):保持原始数据不被修改。fastq文件算原始,比对后的bam算派生。你绝不能直接在原始fastq里改碱基质量,要留备份。
  • A – Accurate(准确):数据自身没有错误,并且记录与实际操作一致。比如你在pipeline里设了 —outFilterMismatchNmax 2,那日志里必须也显示这个值,不能口头上说“我用了默认值”。
个人习惯:每次做新项目,我会先在项目根目录下放一个 metadata/ 文件夹,里面塞入 run_log.txt、software_versions.txt、parameter_changes.csv。跑完一个步骤就往里追加一条。这样后续审计时,谁来了都得服气。

为什么生信特别需要ALCOA?

传统制药实验室的记录是纸质的,签个字、贴个标签就行。我们搞生信的,数据全是电子文件,动辄上万个。你没法靠人工去核验每个文件是否被篡改。而且生信流程高度自动化,经常用脚本批量处理,一旦脚本里有bug或者某个参数改错了,可能几千个样本的数据同时出问题。如果没有同步记录,你根本追不回当时的状态。

我讲个真事。我前同事做肿瘤突变检测的pipeline,为了加速把 --cpus 4 改成了 --cpus 32,结果某一步的并行写入冲突导致部分bam文件头损坏。他当时没留日志,过了两周才发现,但原始fastq早就删了,因为磁盘不够。最后整批样本只能重新测序——你说浪费了多少钱?如果当时有ALCOA里的同步记录和清晰可辨的日志,他能在跑完第一天就发现问题。

避坑指南:我曾经在搭建RNA-seq分析流程时,直接把所有临时文件放在 /tmp 下,以为系统会定期清理就行了。结果某天机房断电,重启后 /tmp 被清空,我跑了三天的定量结果全没了。而且因为没有同步记录,我根本不知道当时跑了哪些样本的哪一步。从此以后,我每步执行前都写一个 .log 文件,就算pipeline中途崩了,至少知道崩在哪。

ALCOA原则在生信中的体系框架

下面这张图能帮你快速建立整体认知。注意每个字母不是孤立的,它们共同支撑起“数据完整性”这个目标。你在实际工作中可能先关注A(归属),但慢慢地所有字母都会互相交叉。

ALCOA 数据完整性知识体系 数据完整性 A - 可归属 L - 清晰可辨 C - 同步记录 O - 原始记录 A - 准确 用户/服务/账号 操作时间戳 日志可读 / 编码标准 无二进制乱码 实时写入日志 禁止事后补录 保留原始fastq/bam 派生数据可追溯 参数与实际一致 版本锁定 生信中的典型应用场景 • 每个pipeline步骤记录执行用户、命令、版本和时间 • 使用Git / Makefile / CWL / Nextflow 实现可重复性 • 审计日志(Linux auditd / 容器日志)确保同步记录 参考:FDA 21 CFR Part 11 / OECD GLP / 数据完整性ALCOA+

一张表看懂传统记录 vs ALCOA合规记录

下面拿一个典型的BWA比对步骤来对比,你就能直观看到差别有多大。

维度 传统做法(不合规) ALCOA合规做法
归属 没有记录谁跑的 users: zhanghl@bio-server 记录在日志头部
清晰可辨 日志里混着控制字符 纯文本 + 固定分隔符,每行带时间戳
同步记录 跑完才手动写一个txt 每处理一个样本实时 append 到 run.log
原始记录 直接修改fastq文件名 保留原始fastq的md5sum,改名后存副本
准确 parameter.txt里写的是默认值,实际命令行用了自定义 命令行参数直接记录在日志中,并与实际输出校验

我每次做新pipeline,都会把上面这张表贴在项目文档首页。说白了,ALCOA不是让你多干活,而是让你少踩坑。你想想看,如果每个参数都留痕、每条命令都同步记录,后续审计或重复分析时,根本不用去猜“我当时是怎么跑的”。

注意:ALCOA本身并不能防止数据被故意篡改,它只是让篡改变得容易被发现。要真正保证数据完整性,还需要结合权限控制、加密校验和审计追踪。我在实践中会把ALCOA作为“第一道防线”,后面再叠加上文件完整性监控(如AIDE)和版本控制(Git)。