宏基因组分类表里,一个常见现象是某条读段在一个参考库中只能分到属,换一个库以后却能分到种。看到分类层级变细,需要继续检查匹配证据和候选集合,才能判断结果应该怎样解释。
本文实际编译 Kaiju 1.10.4,构造两个蛋白参考、八条核酸读段和一棵教学分类树,完成建索引、六组分类及属种层级汇总。所有序列和分类名称都是教学设计,目的是把翻译搜索、共享匹配和参数变化放到可以逐条核对的例子中。

蛋白层面的搜索能解决什么问题
Kaiju 使用蛋白参考库对宏基因组读段进行分类。核酸读段经过翻译后,可以依据氨基酸匹配获得分类支持。对于编码相同氨基酸、但使用不同密码子的核酸片段,这种搜索能够保留核酸字面差异背后的关联。Kaiju 官方说明
与此同时,蛋白序列在不同生物之间可能高度保守。一段氨基酸匹配足以支持较高层级的分类,却未必能够区分近缘物种。评价结果时,需要同时查看匹配长度、候选分类编号及它们在分类树中的关系。
实际项目还应先明确问题。希望了解广泛的分类组成,可以关注合适层级的汇总和未分类比例。希望确认某个近缘种,则应进一步检查多个区域的支持、参考之间的区分能力和其他证据。本次实验会展示,单条共享片段的分类结果可以随着数据库组成发生变化。
怎样构造一份能手工检查的输入
本次生成两个九十氨基酸长的蛋白。前四十五个位置各自独立生成,后四十五个位置完全相同。它们分别归属于教学种甲、教学种乙,两个种共享同一个教学属。
分类树中的编号只用于这个封闭的教学例子,没有对应真实物种的含义。蛋白标题采用程序支持的编号格式,分类树保存父子关系,名称文件保存显示名称,三者保持一致。
我们从两个蛋白中取出不同片段,再按指定密码子编码成八条核酸读段。甲的独有片段生成三种版本,分别采用初始密码子、同义密码子和初始序列的反向互补。另有乙的独有片段、两者共享片段、带一个氨基酸改变的甲片段、一个很短的甲片段及一条无关序列。
| 读段 | 设计内容 | 核酸长度 | 主要核对目标 |
|---|---|---|---|
| a_exact | 甲的前 40 个氨基酸 | 120 nt | 完全匹配 |
| a_synonymous | 同一蛋白片段换用同义密码子 | 120 nt | 翻译后的对应关系 |
| a_reverse_complement | 初始甲读段的反向互补 | 120 nt | 方向处理 |
| b_exact | 乙的前 40 个氨基酸 | 120 nt | 独立候选 |
| shared | 两个蛋白相同的后半段 | 135 nt | 共享匹配与分类层级 |
| one_aa_change | 甲片段中改变一个氨基酸 | 120 nt | 模式与门槛 |
| short_10aa | 甲的前 10 个氨基酸 | 30 nt | 长度不足 |
| unrelated | 独立生成的蛋白片段 | 120 nt | 无关输入 |
读段数量很小,因此可以为每一行输出找到明确的输入来源。固定随机种子后,下载包会重新生成相同序列,便于读者自行改变参考、匹配门槛或密码子方案。
安装、建库与第一次实际分类
本次固定作者仓库提交 570830d737ce41d233c6a1269a9bd46b6353bea1,按项目说明编译源代码。生成的程序报告版本为 1.10.4,二进制校验值保存在结果文件中。官方源码安装方法
蛋白库索引分两步构建,先生成变换与相关文件,再生成分类使用的索引。下面展示本次调用形式,其中字母表只包含二十种标准氨基酸。
kaiju-mkbwt -n 2 -l 1 \
-a ACDEFGHIKLMNPQRSTVWY \
-o both both.faa
kaiju-mkfmi both
本次第一次对极小的教学文件建索引时,程序提示序列分配空间不足。给建索引命令显式指定长度预算后,两个小索引均成功生成。这里的长度预算以百万字符为单位,不能把参数中的一直接理解为一个氨基酸。
这项经历提醒我们,报错需要结合输入规模和具体步骤理解。先看哪条命令失败、输入文件是否完整、参数含义是什么,再判断原因。本次处理方式只针对这个小文件实验,正式参考库应按实际序列量设置相应预算。
第一组使用两个蛋白参考,选择完全匹配模式,将最小匹配长度设为二十五。详细输出会保留匹配信息,便于逐条检查。
kaiju -t nodes.dmp -f both.fmi \
-i reads.fna -o mem25.out \
-a mem -m 25 -z 2 -v
核酸一致性只有约百分之六十八,为什么仍然匹配
甲的初始读段与同义密码子版本长度均为一百二十个碱基,逐位比较只有八十二个碱基相同,一致比例约为百分之六十八点三三。按设计翻译后,两条读段对应同一个四十氨基酸片段。
实际输出中,初始版本、同义版本和反向互补版本都被分到教学种甲。完全匹配模式的详细列均报告四十氨基酸的支持,与输入设计一致。
这个结果可以用来理解蛋白搜索的一个具体优势。核酸字面差异可能来自密码子变化,翻译之后仍然能够保留相同的蛋白片段。这里的一致比例是两条人为编码读段之间的比较值,不代表 Kaiju 在真实数据上存在某个通用的核酸识别下限。
迁移到实际读段时,还要考虑读长、编码区域比例、测序错误和参考覆盖。尤其是插入缺失可能改变翻译后的片段结构,本次仅测试了同义编码与一个氨基酸替换,其他错误形式需要另外设计对照。
共享片段为什么被归到属
共享读段对应四十五个氨基酸,在两个蛋白中都存在完全相同的匹配。详细输出列出了两个候选种的编号,最终分类编号则指向它们共同的属。
这条读段已经获得分类支持,只是支持范围无法细化到两个候选种中的某一个。第一组八条读段中,三条归到甲种,一条归到乙种,一条归到共同属,还有三条未分类。
我们进一步运行程序自带的汇总工具,分别生成种级和属级表格。这样可以看到同一批逐读段结果在两个层级中的不同表达。
kaiju2table -t nodes.dmp -n names.dmp \
-r species -o mem25-species.tsv mem25.out
kaiju2table -t nodes.dmp -n names.dmp \
-r genus -o mem25-genus.tsv mem25.out
种级表中,甲种占全部八条读段的百分之三十七点五,乙种占百分之十二点五。另有百分之十二点五已经分类,但无法分配到种级,还有百分之三十七点五未分类。
属级表中,前面五条已有分类支持的读段都汇总到同一属,占百分之六十二点五。这组结果说明,汇总表里“无法到达所选层级”和“完全未分类”对应不同情况,保留这两类记录有助于理解结果组成。
参考库缺少候选时,分类层级会发生什么变化
第三类对照保持读段、分类树和匹配参数不变,仅从蛋白参考中移除乙的蛋白。随后重新建索引,重新运行同样的完全匹配分类。
实际结果中,共享片段从共同属变为教学种甲。详细输出只剩甲种这个候选,匹配长度仍为四十五个氨基酸。乙的独有读段则从原先的乙种变为未分类。
共享片段的序列没有改变,匹配长度也没有增加,分类层级却变细了。通过这个可控对照,可以明确看到变化来自参考候选集合。数据库中只保留一个候选,会改变程序能够比较的范围。
因此,比较两个项目的分类结果时,需要保存参考蛋白库、索引和分类树的版本。若数据库更新后某些条目从种变成属,也可能是加入了新的近缘候选,使原有片段的共享关系显现出来。解释具体变化时,可以沿用本例的办法,回到详细输出检查新增或消失的候选。
本次种级汇总中,甲由三条支持变成四条,占比从百分之三十七点五变成百分之五十。样本读段完全相同,变化由参考库引起。把这类差异直接解释为群落丰度变化,会漏掉决定结果的分析条件。
长度门槛和搜索模式怎样分别影响结果
将完全匹配模式的门槛从二十五提高到四十一以后,原先四十氨基酸长的独有匹配全部低于门槛。四十五氨基酸长的共享片段仍然保留,最终仍然只能归到属。门槛变高并没有自动提高本例的种级分辨率。
带一个氨基酸改变的甲读段提供了另一组检查机会。改变位于四十氨基酸片段的中间,将最长连续完全相同片段分成较短的部分。我们在两种模式下分别测试长度门槛十一和二十五。
| 条件 | 含一个氨基酸改变的读段 | 详细输出第四列 |
|---|---|---|
| MEM,门槛 25 | 未分类 | 无匹配记录 |
| MEM,门槛 11 | 分到甲种 | 完全匹配长度 20 |
| Greedy,门槛 25 | 分到甲种 | 匹配分数 226 |
| Greedy,门槛 11 | 分到甲种 | 匹配分数 226 |
这张表来自额外实跑,避免把同时改变模式和门槛的结果混在一起解释。完全匹配模式对连续片段长度作出响应,允许扩展的模式在本例中保留了含替换的支持。
还需要注意详细输出第四列的单位。完全匹配模式中看到的二十代表匹配长度,另一模式中的二百二十六代表分数。两者不能直接放在同一条长度坐标上比较。读取结果时,先记录运行模式,再给字段写清含义。
本次低复杂度过滤保持默认设置,其他评分和显著性选项也保持默认。对于低复杂度片段或大规模真实参考库,应单独检查这些条件及其实际支持,不能由八条教学读段推断整套样本的准确率。
汇总前,先核对读段名称与输出单位
本次使用两个分类线程,输出中的行顺序可能与输入顺序不同。因此,比较两次分类时要按读段名称连接,不能把两个结果文件的第一行、第二行直接配对。下载包先按名称保存各组结果,再检查同一条读段的状态、分类编号和匹配信息,读者扩展到更多读段时也可以沿用。
输入中的名称还应能够唯一识别记录。如果预处理合并文件时重复使用名称,后续以名称构建对应表可能覆盖已有记录。可以在分析前统计总记录数和唯一名称数,发现差异后先处理命名关系。本次八条读段具有八个不同名称,每组输出也包含相同的八个名称,分类变化因此能够逐条追溯。
此外,本文使用单端输入,每行输出对应一条教学读段。实际双端输入的输出单位和计数需要按照工具的读段配对规则解释。建立自己的统计表时,把输入记录、读段对和最终分类行各自的计数保留下来,可以避免在合并结果时无意中改变分母。
怎样把本次检查用于自己的分类项目
首先,保存逐读段输出和分析条件。汇总表适合比较样本,详细输出适合回答某一条信号为何出现。可以针对关键分类单元抽取若干支持读段,查看匹配范围和候选集合是否一致。
其次,分别统计总输入量、已分类量、到达目标层级的数量以及未分类量。本次默认汇总的分母是全部八条输入,因此种级已分类比例与属级已分类比例不同。修改汇总选项或自行重新归一化时,应把新的分母明确记录。
再次,遇到参考库更新或参数调整,可以先选一小批相同读段重复运行,比较它们逐条改变了什么。归属从种到属、从属到种、从未分类到已分类,可能来自不同原因,分别回查会更容易找到证据。
最后,将分类支持与研究问题连接起来。Kaiju 的蛋白搜索能发现编码层面的匹配,参考中的保守片段也会限制精细分类。理解这两个特点,可以更合理地选择汇总层级,并为需要深入确认的信号安排后续核对。
下载包包含两个参考库的构建方式、八条读段的生成过程、六组实际分类和对应汇总表记录,读者可以按名称逐条复现。下载实跑脚本与本次结果
当项目需要维护大型蛋白参考库,并对多批宏基因组样本开展统一分类分析时,可了解云生信的生物信息学分析计算服务。
