2. 注释质量评估指标:完整性、一致性、准确性
这一章咱们聊聊评估注释质量的三个核心指标。说白了,就是回答三个问题:全不全、乱不乱、准不准。我最早做质控的时候,经常把这三个混在一起谈,后来踩了几次坑才发现——每个指标都对应不同的检查手段和修复策略。
我习惯把这套评估体系画成一个三角关系,你一看就明白了:
2.1 完整性:你到底漏了多少东西
完整性是什么意思?该有的都得有。一个完整的注释文件,应该覆盖参考基因组上所有已知的基因区域。我曾经处理过一个水稻的注释文件,看上去挺漂亮,结果一比对参考序列,染色体末尾Z字区居然少了整整23个基因。为什么会这样?
检查完整性,我通常分三步走:
- 基因计数对比:用同一个参考基因组的不同注释版本做对比
- BUSCO评估:基于直系同源基因库看覆盖度
- 转录组映射验证:把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
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}")
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的坐标预测也偏差了十几个碱基。你看,三个问题往往会连锁反应。
所以我的建议是:先做完整性粗筛,再做一致性格式检查,最后用实验数据验证准确性。三层过滤下来,注释质量基本能到可交付水平。