基因结构预测评估:外显子/内含子准确性、CDS完整性、起始/终止密码子

这章聊的东西,是基因注释评估里最“硬”的一块。说白了,你预测出来的基因,到底像不像个真家伙?我们得拆开看——外显子边界对不对,内含子切得准不准,编码区有没有断,起始和终止密码子是不是在正确的位置上。

我在实际项目中见过太多案例了。有些软件跑出来看着很漂亮,一堆基因注释,一检查边界全偏了。嗯,今天就把这几个关键点的评估方法捋清楚。

外显子/内含子准确性——边界就是命

先说说外显子的评估。外显子准确不准确,核心看两条:

  • 一级准确率:预测的外显子跟真实外显子是否能完全匹配
  • 二级准确率:边界重叠但允许小幅偏差

我个人习惯用 gffcompare 做评估,它会自动算出精确率、召回率和F1值。举个例子:

# 假设你有一个参考注释集 reference.gtf 和预测结果 prediction.gtf
gffcompare -r reference.gtf -o compare_out prediction.gtf
# 输出文件 compare_out.stats 会给出 exon level 的评估指标
cat compare_out.stats | grep "Exon"

输出里你会看到类似这样的内容:

# Exon level
Precision  0.923
Recall     0.891
F1         0.907

0.907的F1值算不错了。但我得提醒你——光看这个数字不够。你得仔细看看那些未匹配上的外显子到底长什么样。

我曾经接手过一个植物基因组的注释评估项目,F1值看着0.88,但一查才发现,那些假阳性外显子基本都是预测软件把重复区域的转座子元素当成了真实外显子。这就是典型的“准但不真”——统计指标漂亮,生物学意义全错。

一个实用技巧:评估时最好把外显子按“单外显子基因”和“多外显子基因”分开看。前者命中率通常偏低,因为短序列信息量不够。

CDS完整性——编码区不能断

外显子边界对了,不代表编码区就完整。你想想看,一个基因预测出来,外显子坐标都对,但CDS中间有终止密码子,或者阅读框移了位——这就是个大问题了。

CDS完整性评估我通常做以下几个检查:

  1. 是否被内部终止密码子打断:真核生物基因不应该有
  2. 是否为3的倍数:编码区长度必须是3的整数倍
  3. 起始和终止密码子是否都存在:缺一个就是半成品

我自己写了个小脚本,专门用来扫描预测CDS序列:

#!/usr/bin/env python3
def check_cds_integrity(cds_seq):
    # 检查长度是否为3的倍数
    if len(cds_seq) % 3 != 0:
        return "FAIL: CDS length not multiple of 3"
    # 检查起始密码子
    if cds_seq[:3].upper() not in ['ATG', 'GTG', 'TTG']:
        return "FAIL: no valid start codon"
    # 检查内部终止密码子
    stop_codons = ['TAA', 'TAG', 'TGA']
    for i in range(3, len(cds_seq)-3, 3):
        if cds_seq[i:i+3].upper() in stop_codons:
            return "FAIL: internal stop codon at position " + str(i+1)
    # 检查终止密码子
    if cds_seq[-3:].upper() not in stop_codons:
        return "FAIL: no stop codon at end"
    return "PASS: CDS intact"

# 使用示例
cds = "ATGGCTAGCTGA"
print(check_cds_integrity(cds))

踩过的坑:有些预测软件会在内含子区域悄悄插入一些碱基,导致CDS长度变成非3的倍数。我遇到过两次了,每次都是靠这个脚本揪出来的。所以别只盯着边界准确率看,序列层面的验证也很重要。

起始/终止密码子——定位验证的最后一关

起始和终止密码子的评估,我把它看成基因注释的“守门员”。你想想看,如果连起始密码子都找不准,后面的分析还怎么站得住脚?

常见的起始密码子有这些:

密码子 优先性 适用情况
ATG 极高 几乎所有真核生物
GTG 低 某些原核生物非标准起始
TTG 极低 罕见替代起始

评估时,我会做两件事:

  • 定量检查:统计预测到的起始/终止密码子位置,看是否跟参考注释一致
  • 定性检查:验证密码子上下游的序列特征(Kozak序列等)

来看个具体的验证脚本片段:

#!/bin/bash
# 提取预测基因的起始密码子上下游 50bp
awk '$3 == "start_codon" {print $1, $4-50, $4+50}' prediction.gtf > start_flanks.bed
# 跟参考注释比较
bedtools intersect -a start_flanks.bed -b reference_start.bed -f 0.5 | wc -l

这个做法可以用来快速评估起始密码子的定位精度。如果大部分预测起始位置跟参考重叠,那么定位是可靠的。

总结一下我的核心评估流程:先看外显子级别的指标,再看CDS完整性,最后验证起始/终止密码子。这三个层次下来,一个预测基因的质量心里基本就有数了。记住一点——指标是参考,生物学合理性才是最终标准。

基因结构预测评估流程 参考注释 + 预测注释 外显子/内含子准确性 CDS 完整性检查 起始/终止密码子验证 综合评估报告 检查项: ▸ 精确率/召回率/F1 ▸ 边界偏移统计 ▸ 假阳性外显子分析 检查项: ▸ 内部终止密码子 ▸ 长度3的倍数 ▸ 起止密码子存在性 检查项: ▸ 密码子类型匹配 ▸ 上下游序列特征

一个小技巧:如果项目里有RNA-seq数据,我会把预测的外显子边界跟剪切位点比对。真正的外显子边界应该跟reads的剪切信号一致。这个验证比单纯看统计指标要可靠得多。

千万别犯这个错:只盯着一个指标看。我见过有人只看F1值就觉得注释质量好了,结果CDS全是一半残缺的。记住,要三条腿走路——准确性、完整性、密码子,哪个都不能少。