ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

植物GO注释全流程实操:从序列清洗到结果质控

植物GO注释全流程实操:从序列清洗到结果质控 植物GO注释这活儿看着简单实际做起来坑不少。尤其做植物物种的注释跟模式物种不太一样数据库覆盖度、基因命名习惯、可变剪接带来的冗余序列每一个环节都可能让你的注释结果花很长时间去排查。这篇东西不是教科书是一个做过几十个物种转录组和基因组注释的人把从原始序列到GO注释结果的完整流程、选型逻辑和踩坑记录整理出来希望帮你少走弯路。先明确一下GO注释到底是什么。它全称是Gene Ontology注释简单说就是给基因打上功能标签告诉别人这个基因参与了哪些生物学过程Biological Process、在细胞里干了什么活Molecular Function、主要待在细胞的哪个位置Cellular Component。拿到一套新的基因序列不管是转录本还是蛋白序列第一步往往就是做功能注释GO注释就是其中最有通用性的那套体系。它跟KEGG注释最大的区别是GO不关心代谢通路它关注的是基因功能的三个正交维度这也是为什么它能跨物种比较功能的原因。这篇文章适合谁看打算做植物转录组、基因组注释手里有序列但不知道怎么下手的新手已经跑过一遍流程但结果覆盖率低、注释质量差、不知道问题出在哪的老手以及想系统了解植物GO注释工具选型和参数优化的人。我会尽量把每个步骤背后的“为什么”讲清楚而不只是丢给你一串命令行。1. 植物GO注释的整体设计与工具选型1.1 先搞清楚植物注释和动物注释的差异刚开始接触植物物种注释的人很容易直接把动物那边成熟的两步法流程搬过来先BLAST再根据结果映射GO。理论上没问题实操中你会发现植物的特殊性会让你白白损失几千个基因的注释结果。第一个差异是数据库覆盖度。你拿一套新测序的植物转录本去BLAST NR库很大概率会撞上其他植物物种的同源基因。但如果你去BLAST瑞士的SwissProt你会发现很多植物特有的基因家族根本没有收录。植物的次生代谢相关酶、抗病NLR基因家族、一些转录因子家族它们的序列变异极大SwissProt里的模式条目根本覆盖不过来。第二个差异是物种亲缘远近的影响比动物那边更明显。动物里做人类、小鼠的注释几乎所有哺乳动物基因都能在SwissProt里找到直系同源。但植物的物种多样性太高从苔藓到被子植物序列冲突比动物激烈得多你用一个标准BLAST阈值往往得到一堆低质量命中。第三个也是最重要的差异是基因家族扩张收缩带来的同源关系误判。植物在进化中经历了多次全基因组复制事件很多基因家族成员数比动物多好几倍旁系同源基因之间的相似度经常超过直系同源。你如果只做BLAST不管物种关系就容易把A基因家族里一个成员的错误关联—比如把一个扩展的NLR成员映射到另一个家族的GO term上功能标签就会出错。所以在设计流程时我的逻辑是三级保障第一级用BLAST找同源目的是快速覆盖那些有清晰同源关系的基因第二级用InterProScan做结构域注释用来补上那些BLAST没命中、但靠保守结构域可以判定功能的基因第三级用Pfam和InterPro条目映射到GO保证注释结果有结构生物学层面的证据而不只是序列层面的相似性。这一步是植物GO注释里最核心的选型思维既不能只靠BLAST也不能完全依赖结构域数据库两者必须互补。1.2 主流工具横向对比与最终选型市面上的GO注释工具很多我按“植物物种是否友好”和“是否需要本地服务器”两个维度来拆解。最常用的四个方案eggNOG-mapper这个工具是现在做真核生物注释的热门选择。它基于预计算的直系同源群速度极快而且支持直接输出GO注释。它最大的优势是注释逻辑商业级严谨会先做序列比对到eggNOG数据库再用树关联的方式推断直系同源准确率很高。缺点是数据库更新是固定的如果你的物种非常冷门或者序列是新的变异大、跟参考物种远它的覆盖率和准确率就会下降。但它非常适合第一步快速批量注释。PANNZER这个工具在植物注释里用得少一些但识别新基因家族的能力不错因为它综合了同源和描述性注释的信息。缺点是安装依赖比较复杂而且对短序列的兼容性不太好。适合有经验的人用。InterProScan这个是大杀器。它整合了Pfam、PANTHER、SUPERFAMILY等十几个数据库通过蛋白质结构域和特征位点来注释功能。它的好处是不依赖BLAST对保守基因的注释能力很强尤其适合BLAST没命中但结构域明确的基因。缺点是速度慢特别耗内存一个几万条的蛋白序列跑起来可能要一两天。Blast2GO图形化界面适合教学和小数据量但它需要购买授权或者用在线版本数据量大时不现实。我的最终选择是组合策略先用eggNOG-mapper跑一遍得到初步注释然后用InterProScan补充结构域证据最后用自定义脚本把两者合并保留置信度高的结果。这个流程兼顾了速度和准确率是植物注释里我验证过覆盖率和F1值都比较稳的方案。2. 注释前处理软件安装、数据库准备与序列清洗2.1 服务器环境与依赖安装细节我不建议在Windows上折腾这些尤其是InterProScan它在Windows上的性能和稳定性都不太行。建议直接用Linux服务器Ubuntu 20.04或22.04都行。安装部分最容易出问题的是Java版本。InterProScan要求OpenJDK 11以上但某些版本的eggNOG-mapper或它的依赖又对Java有不同要求如果服务器上同时跑多个工具建议用conda隔离环境而不是直接装在系统层面真的能省掉很多依赖冲突的麻烦。我用conda建环境的标准做法是conda create -n go_annotation python3.9 conda activate go_annotation # eggNOG-mapper推荐用conda装它会自动处理好依赖 conda install -c bioconda eggnog-mapper # InterProScan的在线版安装麻烦建议直接下载独立版本 wget https://github.com/ebi-pf-team/interproscan/releases/download/5.66-97.0/interproscan-5.66-97.0-64-bit.tar.gz tar -xzf interproscan-5.66-97.0-64-bit.tar.gz cd interproscan-5.66-97.0 python setup.py这里有个关键细节InterProScan下载后的目录里有interproscan.properties文件如果你服务器内存小于16G建议把-Xmx参数调低否则启动时容易直接OOM。另外InterProScan 5.66版本后默认会尝试从网络下载一些辅助数据虽然注释流程本身是本地化的但你如果服务器完全离线需要提前把数据库全部放在正确路径否则会报找不到某些数据库的错误。2.2 植物序列格式与数据库选择输入序列的干净程度直接决定注释结果质量。这里我有几条实操经验第一如果是转录组的CDS序列建议先用SeqKit去掉过长和过短的序列。植物CDS序列一般不会超过10kb如果出现15kb以上的序列大概率是基因组DNA污染或者可变剪接拼接错误。短于150bp的序列也建议过滤太短很难有可靠的同源匹配。我常用的命令seqkit seq -m 150 -M 10000 input.fasta -o cleaned.fasta第二冗余序列处理。一个基因有多个转录本在注释时会造成统计偏差——同一个基因的功能被重复计数多次。如果你后续要做GO富集分析这个影响很大会导致显著性被虚假放大。建议在做注释前用CD-HIT或SeqKit去冗余标准是95%相似度聚类cd-hit -i cleaned.fasta -o cdhit_output.fasta -c 0.95 -n 5 -M 4000 -T 8第三数据库选择。这是植物注释成败的关键。我强烈建议用eggNOG数据库做主体因为它的真核生物覆盖度好植物蛋白家族归类细致。下载eggNOG数据库时注意版本号不同版本的eggNOG-mapper依赖不同版本的eggNOG数据库一定要配套否则会报版本不对应。另外一个不错的补充是TAIR和Ensembl Plants的参考蛋白库如果你的物种是十字花科或者禾本科直接用TAIR拟南芥或Ensembl Plants水稻、玉米等的蛋白序列做BLAST覆盖率比NR库高一个量级。我的习惯是下载TAIR11或者最新版然后建立本地BLAST数据库makeblastdb -in TAIR11_pep_20141231.fasta -dbtype prot -out TAIR11如果你的物种离模式物种很远比如是苔藓、蕨类那TAIR反而帮助不大此时优先用eggNOG-mapper自带的数据库它对进化距离更远的物种做了直系同源划分比单纯BLAST可靠得多。3. 核心流程实操从BLAST到GO映射的完整命令与参数详解3.1 eggNOG-mapper快速注释的完整流程eggNOG-mapper的核心思路是先把你的序列比对到eggNOG数据库然后用预计算的直系同源树推断每个基因的直系同源群。注意这一步并不会直接输出GO它输出的是KOKEGG Orthology编号、OG编号和对应物种的直系同源蛋白。GO映射是在后一步通过eggNOG的映射表完成的。安装好了之后第一步是下载eggNOG数据库。这个数据库挺大大概需要60G左右的磁盘空间。我当时用的版本是5.0.2对应的数据库下载命令download_eggnog_data.py --data_dir /path/to/eggnogdb -y下载完成后开始注释emapper.py -i cleaned.fasta --cpu 16 -m diamond --data_dir /path/to/eggnogdb --output my_plant --output_dir ./eggnog_out参数解释-i输入文件fasta格式--cpu线程数植物转录组一般在2万到5万条序列16线程从几分钟到半小时不等-m diamond比对模式diamond比blastp快几个数量级且准确率相当--output输出前缀--output_dir输出目录跑完后会得到三个文件最重要的是*.emapper.annotations。这个文件里包含了每个基因的GO信息在最后一列格式是用逗号分隔的多个GO term。但我用下来发现eggNOG-mapper默认输出的GO注释有时候会过宽泛比如一个基因挂在“生物学过程”下的“细胞过程”这种很粗的节点上这种注释基本没什么价值需要在后面过滤。3.2 InterProScan补充结构域证据的细节光靠BLAST的同源注释植物特有基因的覆盖缺口就会暴露出来。这个时候InterProScan就显出必须要跑的价值了。我用InterProScan主要是看序列中是否有已知的蛋白结构域这远比BLAST同源更稳健因为结构域是功能的基本单元同一个结构域在不同蛋白里出现也往往意味着相似的功能。InterProScan的命令行格式如下实测下来对植物蛋白序列特别是转录因子、NLR基因家族效果显著./interproscan.sh -i ../../data/all_plant_pep.fasta -t p -f tsv -goterms -pa -iprlookup -cpu 12几个参数说明-t p指定输入是蛋白序列-f tsv输出tab分隔文件-goterms直接从InterPro条目映射到GO term-pa生成pathway注释来自MetaCyc-iprlookup输出InterPro条目详细描述-cpu线程数这里有个实操坑InterProScan对每条序列的注释时间不均匀有些长序列、重复序列区域多的蛋白会跑得非常慢。如果你序列里有大量低复杂度区域建议先跑一个简单的重复序列屏蔽但植物蛋白重复序列不多一般不影响。另外一个常见问题是如果输入文件是CDS的核苷酸序列需要先转换为蛋白序列。用emboss的transeq或者自己写脚本建议用--frame 1考虑所有阅读框但实际植物转录本CDS通常都是标准起始密码子直接用transeq -frame 1就够了transeq cleaned.fasta cleaned_pep.fasta -frame 1 -clean3.3 BLAST映射到GO的兜底方案与参数边界除了eggNOG-mapper和InterProScan我也会保留一条经典路子BLAST 映射。这条方法虽然老但在某些极端冷门植物物种上确实有用因为你可以自定义参考数据库比如用同属近缘物种的蛋白组来注释比通用数据库效果更好。BLAST标准命令blastp -query cleaned_pep.fasta -db TAIR11 -outfmt 6 -evalue 1e-5 -num_threads 16 -max_target_seqs 5 -out blast_out.txtmax_target_seqs我建议设成5不要设成1。很多教程教你要取Top1 blast hit但在植物直系同源基因判断里Top1有时候会落在旁系同源上。取前5个hit然后在后续映射时通过BLAST score的差异来判断到底用哪个GO这个方法更稳健。BLAST结果的GO映射我一般用自定义脚本来做。核心逻辑是取每条序列的Top1 hit然后在GO注释数据库比如拟南芥的GO注释中查这个hit对应的所有GO term做并集或者交集。但这里有个选择如果你取Top5 hits对5个hit的GO term求交集结果往往过少求并集又容易过宽泛。我的经验是Top1 hits作为主要注释来源Top2-5注入那些在Top1里缺失的GO term但要打上低置信度的标签。这个策略从实际效果来看是相对靠谱的尤其是那些序列在近缘物种中有直系同源但在模式物种中找不到清晰对应的基因。3.4 三步法结果合并与冲突仲裁策略这一步是最考验水平和经验的。我把三种通道的结果合并到一个表里eggNOG-mapper结果的GO列InterProScan结果的GO列来自tsv文件的第14列以|分隔的多个GO termBLASTTAIR映射结果的GO列合并时的难点是冲突仲裁同一个基因如果eggNOG-mapper和InterProScan给的注释不一致该听谁的我的仲裁顺序是InterProScan结构域证据 eggNOG直系同源证据 BLAST同源证据。为什么因为InterProScan基于结构域直接反映了蛋白质的分子功能不容易受进化假象干扰eggNOG的直系同源判定逻辑很强但对快速进化的植物基因家族偶尔会误判BLAST相似性则是最不靠谱的一环同源不等于同功能。合并时我还会做一个过滤只保留注释到GO term层级超过第5层的那些结果。God层级和具体性相关层级低比如第3层之前的GO term太宽泛对差异分析没有价值。比如Biological Process下的“cellular process”这种本来就包含几乎一切生物学事件注释上等于没注释。合并后的格式我建议设计成三列基因ID、GO term、证据代码。证据代码用IEA计算推断、IDA直接实验验证来区分来源是计算还是实验。如果后续投稿这个证据代码是审稿人非常关注的信息。最终结果一般会是几千到几万行的长表这个表可以直接用于后续的GO富集分析。4. GO注释结果的统计分析、可视化与个性化优化4.1 GO注释覆盖率统计的三张表注释完了第一件事不是急着画图而是先算覆盖率。我一般会算三张表第一序列级别的覆盖率。总数是多少条其中成功注释到至少一个GO term的有多少条覆盖率百分比是多少。植物物种正常范围在55%到80%之间。如果你做的是拟南芥同源转录组注释覆盖率应该能在80%以上如果是冷门物种覆盖率降到50%甚至40%也正常但不代表流程错了必须结合序列组装质量来评判。第二三大类别的分布。把注释到所有GO term按BP、MF、CC三个大类统计数量。正常分布是BP和MF数量较多、CC数量较少。如果CC类注释几乎为零大概率是InterProScan结果没正确处理或者映射步骤出错了。第三冗余转录本对覆盖率的虚高效应。去冗余之前覆盖率可能显示很高但这不代表基因家族的注释率高。正因为这样我在第一步就做了CD-HIT去冗余。如果序列太少比如只有一个物种的1000条转录本覆盖率虚高的问题不明显但如果你是待注释物种是全转录本组去冗余这一步千万不能省。我用R语言画一个简单的三大类别统计柱状图library(ggplot2) data - read.table(GO_category_count.txt, headerTRUE) ggplot(data, aes(xCategory, yCount, fillCategory)) geom_bar(statidentity) theme_minimal() labs(titleGO annotation distribution, x, yNumber of genes)4.2 用WEGO做植物GO分类可视化WEGO是华大开发的一个在线工具专门做GO分类的柱状图简洁直观适合放在文章里当figure。它要求输入格式是两列或者三列基因ID和对应的GO term制表符分隔。我习惯这样生成WEGO输入文件cut -f1,2 combined_go_table.tsv WEGO_input.tsv上传到WEGO在线服务物种选择“所有物种”或者对应的分类点击提交。WEGO会输出三大类别的富集柱状图。不过要注意的是做差异GO富集分析时WEGO这个工具只能展示全基因组的注释分布无法做统计检验。要判断哪些GO term在样本间显著富集必须用topGO或者clusterProfiler那套工具包。4.3 用clusterProfiler做差异基因GO富集分析的代码模板植物转录组拿到差异表达基因以后GO富集分析通常用的R包是clusterProfiler。它需要一个gene-to-GO映射对象就是我们第三步得到的表。需要注意的是clusterProfiler的enrichGO函数默认使用OrgDb比如拟南芥的org.At.tair.db。如果是非模式植物没有对应的OrgDb包你需要自己构造一个包含基因和GO映射的数据结构。我的做法是直接用enrichGO的universe参数配合TERM2GENE参数library(clusterProfiler) library(dplyr) # 读取GO映射文件 go_map - read.table(gene_to_go.tsv, headerFALSE, stringsAsFactorsFALSE) colnames(go_map) - c(gene, go) # 读取差异基因列表 deg - read.table(deg_list.txt, headerFALSE)$V1 # 构造TERM2GENE对象 term2gene - go_map[, c(go, gene)] # GO富集分析 ego - enricher(deg, TERM2GENEterm2gene, pvalueCutoff0.05, qvalueCutoff0.2) head(as.data.frame(ego))这个步骤最关键的是背景基因范围。如果只拿差异基因做富集而背景用全基因组结果会更可靠。如果你只有表达矩阵没有全基因组蛋白列表建议以所有检测到表达的基因作为背景否则富集结果会偏保守。5. 实战中的坑、问题排查与结果质控5.1 覆盖率过低的原因排查清单跑完整个流程如果注释覆盖率低于40%不要盲目调参数先系统排查。我建了一张速查表方便你快速定位问题可能原因判断依据解决方案输入序列质量差大量短序列N含量高用序列QC重新过滤必要时重新组装蛋白翻译错误CDS中有内部终止密码子检查ORF长度删除嵌合转录本数据库不匹配物种亲缘太远补充近缘物种蛋白数据库参数过严BLAST evalue设置过低放宽evalue到1e-3甚至1e-1BLAST无命中序列是特异性新基因依靠InterProScan结构域注释数据版本问题eggNOG数据库下载不完整重新校验数据库文件完整性其中最常见的是第二个问题CDS序列里带内部终止密码子。很多植物转录组测序质量不高或者可变剪切拼接错误导致CDS翻译出来的蛋白序列中间出现终止密码子BLAST和InterProScan都会直接跳过这些序列。你可以用下面的简单命令检查grep -v ^ cleaned_pep.fasta | grep -c \*如果你发现有大量星号出现在蛋白序列内部说明翻译阶段有问题建议回退到先用TransDecoder预测CDS而不是简单读框翻译。5.2 InterProScan常见报错与提速技巧InterProScan跑的时候最容易遇到的就是内存耗尽。我试过用16G内存服务器跑2万条植物蛋白结果直接OOM。解决办法一是减少并发线程数同时调低Java堆内存./interproscan.sh -i input.fasta -t p -f tsv -goterms -pa -iprlookup -cpu 4 -Xmx8g二是在跑之前把输入序列按长度分桶处理。长序列和短序列分开跑避免长序列占满内存时拖垮所有进程。例如用seqkit先按长度排序seqkit sort -l -r cleaned_pep.fasta | seqkit seq -m 500 -M 3000 mid_pep.fasta seqkit sort -l -r cleaned_pep.fasta | seqkit seq -M 500 short_pep.fasta seqkit sort -l -r cleaned_pep.fasta | seqkit seq -m 3000 long_pep.fasta然后分别跑InterProScan最后合并结果。这样速度能提升两三倍还不容易OOM。另一个常见报错是某些数据库文件缺失。InterProScan解压后需要在本地检查data目录是否包含了全部数据库文件。如果磁盘空间不够数据库下载不完整跑的时候会跳到缺失数据库然后报错。建议解压后先查看interproscan.properties里的data.dir路径确认数据文件大小和官方一致。5.3 两个真实案例复盘案例一一个禾本科物种的转录组注释初始覆盖率只有35%。排查发现输入序列是六倍体的转录本冗余度极高BLAST时大量序列只命中自己家族的同源基因导致GO注释集中在一块大量基因没注释上。用CD-HIT去冗余后覆盖率从35%提升到62%虽然少了一堆冗余转录本但注释到的基因数量反而更准确了。案例二某个植物NLR基因家族eggNOG-mapper和BLAST都注释不上因为这类基因的序列变异太大保守性很低。最后靠InterProScan的NB-ARC结构域成功注释了90%以上的家族基因。这也验证了结构域注释在植物抗病基因研究里的不可替代性。5.4 注释结果的生物学验证与最终质控注释结果不能光看覆盖率还要做生物学层面的验证这步很多人忽略但非常重要。第一个是富集结果与已知生物学问题对照。比如你做盐胁迫处理下的差异基因GO富集如果富集结果里没出现“渗透压响应”“离子运输”这些预期GO term说明你的注释可能有系统性问题。第二个是抽一部分基因到TAIR数据库或者Ensembl Plants数据库手动比对。比如挑20个注释为“转录因子”的基因看它们在拟南芥里的直系同源基因是否确实注释为转录因子。第三个是检查GO term层级分布。如果几乎所有注释到的GO term都在第3层以下宽泛层说明你在过滤时阈值设置不合理建议回到过滤步骤把严格度降下来优先选取更特异的GO term。我会额外再用一个分子进化层面的质控把注释成功的基因和未注释的基因放在一起检查GC含量、序列长度分布。如果未注释基因的序列长度显著偏短或者GC含量显著异常说明可能是组装错误或者污染序列进入注释管道这部分基因需要剔除而不是一直留在数据集里。植物的线粒体、叶绿体基因组污染在转录组数据中也常有出现它们的基因在很多GO数据库里可能没有对应物种条目这也是覆盖率上不去的一个隐性原因。可以用BLAST到NCBI的植物细胞器数据库把叶绿体或线粒体来源的转录本剔除后再做注释流程覆盖率会有一个肉眼可见的提升。6. 实操体会与下一步扩展方向这套流程跑下来我最大的体会是注释这件事七分靠前处理三分靠工具。序列清洗比换工具更管用很多时候覆盖率上不去不是工具不行而是你喂给工具的数据里有一堆垃圾。其次是不要迷信单一工具eggNOG-mapper很强但在植物领域千万别只靠它加上InterProScan的结构域证据你会发现那些缺失的基因很多是抗病基因和物种特有基因恰巧就是你想深入研究的那一类。另外分享一下我踩过N次坑才养成的习惯在每个步骤都保留中间文件。BLAST的原始输出、eggNOG的注释表、InterProScan的tsv全部保留不要动不动就删。后续如果发现注释有问题多半要回头重新分析中间文件没有它们就得重跑整个流程。而且数据库版本一定要记录好eggNOG数据库和InterProScan数据库版本更新很快不同版本的GO term定义可能有细微差异文章里标注版本号既是对自己负责也是对读者负责。如果你是第一次做植物GO注释我建议先用一个小的测试集比如取1000条序列跑通整个流程确认每一步输出格式符合预期再放全量数据。别一上来就全序列开跑光InterProScan一次就是几十个小时等你跑完了发现问题心态容易崩。最后再提醒一句GO富集分析结果永远要结合你的生物学背景来判断程序给你的统计学显著只是参考能够解释得通的富集结果才是真正有价值的结果。
返回列表