转录组组装结束后,最常被拿来比较的数字之一是 N50。它容易计算,也容易被误用。两套结果的 N50 相同,不代表恢复了相同的转录本。把短序列过滤掉之后,统计表甚至可能变得更好看,而真正需要研究的序列已经消失。
本篇实际运行 Trinity,用三条长度已知的人工转录本生成双端读段,分别进行完整覆盖组装、带覆盖缺口的组装,以及对缺口数据施加更高长度门槛。三次运行都完成,但它们的序列恢复情况明显不同。这个对照帮助读者把长度统计、序列完整性和最终研究对象分开理解。

Trinity 解决的是从读段恢复候选序列
缺少合适参考基因组时,研究者仍然希望从 RNA 测序数据中得到候选转录本,用于后续定量、编码区预测和功能注释。Trinity 从读段之间的序列关系出发组织组装,不要求先有一套完整基因组注释。
这种方法的优势在于能够处理非模式物种,也能够提供参考注释之外的候选序列。困难在于表达丰度差异很大,相似基因和异构体共享片段,短读段又不一定跨越能够区分结构的区域。输出中的每条序列都是需要评估的组装候选,不能直接等同于已经确认的独立基因。Trinity 项目说明
因此,评价组装要围绕后续问题展开。研究编码蛋白时,可能重点检查编码区覆盖和同源支持。关注异构体时,需要保留能够区分结构的证据。只想得到一个更大的长度统计值,并不能说明这些任务已经得到满足。
三条设计转录本和两种读段覆盖
我们用固定随机种子生成三条相互独立的序列,长度分别为九百、一千五百和二千四百碱基。它们不是真实基因,也没有人为赋予任何功能。采用随机序列,是为了减少重复区域和同源关系对本次长度问题的干扰。
每个设计片段长三百碱基,从两端各读取一百碱基。第一端沿转录本方向,第二端为另一端的反向互补,因此指定正向双端文库关系。沿序列每隔五个碱基取一个片段,每个位置生成三对,完整覆盖组共有二千三百四十九对读段。
缺口组只修改中等长度那条转录本。我们去掉跨越或进入中间缺失区的片段,并确保没有配对信息跨过该区域。留下的证据仅覆盖前六百五十碱基与最后六百五十碱基,中间二百碱基没有读段支持。其余两条序列的读段保持完整,缺口组总计二千零五十二对。
这不是对真实测序覆盖的完整模拟。读段没有测序错误,覆盖位置由程序明确安排,也没有真实样本中的污染或同源基因。好处是我们知道缺口发生在哪里,能够将每一条组装结果与已知序列核对。实验目的仅限于检验长度统计是否足以代表恢复情况。
安装、参数和实际完成的范围
本次安装的 Trinity 实际版本为二点一十五点二,复现脚本锁定容器摘要。每次均执行完整的本次组装流程,关闭读段归一化和附加 Salmon 定量,以便将比较集中在相同输入规则下的组装结果。没有开展表达差异、编码区预测或功能注释。
docker pull quay.io/biocontainers/trinity:2.15.2--pl5321h077b44d_6
docker run --rm quay.io/biocontainers/trinity:2.15.2--pl5321h077b44d_6 \
Trinity --version
# 解压复现包后,在对应工具目录执行
python3 run.py ./practice
完整覆盖组的实际核心命令如下。其他两组使用缺口读段,最后一组把最短输出长度从二百改为一千。输出目录、读段文件名和参数均保存在附件中,便于核对变化是否来自预定的实验变量。
Trinity --seqType fq --max_memory 2G --CPU 2 \
--SS_lib_type FR --no_normalize_reads --no_salmon \
--min_contig_length 200 \
--left intact/reads1.fq --right intact/reads2.fq \
--output intact/trinity_out
这里关闭归一化,是为了隔离本次问题,并不是正式转录组一律应关闭归一化的建议。不同步骤对并行和内存参数的使用也不同,最大内存参数是可限制环节的建议值,不等于所有子程序都被一个相同硬上限约束。迁移流程时应核对 Trinity 官方运行说明。
这次还有一个很实际的文件定位经验。当前运行把最终组装写到输出前缀后接 .Trinity.fasta 的位置,而不是我们最初预期的目录内部固定文件名。程序已经成功,最初的结果读取脚本却因此报文件不存在。根据完成日志修正路径后,我们重新完整执行三组,均成功退出。判断失败发生在哪一步,应区分组装程序与后续收集脚本。
第一组恢复三条,第二组变成四条
完整覆盖组输出三条序列,长度恰好是二千四百、一千五百和九百。逐条检查其序列与设计参考的连续区间,三条参考都被完整恢复。这只能说明本次简单输入下恢复正确,不能外推到复杂真实转录组的准确率。
缺口组输出四条序列,长度为二千四百、九百、六百五十和六百五十。中等长度的参考被拆成两段,中间二百碱基仍然缺失。组装没有凭空填上没有证据的区域,而是保留了由现有读段支持的两段序列。
| 条件 | 输出条数 | 输出总长度 |
|---|---|---|
| 完整覆盖 | 3 | 4800 |
| 覆盖缺口 | 4 | 4600 |
| 提高门槛 | 1 | 2400 |
如果只按输出条数判断,第二组甚至比第一组更多。但多出来的条目来自碎片化,不代表发现了更多真实转录本。真实项目中一条基因可能产生多个异构体,一个异构体也可能被组装成多个片段,两种情况都可能增加序列条数,必须结合序列关系和读段证据区分。
本次因为有设计真值,可以直接证明两个六百五十碱基片段来自同一条参考的不同部分。在真实研究中,没有这一便利,就需要结合回贴比对、同源注释以及其他独立证据寻找线索。任何单一条目计数都不能代替这种核对。
三个 N50 为什么都是二千四百
N50 的计算方式是把组装序列按长度从大到小排列,累计长度达到全部组装碱基的一半时,对应那条序列的长度。它是基于当前输出集合的长度分布统计,不会自动与真实转录本集合比较。
第一组总长四千八百,一半为二千四百,最长序列已经达到这一值。第二组总长四千六百,一半为二千三百,最长序列仍然足够。第三组只剩一条二千四百碱基序列,它当然也跨过自身总长的一半。因此三组的 N50 完全相同。
| 条件 | 长度从大到小 | N50 |
|---|---|---|
| 完整覆盖 | 2400、1500、900 | 2400 |
| 覆盖缺口 | 2400、900、650、650 | 2400 |
| 提高门槛 | 2400 | 2400 |
这个结果不说明 N50 没有用途。它能够描述当前组装集合中长度如何分布,但它没有包含缺失哪些目标、是否出现错误连接、同一目标是否碎片化等信息。使用一个指标之前,先明确它能回答什么问题,才能避免给它附加超出定义的含义。
转录本本来就有长有短,真实长度分布还受物种和表达谱影响。不能照搬基因组组装的直觉,把更长的序列简单当成更接近真实答案。对于短转录本、短编码蛋白或非编码 RNA,统一追求长序列甚至可能让重要对象在统计前就被排除。
提高长度门槛没有修复覆盖缺口
第三组仍然使用缺口组的读段,只把最短输出长度提高到一千。结果只保留二千四百碱基那条,九百碱基的完整短转录本以及两个六百五十碱基片段全部消失。输出更简洁了,但没有恢复任何新的序列。
相对于原来三条参考的四千八百碱基,第三组只覆盖其中一半。中等长度目标与短目标都没有可用输出。若只看 N50,这个损失完全看不出来。若只看“短序列比例下降”,又可能把过滤造成的变化误写成组装质量改进。
过滤当然可以有合理用途,例如去掉与研究目标不符的过短候选,减少某些下游计算负担。但报告时应说清这是候选集合筛选,并记录筛选前后的目标损失。不要把原始输出、筛选后的集合和所谓高质量结果混用同一个文件名,使后续无法追查哪一步删除了什么。
本次两个缺口组使用完全相同的读段顺序和序列,长度门槛是预定的比较变量。实际项目若同时更换输入、改变归一化设置并修改门槛,即使统计改善,也无法直接知道是哪一步造成变化。一次改变一类关键条件,更容易得到能够指导下一步的结论。
怎样增加比长度更有用的检查
首先,回到研究对象。若关心一组已知通路或候选基因,应检查这些目标的覆盖范围、完整性和是否重复出现。整体统计非常接近的两套组装,仍然可能在少数关键目标上差异很大。对项目来说,这些差异往往比一个总分更重要。
其次,把读段重新与候选序列核对,观察覆盖是否连续、端部是否证据薄弱、是否有异常连接,以及共享区域造成的多位置匹配。高回贴率可以说明大量读段找到相容序列,但不自动证明所有候选结构正确。碎片集合也可能吸收大部分短读段,仍然缺少完整连接关系。
然后结合适合研究目的的独立检查。保守基因集合可以帮助观察覆盖缺失或重复,蛋白同源信息可以提示编码区是否完整,长读段或明确的跨区间证据可以帮助验证结构。本次没有执行这些工具,因此不提供它们的实测分数。这里强调的是评价框架需要多种证据,而不是要求每个项目机械地堆满所有检查。
最后保存筛选前后的对应关系。一个候选为什么被保留、为何被合并、因何被删除,最好能够从记录中还原。否则后续发现某个重要基因没有结果时,很难判断它是没有测到、没有组装出来,还是在长度与冗余筛选中被去掉了。
编号、基因与异构体不要直接画等号
Trinity 输出编号包含程序组织候选的层级信息,但这些编号本身不是外部注释已经确认的基因身份。换一批输入或调整组装设置后,编号也不应被直接当成跨运行稳定的生物标识。
整理多个组装版本时,应通过序列和注释建立对应关系,而不是根据相似的编号拼接表格。两个片段可能来自同一目标,两个高度相似的完整序列也可能对应不同异构体或者同源成员。过早删除其中一条,可能损失后续需要区分的信息。
从头组装也不意味着整个流程始终不能使用参考信息。组装阶段可以不依赖参考基因组,评价和注释阶段仍然能够使用可靠的同源序列、已知结构或其他测序证据。把不同阶段的任务分开,有助于既保留探索能力,又避免将所有新条目都解释成新的生物发现。
优点、限制和实跑经验
Trinity 的优点是为缺少良好参考的转录组提供了可执行的组装路径,并能把短读段整理成后续分析需要的候选序列。它适合非模式物种和需要从头获得转录本集合的场景。相应的限制是短读段信息不足、丰度差异、同源关系与组装碎片都会增加解释难度,结果需要与研究问题一起评价。
这次实跑没有测量大规模处理性能,也没有比较不同组装器。因此不能根据几千对人工读段判断哪种方法更快或更适合所有物种。可以确认的结论只有本次对照展示的关系,覆盖缺口导致中等目标碎片化,长度筛选进一步删除目标,而三组 N50 都保持不变。
读者最值得带走的做法,是把长度统计放回完整的结果检查中。先确认程序完成并找到真正的最终文件,再查看候选总量和长度分布,随后核对目标覆盖、碎片化及筛选损失。这样即使看到一个漂亮的 N50,也知道还需要哪些证据,才能判断这套组装是否足以支持自己的研究。
下载本组复现脚本和实际输出。算法和流程背景可阅读 Trinity 方法论文 与 转录组重建分析流程。
当组装方案和结果评价方法已经确定,需要长期保留多个样本的读段、组装及注释结果时,可了解云生信生物信息学分析服务器服务。
