扩增子流程中,去冗余通常被看作一个简单步骤。相同序列合在一起,文件变小,后面继续分析。但如果输入已经带有丰度信息,而命令没有按预期读取这些信息,输出可能看起来很正常,计数含义却已经改变。
本文实际运行 VSEARCH 2.30.4,使用六条设计序列完成六组对照。我们检查正反链、大小写、输入丰度、输出丰度和低丰度过滤,并将传统命令与新版文档建议的入口放在同一组数据上复核。重点是让读者能够判断数量变化发生在哪一层,避免把计数规则变化误认为质量过滤效果。

先确认自己想合并的是什么
全长去冗余针对的是完全相同的序列。它能够把重复记录收拢为代表序列,同时保存对应计数。它与按相似度聚类、测序错误校正和去嵌合体属于不同操作,不能因为输出记录变少,就把它们都称为同一种清理。
这里至少需要区分两个数量。一个是文件中的序列记录数,另一个是这些记录所代表的总丰度。当输入已经去过一次冗余,每条记录可能代表多次观测,二者通常不再相同。
本例故意让六条输入记录代表二十八次观测。这样就能用很小的数据看清程序到底在累加已有丰度,还是重新按每条记录一次计数。没有明确计数单位之前,讨论保留率和稀有特征都容易出现歧义。
本次输入如何构造
驱动脚本固定随机种子,生成一条三百碱基的基础序列。第一条记录保存它,丰度设为十。第二条记录与它完全相同,丰度为五。第三条记录是它的反向互补序列,丰度为三。
第四条记录仍然是基础序列,但全部写成小写,丰度设为七。第五条只改变一个碱基,丰度为二。第六条是独立生成的另一条序列,丰度为一。六个丰度相加得到二十八,而文件中确实只有六个记录头。
这些丰度写在 FASTA 标题的标准注释位置,复现包会生成完整碱基串并记录校验值。下面只示意标题,实际实验没有使用省略后的序列。
>forward1;size=10;
>forward2;size=5;
>reverse;size=3;
>lowercase;size=7;
>variant;size=2;
>unrelated;size=1;
这种输入同时提供几类可检查关系。完全相同的两条记录可以检查基本合并,小写记录可以检查大小写处理,反向互补记录可以检查方向选项,单碱基变体则用于检查是否发生了超出全长完全相同条件的合并。
运行环境与命令版本
本次使用安装的官方 QIIME 2 发行环境中提供的 VSEARCH,实际可执行文件版本为 2.30.4。每次实验都直接调用命令行程序,驱动保存版本、文件校验值、输入信息和每组输出。VSEARCH 官方项目
vsearch --version
python run.py result
复现包中提供完整环境获取方式和镜像摘要。如果已有相同版本的可执行程序,也可以直接在能够运行 Python 的环境中执行驱动。先核对版本有助于区分环境改变与参数改变,不必为了复现小实验重新建立完整扩增子流程。
在线文档会随版本更新。本文实跑固定在上述版本,后面涉及新版文档建议时单独说明,并额外验证相关命令在本次环境中的实际输出,避免把不同版本的说明无条件混用。
第一组只比较正向,为什么合并成四条
第一组明确读取输入丰度、输出合并后的丰度,并只比较正向。
vsearch --derep_fulllength input.fna \
--output plus_sizein.fna \
--uc plus_sizein.uc \
--strand plus \
--sizein --sizeout \
--minuniquesize 1
实际输出四条代表序列,总丰度仍然为二十八。其中基础序列对应的丰度变成二十二,等于十、五和七相加。说明完全相同的两条记录与小写记录合并到了一起。
反向互补记录保留为单独一条,丰度为三。单碱基变体与另一条独立序列也各自保留,丰度分别为二和一。对于这一组,序列记录数减少了,但总丰度没有减少。
这一步可以帮助排查一个常见误会。去冗余后文件从六条变成四条,并不意味着删除了两次观测。重复记录的计数被汇总到代表序列中,原来的观测总量仍能从输出丰度中恢复。
第二组考虑双链,哪一条记录继续合并
第二组只把链方向改为双链,其余条件不变。实际输出三条代表序列,总丰度仍然为二十八。
vsearch --derep_fulllength input.fna \
--output both_sizein.fna \
--uc both_sizein.uc \
--strand both \
--sizein --sizeout \
--minuniquesize 1
此时反向互补记录也并入基础序列,代表丰度从二十二增加到二十五。单碱基变体仍然是二,另一条序列仍然是一。方向改变影响了哪些记录被视为同一对象,但在读取丰度且不做低丰度筛选时,没有改变丰度总和。
方向参数应与分析目的相符。若研究中同一片段的两种方向应合并,可以考虑这种处理。如果前面已经统一了方向,则应检查为何还会出现大量反向互补记录。把方向选项写明,有助于在不同流程之间比较结果。
本例的小写记录能够合并,并不表示所有字符差异都可以忽略。单碱基变体依然独立,说明全长去冗余没有把一个真实字符串差异自动当作测序错误改掉。是否需要进一步去噪,应由后续方法和数据证据判断。
不读取输入丰度,为什么总数变成六
第三组保留双链比较和输出丰度,但去掉读取输入丰度的选项。程序正常结束,仍输出三条代表序列,总丰度却变成六。
基础序列对应四条原始记录,因此输出丰度为四。单碱基变体和另一条序列各对应一条记录,所以都变成一。这组六正好等于输入文件的记录数,而不是标题中已有丰度的总和。
这里的变化不是程序随机丢了二十二条读段,也不是碱基质量变差。输入解释发生了改变,每条记录被重新当作一次观测。输出丰度选项负责把当前计数写出来,并不会自动保证这些计数使用了输入标题中的权重。
实际数据中,这种错误尤其容易发生在多次去冗余或跨文件合并时。上一步已经把几千条读段压成几十条代表序列,下一步若重新按代表序列各一次计数,后面所有相对丰度计算都可能基于错误的分母。
因此,检查一个流水线时应同时追踪输入记录数、输入丰度和输出丰度。如果记录数减少而丰度守恒,通常符合无筛选去冗余的预期。如果输出丰度恰好等于上一步的代表序列数量,就值得检查输入丰度是否被使用。
低丰度过滤究竟依据哪个数量
第四组恢复读取输入丰度,并要求去冗余后的丰度至少为三。实际 FASTA 输出只剩基础序列,丰度为二十五。丰度为二和一的两个代表序列不再写入该文件。
第五组保持相同门槛,但再次去掉读取输入丰度的选项。FASTA 同样只剩一条代表序列,丰度却只有四。两组输出的序列种类相同,计数含义仍然不同。
| 操作组合 | 最小丰度 | 输出记录数 | 丰度合计 |
|---|---|---|---|
| 正向,读取丰度 | 1 | 4 | 28 |
| 双链,读取丰度 | 1 | 3 | 28 |
| 双链,按记录计数 | 1 | 3 | 6 |
| 双链,读取丰度 | 3 | 1 | 25 |
| 双链,按记录计数 | 3 | 1 | 4 |
| 新入口,双链,读取丰度 | 1 | 3 | 28 |
这说明只检查最终有多少条代表序列还不够。本例两组都是一条,看起来完全相同,但后续使用丰度做归一化或比较时,数据含义已经不同。数量核对至少应该同时查看代表序列数与总丰度。
低丰度也不能自动等同于错误。这里的单碱基变体是人为构造的已知差异,丰度设为二只是为了测试门槛。真实样本是否删除低丰度特征,需要结合阴性对照、重复性、测序质量和研究问题,而不是从这个教学门槛推导一个通用规则。
UC 文件为什么还列着被过滤的序列
本次除了 FASTA,还保存了 UC 形式的映射结果。里面的种子记录、命中记录和分组汇总可以帮助追踪每条输入去了哪里。例如反向互补记录在双链运行中以负向命中基础序列,能够直接支持前面的方向解释。
更容易误判的是低丰度筛选后的输出。本次最小丰度设为三时,FASTA 只有一条代表序列,但对应 UC 文件仍列出三个分组,包括丰度为二和一的对象。它保留的是去冗余映射关系,不能直接当作筛选后的最终特征清单。
因此,如果自己的脚本一边使用筛选后的 FASTA,一边根据完整 UC 文件统计特征数,就可能得到相互矛盾的结果。应先明确每个输出文件的用途,再选择最终保留的代表序列集合进行关联。
实际审核时可以先读取最终 FASTA 中的代表序列,形成保留集合,再与映射结果连接。这样既能追踪原始成员,又不会把已经从最终序列文件中排除的分组重新算回来。本次全部映射行都保存在下载包中,读者可以逐项核对。
新版推荐入口也在本次环境中跑过
核对官方在线文档时,当前文档已将传统全长去冗余入口标为弃用,并推荐能够处理 FASTA 与 FASTQ 的新入口。迁移时输出参数名称也不同,不能只替换主命令名称。全长去冗余官方说明
我们在同一个 2.30.4 环境中补跑了新入口,仍使用本例六条 FASTA 记录、双链比较和输入丰度。实际得到三条代表序列及二十八的丰度和,分别为二十五、二和一,与前面的双链加权对照一致。
vsearch --fastx_uniques input.fna \
--fastaout both_fastx_sizein.fna \
--uc both_fastx_sizein.uc \
--strand both \
--sizein --sizeout \
--minuniquesize 1
这个结果只验证了本次输入与选项组合。真实流程迁移时,仍应核对长度筛选、输入类型和质量值处理等条件,不能因为这一组结果相同,就假定所有数据都会逐字节一致。尤其是处理短片段或 FASTQ 时,应按照所用版本的帮助信息重新检查。fastx_uniques 官方说明
怎样把这次检查用到自己的流程
建议先从一个样本抽出足够小、能够人工复核的输入,记录每条代表序列原来承载的丰度。运行后把输出丰度相加,再根据是否启用过滤判断总量变化是否合理。这一步能较早发现计数语义错误,避免错误继续传到多样性或差异分析。
如果要合并多个样本,还需要保留样本归属。一个全局代表序列的总丰度不能代替逐样本计数表。同一条序列在不同样本中的分布往往是后续分析的主要信息,合并文件时不应只留下跨样本累加后的一个数字。
比较两次去冗余结果时,应以完整序列和必要的方向规范为依据,谨慎使用代表名称。代表名称可能来自输入中的某条记录,它能够标识本次输出,但不是跨项目通用的生物学编号。名称相同也需要核对实际序列,名称不同则可能只是输入顺序或命名方式不同。
VSEARCH 的优点是提供明确的命令行操作和可检查的文本结果,适合放进重复执行的序列处理流程。使用上的关键限制是每个子命令负责的任务不同,去冗余结果本身不提供物种身份,也不证明低丰度变体是错误。应把它放到一个计数关系明确、步骤职责清楚的流程中使用。
下载包包含六条序列的生成脚本、六组实际输出、完整代表序列、丰度及 UC 映射行,能够从输入重新运行并复算本文表格。下载实跑脚本与本次结果
当项目需要统一处理多个测序批次,并保留序列映射、丰度核对和完整运行记录时,可了解云生信的生物信息学分析计算服务。
