一、为什么要进行数据预处理?
- 软件分析失败,往往始于输入数据文件预处理
有的软件的整个 pipeline 对输入文件的格式要求非常严格:基因 ID 是否一致、CDS 是否符合阅读框、序列命名是否有特殊字符…… 任何一个细节不达标,后续的 其他分析流程都可能直接报错,而且报错信息有时候会很 "隐晦",让你半天找不到原因。
- 影响结果,造成极端值误差干扰
就算软件勉强跑通了,脏数据带来的影响更可怕。
举个例子,比如有天你需要绘制wgd的Ks 分布图,这时候你可能会遇到:长度过短的序列会产生不可靠的 Ks 值,包含终止密码子的序列会导致计算异常,冗余的可变剪接转录本会造成同源对重复计数…… 这些问题不会让程序崩溃,但会在你的 Ks 分布图上产生大量极端值和噪音,严重干扰古老 WGD 峰值的识别,甚至得出完全错误的进化结论。
二、处理基因序列时,需要注意哪些?
- 先读文档!搞清楚输入文件的格式要求
这是最容易被忽略但最重要的一步。
在动手处理序列之前,一定要先把 程序 的官方文档、README、帮助文件完整看一遍,重点确认:
输入文件格式:是 FASTA 还是其他格式?核酸还是蛋白?
基因 ID 规则:CDS 文件和蛋白文件的 ID 是否需要完全对应?是否允许有特殊字符(如下划线、点号、竖线)?
文件命名规范:物种缩写是否有要求?文件名会不会影响后续脚本的解析?
如果拿到序列直接上手筛,结果跑到一半才发现 ID 对不上,又得从头返工。
- 序列筛选:严格还是宽松,要看你的研究目的
清洗序列时常见的问题有:最短序列长度到底设多少 bp 合适?
这个没有标准答案,取决于你的研究对象和分析目的:
- 如果是做古老 WGD 检测(Ks 峰值通常在 0.1~3.0 之间),序列太短会导致同义替换数估计不稳定,建议设置相对严格的阈值,比如 CDS 最短 300bp(即 100 个氨基酸)
- 如果研究对象是近期分化的近缘物种,或者关注的是年轻的重复基因,可以适当放宽到 150bp 左右
- 同时也要注意去除过长的异常序列 —— 可能是基因预测错误或融合基因
- 根据序列性质,剔除有问题的基因序列
例如,在CDS 预处理的核心环节中,需要检查:
- 序列长度是否为 3 的倍数:CDS 编码氨基酸,长度必须是 3 的整数倍。如果不是,说明基因预测有问题或者序列截取错误,直接剔除。
- 是否以起始密码子开头、终止密码子结尾:很多 Ka/Ks 计算工具默认要求完整的编码区,缺少起始或终止密码子可能导致计算偏移。
- 是否包含内部终止密码子:一条 CDS 序列中间出现了终止密码子,有可能是假基因、移码突变或者基因预测错误
- 碱基组成是否正常:有没有大量的 N(模糊碱基)?有没有非 ATGC 的字符?这些都会影响密码子对齐的质量。
三、预处理后的基因序列,怎么检查?
- 肉眼检查:打开文件看看格式对不对
不要嫌麻烦,处理完先打开文件看几眼:
- FASTA 格式是否规范?标题行是不是以 > 开头?
- 序列是不是只有一行还是自动换行了?(虽然大多数软件都兼容,但统一格式更稳妥)
- ID 命名是否一致?有没有多余的空格或特殊字符?
- 用 seqkit 做整体统计
# 统计序列数量、平均长度、最短/最长
seqkit stats your_file.cds.fa
# 按长度排序,看看有没有极端短或极端长的序列
seqkit sort -l your_file.cds.fa | seqkit stats重点关注:
- 序列总数是否符合预期?
- 最短 / 最长序列是否在合理范围内?
- N50、平均长度是否符合该物种的 CDS 特征?
如果发现有几十 bp 的超短序列或者几万 bp 的超长序列,就要回去检查筛选阈值是不是设得有问题。
- 写个小脚本,针对性检查
对于特定的研究需求,建议自己写个简单的脚本做定制化检查