2. 注释质量评估指标:完整性、一致性、准确性

这一章咱们聊聊评估注释质量的三个核心指标。说白了,就是回答三个问题:全不全、乱不乱、准不准。我最早做质控的时候,经常把这三个混在一起谈,后来踩了几次坑才发现——每个指标都对应不同的检查手段和修复策略。

我习惯把这套评估体系画成一个三角关系,你一看就明白了:

注释质量评估三角 完整性 一致性 准确性 三者相互印证 完整性查缺失 → 一致性查混乱 → 准确性查错误

2.1 完整性:你到底漏了多少东西

完整性是什么意思?该有的都得有。一个完整的注释文件,应该覆盖参考基因组上所有已知的基因区域。我曾经处理过一个水稻的注释文件,看上去挺漂亮,结果一比对参考序列,染色体末尾Z字区居然少了整整23个基因。为什么会这样?

检查完整性,我通常分三步走:

  1. 基因计数对比:用同一个参考基因组的不同注释版本做对比
  2. BUSCO评估:基于直系同源基因库看覆盖度
  3. 转录组映射验证:把RNA-seq读段贴回去,看多少reads落在注释区域外

我记得有一次帮同事检查人类基因组注释,他们用的Ensembl release 105和RefSeq的差异,光蛋白编码基因数量就差出三百多个。这时就得看哪些基因在Ensembl里有,RefSeq里没有。你想想看,如果你做的是疾病位点分析,漏掉一个关键基因可能整个结论都得推翻。

实际检查时,我常用这么一段组合命令:

# 统计每个染色体上的基因数量
awk '$3=="gene"' your_annotation.gtf | \
  cut -f1 | sort | uniq -c | sort -k1 -rn

# 用GFFRead提取基因ID列表
gffread -T your_annotation.gtf \
  -g reference.fa \
  --ids-only | wc -l
一个小技巧: 完整性检查不要太依赖单一数据库。我习惯把Ensembl、RefSeq、GENCODE三家的注释同时导进来做交叉比对。如果某个基因只在两个库里出现,它仍然可能是真的。如果只有一个库有,那就要重点怀疑。

2.2 一致性:别让你的注释自己打自己

一致性,通俗点说就是不能前后矛盾。同一套注释文件里,基因ID、转录本ID、外显子格式这些必须统一。我见过最离谱的一个案例——同一个基因,在GFF的gene行里写的是"gene:ENSG000001", transcript行里却变成了"transcript:ENST000004",前缀格式不一致,下游分析工具直接报错。

常见的几类一致性问题:

问题类型 具体表现
ID格式冲突 同一基因在不同行用不同前缀(gene: vs GENE:)
父子关系断裂 exon的parent ID引用了不存在的transcript
相位不连续 CDS的frame 0、1、2在跨外显子时跳变
坐标矛盾 exon的起止范围超出了transcript范围

我团队里新人经常问我:为什么相位这么重要?我给他们举过一个例子——你写了一个CDS,第一个外显子frame是0,第二个外显子frame是1,第三个又变回0。翻译出来的氨基酸序列没有一个是对的。这就是一致性被破坏的后果。

我自己写了一个小脚本专门做一致性检查,放到CI流程里每天跑一次:

# 一致性检查片段(Python风格伪代码)
for line in gtf_lines:
    if line.type == "exon":
        parent = line.attributes["parent_id"]
        if parent not in all_transcript_ids:
            report_error(f"孤儿外显子: {line.id}, 父级不存在")
    if line.type == "CDS" and last_cds is not None:
        expected_frame = (last_cds.end_pos % 3) 
        if line.frame != expected_frame:
            report_warning(f"相位异常: {line.id}")
避坑指南: 我曾经处理过一个六倍体小麦的注释文件,一致性检查跑出来三千多个孤儿外显子。后来定位到原因——转录本行因为ID长度超过了GFF规范(255字符)被截断,导致外显子的parent引用全部失效。所以注意,不同软件对ID长度的上限要求可能不一样,一定要先看你的工具文档。

2.3 准确性:错误比缺失更可怕

准确性是三个指标里最难保证的。注释错了但看着像对的,比干脆缺失更危险。缺失最多是漏信息,错误可能导致你得出一个漂亮的、但完全错误的结论。

常见的准确性缺陷包括:

  • 外显子边界偏移:剪接位点预测偏差,导致exon边界与实际转录产物不匹配
  • CDS预测错误:起始密码子或终止密码子定位不准
  • UTR边界猜测:没有实验数据支撑,纯靠算法推断
  • 基因融合误判:把相邻基因合并成单个融合基因

我记得有一个经典案例——在果蝇的注释里,一个叫eyeless的基因被注释成只有两个外显子。但后来通过PacBio全长转录组测序发现,其实还有一个很短的第三个外显子,之前因为长度低于默认阈值被过滤掉了。这个外显子刚好编码了蛋白的关键结构域。你看,一个阈值就导致注释不准确。

验证准确性,我现在用两种数据交叉:

# 用Cuffcompare验证注释准确性
cuffcompare -r reference_annotation.gtf \
  -s genome.fasta \
  -o cuffcmp_output \
  your_new_annotation.gtf

这个命令会输出三类结果:匹配参考的("=")、兼容的("c")、新的("j"和"n")。我重点关注那些不匹配的,看一下是注释对还是参考对。

一句话总结三个指标:

  • 完整性回答「有没有」—— 缺的是不是关键基因
  • 一致性回答「乱不乱」—— 格式和关系是否自洽
  • 准确性回答「对不对」—— 位点和结构是否与实际一致

在实际项目中,这三个指标不是孤立的。我当时在做一个真菌的denovo注释,完整性检查发现少了5号染色体上所有tRNA注释。查一致性发现缺失是因为tRNA的ID格式和基因模型不统一,导致合并时被跳过。最后做准确性验证,发现实际上tRNA的坐标预测也偏差了十几个碱基。你看,三个问题往往会连锁反应。

所以我的建议是:先做完整性粗筛,再做一致性格式检查,最后用实验数据验证准确性。三层过滤下来,注释质量基本能到可交付水平。