ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

BUSCO基因组完整性评估:从原理到实战排查一文讲透

2026/10/3 11:17:03 拓冰建站 浏览量
BUSCO基因组完整性评估:从原理到实战排查一文讲透 做了这么多年基因组组装拿到一条染色体级别的contig之后第一件让人心里踏实的事就是跑一遍BUSCO评估基因组的完整性。这几乎已经成了基因组项目里约定俗成的“验货”环节期刊审稿人也很吃这一套。估计不少人跟我一样第一次接触BUSCO时只知道它是个评估软件把命令敲完看几个数字完事。但真到自己处理一个杂乱组装结果、或者审稿人追问“你的Complete和Duplicated比例为什么这样”的时候才发现这东西的细节远比三条命令复杂。这篇就把BUSCO评估基因组的完整性这件事从原理到实操从参数选择到结果异常排查一次说透。这篇文章适合刚做完基因组组装、准备评估质量的同学也适合已经会跑BUSCO但不太清楚结果到底怎么解释、遇到问题不知道从哪下手的同行。不涉及高深的算法推导全是大白话加实际操作经验。1. 先搞明白BUSCO在评估什么1.1 基因组“完整性”到底指什么基因组组装完成后很多人第一反应是看N50、看总长度。这两个数字确实重要但有个致命盲区它们只告诉你“序列拼得有多长、有多大”完全不管拼出来的内容对不对。想象一下一本缺了三分之一章节的小说被重新排版成一本厚书页数和章节编号都对得上但内容少了关键情节。N50就是这个“页数”它无法告诉你“情节”是否完整。BUSCO评估基因组的完整性就是在回答“情节完整度”的问题它不关心你的contig有多长而是关心基因组里应该有的核心“零件”是不是都在。这些零件选得非常聪明——单拷贝直系同源基因简称BUSCO基因。逻辑很简单既然这些基因在绝大多数物种里都存在且是单拷贝那么你新组装的基因组里也应该能找到它们。能找到多少就在很大程度上反映了组装对基因区的覆盖程度。这种情况在实操中特别常见。我之前处理过一批植物基因组有样本的N50做到20Mb以上看起来很漂亮但BUSCO的Complete比例只有50%多。后来查明是高杂合导致的组装错误把真实的基因区域错误拼接成了冗余结构BUSCO一下子就暴露了问题。所以现在我的习惯是组装完第一步永远先跑BUSCO再去看N50。1.2 单拷贝直系同源基因的评估逻辑BUSCO的底层数据来自OrthoDB数据库这个数据库把不同物种的基因按直系同源关系分组从中筛选出一批在特定谱系里保守存在、且通常是单拷贝的基因家族。为什么必须选“单拷贝”这是整个评估逻辑的基石。如果选多拷贝基因你就没法区分“正常存在”和“扩张了”评估完整性时无从下手。单拷贝基因就简单得多在一个物种的基因组里它正常就应该出现一次。BUSCO拿这批基因的序列作为参考在目标基因组里做比对搜索然后判断每个基因是完整命中、断裂、重复还是彻底没有。这里要说明一点BUSCO对“完整”的定义很严格。它不只是验证序列存在还要验证基因的结构是完整的包括起始和终止。拿真菌的一个保守基因举例参考序列是一个完整的基因模型如果你的组装区域只比对上中间一段BUSCO会把它判成Fragmented而不是Complete。这就导致一个常见情况组装总长度很大、N50也很高但BUSCO的C值上不去因为基因区域的组装质量不够好碱基错误、缺失导致基因模型不完整。BUSCO适合谁来参考我的理解是所有做基因组从头组装的课题组都应该掌握尤其是做非模式物种的。模式物种有成熟参考基因组BUSCO的意义小一些但做动植物基因组、真菌基因组、宏基因组组装BUSCO基本是投稿敲门砖。1.3 三种模式怎么选BUSCO对输入数据类型提供了三种模式分别对应基因组组装序列genome、已注释的蛋白序列proteins、转录本组装序列transcriptome。很多新手一开始就栽在这里拿着组装好的基因组随便找个教程命令里写的是-m proteins结果跑起来全是报错。这三者的区别在于搜索策略前提不一样。genome模式最复杂输入的是所有scaffold序列BUSCO需要先做基因预测把预测出的蛋白与BUSCO参考基因比对再综合判断每个基因的完整度。proteins模式最简单输入是已经注释好的蛋白序列文件BUSCO直接做比对省去了基因预测环节。transcriptome模式则介于二者之间输入是组装好的转录本BUSCO将其翻译成蛋白后再比对。选错模式的代价通常是一堆“Missing”或者程序直接崩溃。我见过有人拿着核苷酸序列跑-m proteinsBUSCO内部程序把氨基酸序列翻译得乱七八糟最后结果全是Fragmented和Missing。所以动手前一定先确认自己的输入属于哪一类这一点无论如何强调都不过分。2. 运行前准备环境、数据库和输入文件2.1 安装方式与版本选择的取舍BUSCO的安装方式有很多种但在我这些年的使用经验里最省心的还是用conda或者mamba创建一个独立环境来安装。这样做的好处是依赖管理干净不会污染系统Python环境也方便版本回退。装个Python 3.10及以上版本一条命令就能搞定mamba create -n busco_env -c conda-forge -c bioconda busco5.5.0 conda activate busco_env busco --version需要提醒的是到BUSCO 5.x之后版本更迭带来的行为差异很大。5.2以前和5.4以后的结果格式有些不同比如5.4引入了run目录下的一些结构调整。实际工作中如果要在项目中期换版本尽量保持所有样本用同一个版本否则结果之间的可比性会打折扣。担心离线环境的也可以用docker或singularity镜像最先是拉下来之后跑完全不受本地依赖折腾特别适合部署在高性能集群上给多人共用。2.2 lineage数据集的选择逻辑BUSCO的数据集叫lineage命名方式类似vertebrata_odb10、arthropoda_odb10、fungi_odb10、viridiplantae_odb10。odb10代表OrthoDB第10版。选择原则一句话选与你研究物种亲缘关系最近的谱系。这个选择直接决定评估的灵敏度和合理性选远了保守基因差异大、同源性下降完整的基因可能被漏判选近了又可能引入太多特异性基因不适合作为通用标准。最保险的做法是查一下OrthoDB里有没有完全匹配你物种的那个节点比如做果蝇就找diptera_odb10做酵母就找saccharomycetes_odb10。真找不到时再往上找父级的谱系比如通用的eukaryota_odb10。这里有个直观感受细菌基因组用bacteria_odb10真菌基因组如果不想细分就用fungi_odb10但如果你明确知道自己做的是子囊菌用saccharomycetes_odb10就更精准结果通常也更漂亮。数据库下载这个环节是不少人的绊脚石。首次运行某个lineage时BUSCO默认联网下载网络不稳时经常下到一半断了。我的做法是去官方服务器把对应的.tar.gz包下载好解压后用一个环境变量指过去。具体来说wget https://busco-data.ezlab.org/v5/data/lineages/fungi_odb10.2024-01-08.tar.gz tar -xzf fungi_odb10.2024-01-08.tar.gz export BUSCO_LINEAGE_DOWNLOAD_PATH/path/to/your/local/db设置这个环境变量后busco运行时会优先从本地路径寻找数据集没有网络依赖速度快且稳定。强烈建议在集群上这么干全组共享一个数据集目录。2.3 输入文件的清理与改名很多人忽略输入文件的预处理直接拿组装结果丢给BUSCO。其实输入FASTA文件的质量直接影响评估耗时和准确性。基因组模式下BUSCO会先用miniprot之类的工具做基因预测如果输入序列里混入太多N或者短片段预测效率会下降还可能出现假阳性比对。我的经验是正式跑BUSCO之前先用seqkit做一次基础清理过滤掉长度小于1000bp的contig。太短的序列一般信息量有限还浪费计算资源。再看看序列ID里有没有特殊字符BUSCO对ID中的空格、括号这类特殊符号相当敏感最好统一改成简单的字母数字命名类似chr1、scaffold_1这种。曾经就有同事因为scaffold名字里带了一个冒号导致下游分析脚本全挂了。3. 实操部分从命令行到结果解读3.1 最基础跑通的一条命令假设你有一个真菌基因组的scaffold文件genome.fa要跑真菌谱系的评估一个最简命令是busco -i genome.fa -l fungi_odb10 -o sample_busco -m genome -c 16 --out_path ./busco_results参数很好理解-i指定输入序列-l指定lineage数据集-o是输出目录名称-m指定输入类型-c是线程数--out_path可以指定结果输出到哪个目录。跑起来之后屏幕上会打印当前进行到哪一步。基因组模式比proteins模式慢很多特别是基因组比较大的时候耗时可能从几十分钟到十几个小时不等做好心理准备。3.2 常用高级参数速查与调优除了基础参数还有几个高级参数在特定场景下很管用。下面这个表格把常用的参数和适用场景写清楚。| 参数名 | 作用 | 常用场景 | | --- | --- | --- | | --augustus_parameters | 传递参数给Augustus基因预测器 | 基因组模式复杂物种时提升预测质量 | | --limit | 控制每个基因的最大拷贝数判断阈值 | 高杂合多倍体物种的评估 | | --long | 使用斑马鱼等保守整段序列做优化 | 对高完整度组装做精细验证 | | --offline | 离线模式 | 集群上无外网连接时必加 | | -f | 强制覆盖已有输出目录 | 调试或重跑时避免手动删目录 |有个经验要说一下Augustus参数不是调得越多越好BUSCO自带的默认物种参数对大多数情况够用。真正需要调参的往往是基因组复杂度高、GC含量极端比如超过65%的物种。这种时候可以先单独训练Augustus模型再用--augustus_parameters指过去但那是另一套工程普通项目没必要这么折腾。还有一点关于--limit它默认是判断每条序列上基因重复的阈值。高杂合基因组组装时单倍型间的差异可能导致一个基因被组装出两条拷贝BUSCO会把它判成Duplicated。这种情况下如果想更准确评估核心区完整度可以考虑适当调参但千万别指望靠这个参数把组装质量“修好”它只是评估时的尺度调整。3.3 输出文件逐个拆解跑完之后在--out_path下找到以sample_busco命名的目录里面有一堆文件。重点看这三个short_summary.specific.fungi_odb10.sample_busco.txt、full_table.tsv以及run_目录下的中间文件。首先是short_summary它是一段文本摘要开头会统计总共搜索了多少个BUSCO基因然后给出C、S、D、F、M五个指标。C是Complete BUSCOsS是Complete且单拷贝D是Complete且重复拷贝F是Fragmented断裂M是Missing缺失。C值代表总完整度S值更代表真实的核心区完整度D值高说明组装里有冗余或者参考谱系本身有全基因组复制事件。举个例子C: 95.2%[S: 90.1%, D: 5.1%], F: 2.3%, M: 2.5%, n: 2264这个结果就是总共用了2264个BUSCO基因做评估95.2%完整其中90.1%是单拷贝完整5.1%是重复拷贝2.3%断裂2.5%缺失。综合看这是一个质量很不错的组装。full_table.tsv是逐基因的详细结果每一行是一个BUSCO基因列信息包括基因ID、状态Complete、Duplicated、Fragmented、Missing、在组装中的匹配坐标、比对长度、占比等。这个表在做基因组注释时很有用可以根据匹配坐标去找基因组的特定区域有没有被错误组装。我曾经靠这个表发现一个组装里连续20多个BUSCO基因都落在同一个scaffold上而且匹配方向完全一致这表明这个scaffold来源于真实染色体的一段连续区域为后续染色体重建提供证据。3.4 结果异常时的第一反应看到C值很高心情自然不错但看到M值很高时先别急着骂组装工具。按我的排查经验第一优先级是检查数据库选得对不对。有次拿fungi_odb10评估一个酵母基因组结果只有70%完整后来改成saccharomycetes_odb10C值直接飙到98%。原因就是酵母作为单细胞真菌在很多保守基因上与其他真菌差异太大用大类数据库评估时同源性不足。如果数据库没问题再看是不是模式选错了。很多宏基因组组装或转录组数据被错误地用genome模式跑结果预测阶段就一团糟。第三种常见原因是组装本身质量差这种时候N50往往也不会高到哪里去BUSCO只是帮你把“差”量化了。4. 实战中遇到的坑和排查方案4.1 数据库下载卡住或失败这个坑几乎每周都能在社区里看到。BUSCO运行时会自动尝试从远程服务器下载对应的lineage数据集在网络状况不佳或者被防火墙挡住的机器上常常卡在“Downloading”就不动了最后报连接超时。解决办法我前面提过就是提前下载好压缩包手动解压设置BUSCO_LINEAGE_DOWNLOAD_PATH指向本地目录。还有一个变通办法是下载好.tar.gz之后把它放在busco安装目录下某个特定位置但用环境变量最灵活因为不同项目用不同数据集时切换非常容易。4.2 运行时间太长、内存爆炸基因组模式跑大基因组比如植物基因组动辄几个Gb时时间成本会让人抓狂。常规建议是先看自己的计算资源给足线程-c有条件上高内存节点。有一个非常实用的技巧是先对输入文件做一个快速QC过滤掉重复序列或者用purge_dups处理完高杂合区域后再跑这样既减少输入体积也减少歧义比对。如果只是想知道一个大概质量先用-m proteins跑有参考注释的结果再用genome模式跑最终版前后对照可以帮你判断组装里基因区的完整性。另外BUSCO 5.x的某些版本默认使用--metaeuk内存占用比旧版本大幅下降速度也快了。老教程里讲配置Augustus路径的方法在5.3版本之后基本不需要手动干预了Augustus会被自动安装。如果你的版本还是提示找不到Augustus路径多半是conda依赖没装全重新装一下就好。4.3 输出目录里文件不完整怎么办有时候程序跑完看着像是成功了但full_table.tsv是空的。这种“静默失败”比报错更让人头疼。敲代码排查环节先看run_目录下的日志文件。常见原因是输入FASTA识别失败或者某个中间比对步骤异常退出但busco主进程没有把这个异常暴露出来。解决办法不是盲目重跑而是先检查grep -E ERROR|WARNING run_sample_busco/logs/*把日志里的关键词捞出来定位到具体这一步再决定是改参数重跑还是修输入文件。这省了我无数次无用功。4.4 防止结果解释“翻车”的注意事项经验一C值高不等于组装没问题。有些组装通过引入重复序列堆出了很高的完整度一看S值很低、D值很高这种时候要警惕组装中大量单倍型冗余。经验二D值高不一定是坏事。某些多倍体物种或者近期发生过全基因组复制事件的物种D值高是生物学真实体现比如芸薹属一些多倍体作物。经验三BUSCO结果要和N50、总长度、QV值、Hi-C挂载率一起看单一指标都可能被“刷”出来。5. 把BUSCO结果真正用到文章和项目里5.1 文章里的标准展示样式主流期刊对BUSCO结果展示的要求高度一致要么在正文里一句话描述要么放在补充材料和表格里。常见说法是“The assembly achieved 97.4% complete BUSCOs (n2264) using the fungi_odb10 lineage, with 0.9% fragmented and 1.7% missing”。这里有个细节n值一定要标出来不同数据库的BUSCO基因数目不同不标n审稿人会质疑阈值标准。图的展示可以直接用busco自带的绘图脚本生成也可以结合R脚本画柱状图。早期我都是跑完BUSCO再人工画图后来发现5.4版本自带busco_plot命令一条命令就能把多个样本的结果画成汇总图。5.2 不同物种的参考阈值综合我平时跑过的项目大致可以给出一个经验区间| 物种类型 | Complete BUSCOs 参考 | 备注 | | --- | --- | --- | | 细菌完成图 | ≥99% | 必须以bacteria_odb10评估 | | 真菌基因组 | ≥95% | 选saccharomycetes等近缘谱系更准 | | 昆虫/节肢动物 | ≥90% | 物种特异性强的组群可能偏低 | | 哺乳动物 | ≥90% | 高杂合重复区影响结果 | | 大型植物 | ≥85% | 多倍体、重复序列影响较大 |这些数值不是硬性标准但能让你大致判断自己组装的样本是否达到主流水平。如果C值低于80%我的第一个反应不是怀疑物种本身而是怀疑上游数据质量建议回到测序深度、k-mer分析那一步排查。5.3 与QUAST、N50这些指标怎么配合我有一次开会时听到一句话觉得很到位N50反映的是“骨架”长不长BUSCO反映的是“细节”全不全二者缺一不可。QUAST报告里的N50、L50、GC含量、N含量是宏观描述BUSCO是“内容校验”。实际操作时配合关系是这样的先用QUAST看整体装配规模再用BUSCO看基因区完整度。如果N50看着不错但BUSCO差大概率是组装里存在大量错误连接或未解决的高杂合区如果N50一般但BUSCO很好说明组装虽然碎片化但局部区域拼得准确这种时候后续用Hi-C或遗传图谱做挂载时还有救。两种情况的后续处理策略完全不一样这一点我踩过太多次坑了。5.4 多个样本批量跑BUSCO的小脚本很多项目都是多个样本横向比较一条条命令手动跑不现实。我一般写一个简单循环批量跑完再把short_summary汇总。可以参考这个思路for sample in sample1 sample2 sample3; do busco -i ${sample}.fa -l arthropoda_odb10 -o ${sample}_busco -m genome -c 8 --offline done grep C: */short_summary*.txt all_busco_summary.txt这样一个目录下的所有样本结果就汇总出来了。还可以写个更长的脚本把几个指标切成表格方便做图。批量处理时的建议是先小样本测试一个确认一切正常再全量启动别一上来就把集群节点全占满容易挨管理员白眼。做了这么多次基因组组装评估我有个很深的体会BUSCO好就好在它把复杂的基因组完整性评估变成了一组直观的数字和表格。但它的另一面是数字太容易让人盲目自信或盲目焦虑。我现在每次拿到新组装的第一个BUSCO结果都会同时看一眼原始k-mer评估和比对回测序数据的覆盖度三个维度交叉验证心里才有底。这篇里写的都是自己实际操作时反复踩过的坑和验证过的流程按这个流程走下来你跑出的BUSCO结果会靠谱得多。