MEGA建树全流程:序列比对、模型选择与Bootstrap验证
2026/9/17 19:46:52 网站建设 项目流程

简介:这份《怎样使用MEGA建立进化树》PDF教程面向生物信息学初学者、分子进化研究相关学生与科研人员,针对使用MEGA 4.0进行系统发育分析的实际需求,完整梳理了从启动软件、选择DNA或蛋白质序列类型、逐条输入并保存序列,到以邻接法、最大似然法等构建并导出进化树的全流程。教程中每一步配有界面操作说明与截图指引,尤其细化了蛋白质序列的粘贴、序列文件命名以及重复输入多条序列时的注意事项,能有效减少入门者常见的操作困惑。资源为单个PDF文件,体积仅212KB,既便于快速下载,也适合在本地随时查阅。已有540人学习下载,内容短小精悍,适合作为构建进化树时的速查手册或课堂辅助材料。

1. 没有序列比对就没有进化树:MEGA建树前必须想清楚的事情

拿到一条线粒体COI片段拖进MEGA,点Build Tree导出图片,这套流程看起来比跑AlphaFold简单太多,可当审稿人问起替代模型、Bootstrap次数、外类群依据时,很多人会发现自己对中间过程一无所知。MEGA(Molecular Evolutionary Genetics Analysis)的优势在于把建树的完整链路显式化:序列比对、位点过滤、替代模型拟合、树搜索、支持率评估,每一步都有对话框让你确认在用什么参数。所以这篇不按“点哪里出图”的顺序写,而是按真实工作流把参数边界讲清楚。第一次建树的实验研究者可以照着跑,常年做系统发育推断的工程师也能用它复盘自己的参数逻辑。先把一个结论放在前面:MEGA建树的质量上限取决于比对质量,不是最后那一下Construct Tree。

2. 从FASTA到比对结果:MEGA里的数据准备与多重序列比对

进化树比较的不是序列本身,而是同源位点上的替换模式。“同源位点”靠的是多重序列比对,把不同序列中来自同一祖先位置的碱基放到同一列。没有这一步,后面的距离计算和似然估计全部建立在一个错位矩阵上。很多人直接拿未比对的序列去跑建树,得到的不是进化树,而是“相似度聚类图”。

MEGA把比对模块内置在Alignment菜单里,支持ClustalW和MAFFT两种算法,不需要命令行基础。但了解两种算法在MEGA里暴露了哪些参数、哪些参数没有被暴露,仍然能帮你避免一批低级错误。

2.1 在MEGA里导入序列:支持哪些格式,我一般怎么整理成FASTA

MEGA支持MEGA格式(.meg)、FASTA、GenBank、Clustal、PHYLIP等多种格式。我习惯统一用FASTA作为上游格式,因为几乎所有测序平台、序列下载工具和脚本都能读写FASTA,排查问题时不至于在格式转换上浪费时间。

序列ID里不要有空格、括号、逗号或竖线,否则MEGA会把ID截断。我一般写成属名_种名_样本号_序列ID,例如:

>Galgal_c_COI_Seq01 ATGACTTACCAATTCAACTAAGCACACCTCTGATAC >Homsap_mtCOI_Seq02 ATGACTCACCAATTCAACTAAACACACCACTGATA

批量数据我会用Biopython做一次轻量清洗再进MEGA。下面这个脚本会合并多行序列、过滤长度过短或N比例过高的记录,顺便把ID里的非法字符替换掉:

from Bio import SeqIO from Bio.SeqRecord import SeqRecord records = [] for rec in SeqIO.parse("raw.fasta", "fasta"): seq = str(rec.seq).replace("-", "").upper().strip() if len(seq) < 300: print(f"drop too short: {rec.id} len={len(seq)}") continue n_ratio = seq.count("N") / len(seq) if n_ratio > 0.2: print(f"drop too many Ns: {rec.id} N={n_ratio:.2%}") continue clean_id = rec.id.replace(" ", "_").replace("|", "_") records.append(SeqRecord(seq, id=clean_id, description="")) SeqIO.write(records, "clean_sequences.fasta", "fasta")

过滤阈值要按研究目的调整:如果片段本身只有300 bp且位于高变区,len < 300会误删;如果做全长CDS,500 bp以下的信息量往往不足。N比例0.2允许序列两端带一点噪声进入比对,建树前还会再修剪,所以不用太保守。

导入操作:菜单Data → Open a File,选择clean_sequences.fasta,双击打开Alignment Explorer。如果弹窗提示格式无法识别,大概率是序列ID里有非法字符,回到清洗脚本里加一层白名单过滤。

2.2 用ClustalW还是MAFFT:MEGA的参数选择与执行步骤

MEGA的Alignment菜单里有Align by ClustalWAlign by MAFFT两个入口。ClustalW是经典渐近比对算法,先算两两距离,再按向导树把序列逐条加进去,缺点是结果受输入顺序影响,对远端同源片段容易开出过长的gap。MAFFT基于快速傅里叶变换和迭代精炼,速度与准确率在核酸和蛋白序列上都更均衡。

算法适合场景关键参数我通常的设置
ClustalW序列条数<40、长度接近、低gap区域Gap Opening Penalty / Gap Extension Penalty默认15 / 6.66;编码序列勾选Align Codons
MAFFT条数多、长度差异大、含内含子或高变区Gap Open Penalty / Offset默认即可;超过100条序列建议本地用mafft --auto

执行路径:Alignment → Align by ClustalW,弹窗里选Nucleotide或Protein。如果序列是编码蛋白的CDS(从ATG开始、长度为3的倍数),务必勾选Align Codons,让MEGA按密码子整体对齐。不勾选时,gap可能插到密码子内部,产生移码假象,后续建树会把这些位置当缺失处理,白白丢信息。

MEGA内置的MAFFT只开放了Gap Open Penalty和Offset两个参数,外部MAFFT的--maxiterate--ep 0等策略没法在这里完全复现。所以超过100条序列时,我一般本地跑mafft --auto in.fasta > aligned.fasta,再把结果导入MEGA做后续操作。MEGA内置比对适合教学和中小数据集验证,不适合做重型计算。

2.3 比对结果如何修剪和查看:哪一类位点要删除

比对完成后,Alignment Explorer里会用颜色标出保守程度:红色代表高度保守,黄色代表中等,绿色代表低保守。如果两端出现大片绿色或深浅条纹,说明端部没有可比性,应当选中删除。

我按列gap比例做客观修剪:某列超过一半的序列是gap或缺失,该列对建树贡献很小,删掉能减少长分支对树形的干扰。这个脚本可以直接处理比对好的FASTA:

from Bio import AlignIO aln = AlignIO.read("aligned_raw.fasta", "fasta") length = aln.get_alignment_length() keep = [] for i in range(length): col = aln[:, i] gap_ratio = col.count("-") / len(col) if gap_ratio < 0.5: keep.append(i) trimmed = aln[:, keep] AlignIO.write(trimmed, "aligned_trimmed.fasta", "fasta") print(f"kept {len(keep)} / {length} columns")

gap比例阈值不只是“允许位点中有gap”的意思,因为MEGA建树时还有一个独立的site coverage cutoff参数会二次过滤,二者作用不同。非编码区或内含子区域建议把阈值放宽到0.7,否则会删掉真正含有插入缺失信号的位置;CDS则可以用0.5甚至0.3,因为编码区的大段indel本来就不常见。

修剪后的文件保存为.meg格式或直接以FASTA留在工作目录。这一步比后面的模型选择更影响Bootstrap支持率:我见过一组数据,修剪前ML树支持率大面积低于50,相同参数下修剪后普遍回到70以上。

3. 利用MEGA选择替代模型并完成建树:从BIC到Bootstrap

数据干净以后,才进入真正意义上“mega进化树”的操作。很多人会直接进Phylogeny → Construct Tree,用默认K2P模型建树。默认K2P被无数教程使用,但默认不等于正确:K2P假设四种碱基频率相等、两种替换速率相同、所有位点同速进化。线粒体COI这类序列往往AT含量偏高,GC含量明显偏离0.25,K2P的假设从一开始就不成立。

3.1 为什么需要Find Best DNA Model:不做模型选择等于让默认模型替你做判断

MEGA专门提供了模型选择入口:Models → Find Best DNA Model。它会一次性拟合多套替代模型,输出每个模型的BIC、AICc和lnL,并给出推荐模型。模型选择解决的本质问题是:解释同一组序列变异时,用多少参数、哪些参数更划算。参数太少欠拟合,参数太多过拟合,BIC就是两者之间最常用的裁判。

BIC和AIC的差异经常被忽略:AIC在样本量增大时倾向保留更多参数,容易选出GTR+G+I这类复杂模型;BIC对参数数量惩罚更重,选择更保守。现代分子系统发育论文里普遍建议报告BIC选出的模型,避免不必要的过度参数化。如果序列只有1500 bp且亲缘关系很近,BIC选出的可能就是HKY或K2P,这完全正常,不必为了“显得专业”手动改成GTR。

提示:如果BIC最小的两个模型差值小于2,统计上几乎等价,选参数更少的那个更稳妥。

3.2 MEGA构建ML树的路径与三个关键参数

模型选择完成后,建ML树的入口是Phylogeny → Construct/Test Maximum Likelihood Tree。弹出的对话框里,有三个参数必须确认:

参数位置失败后果
Bootstrap次数Test of Phylogeny → Bootstrap method默认100次只够演示,论文级补做1000次
替代模型Model/Method → 与模型选择结果一致不一致会让分支长度和支持率失真
位点速率异质性Rates among Sites → Gamma Discrete替换率异质性强的数据不选Gamma,支持率普遍偏低

Bootstrap次数直接决定运行时间。30条×1500 bp的数据,1000次ML Bootstrap通常几分钟内完成;序列数到100条以后,建议先不开Bootstrap看拓扑,再用1000次验证关键节点。搜索算法方面,MEGA提供NNI和SPR等启发式方法,默认NNI速度快,SPR搜得更彻底但耗时上升。数据量不大时,我一般手动切到SPR。

模型选择窗口里的表,全选复制后可以保存成文本做二次整理。下面这段脚本能快速捞出BIC最小的模型:

with open("model_selection.txt", encoding="utf-8") as f: content = f.read() best_model = None best_bic = float("inf") for line in content.splitlines(): parts = line.split() if len(parts) >= 2 and parts[1].replace(".", "").isdigit(): bic = float(parts[1]) if bic < best_bic: best_bic = bic best_model = parts[0] print(best_model, best_bic)

这里假设复制出来的文本中第一列是模型名、第二列是数字,实际输出结构会因MEGA版本略有差异。跑之前先head看两行,确认BIC列在哪一列。脚本的价值不是省那几秒眼睛,而是把“模型选择”这一步变成可复核的文本记录,写方法部分时直接引用文件名。

3.3 NJ树与ML树怎么配合:两类树的适用节奏

MEGA里同时提供Construct/Test Neighbor-Joining TreeConstruct/Test Maximum Likelihood Tree。NJ是距离法,先算两两遗传距离再聚类,速度极快,对模型依赖小;ML把整棵树的拓扑和分支长度放在同一个似然框架里优化,统计上更强,但计算代价高。

我一般的工作节奏:数据量大时先用NJ出全局拓扑,看哪些分支支持率高、哪些东倒西歪;再对问题分支上ML树精算。NJ在存在长分支时容易产生长枝吸引,所以论文里的主树应优先用ML树,NJ树作为早期探索和对拍工具。把两种方法的结果放在一起看,还能快速暴露异常样本——如果在两棵树里位置分歧明显,多半这条序列需要回查比对。

4. 进化树的结果判读与参数再调整

树出来后,最常见的坑是不会看。一张进化树图片包含三层信息:拓扑结构(谁和谁先分开)、分支长度(累积替换量)、支持率(分叉的可信度)。MEGA默认用百分比显示支持率,越接近100越可靠。但支持率的含义不是“该分叉发生的概率”,而是“Bootstrap重抽样数据集中复现该分叉的频率”。

4.1 从Newick里批量提取支持率:用脚本找出薄弱分支

MEGA可以通过File → Export Current Tree (Newick)把当前树导出为.nwk文本文件。除了拓扑和分支长度,内部节点上还带有Bootstrap支持率。用Biopython解析后,可以批量找出所有支持率低于阈值的内部分支,并看到它们连接的是哪些末端样本:

from Bio import Phylo import io newick_text = open("result.nwk", encoding="utf-8").read() tree = Phylo.read(io.StringIO(newick_text), "newick") low = [] for clade in tree.find_clades(): if not clade.is_terminal() and clade.confidence is not None: descendants = [c.name for c in clade.get_terminals()[:4]] if clade.confidence < 70: low.append((clade.confidence, descendants)) low.sort() for val, tips in low: print(f"{val:3d}% : {', '.join(tips)}")

阈值70对应下方表格中的“中等支持”线。跑完你会得到一份“不稳定分支清单”,后面的数据排查都可以围绕这份清单展开:是某条可疑序列在干扰,还是这个分支本身缺乏信号。脚本没有改变任何参数,它只是把树的内部信息变成可操作的文本。

4.2 Bootstrap支持率的分段解释与常见误区

把Bootstrap值直接当后验概率解读是最常见的错误。Bootstrap的做法是重抽样原始位点列,重新建树,统计目标分支在重复树中出现的比例;后验概率是贝叶斯框架下对拓扑、枝长、模型参数设置先验后算出的条件概率。ML框架下没有后验概率,所以不应该写出“支持率95%即该分支真实概率95%”这类表述。

支持率范围证据强度实际建议
95-100强支持可作为结果重点讨论
70-94中等支持结合形态、地理分布等旁证
50-69弱支持不做结论主干
<50无支持视为未解决分支,不要画实心节点

Bootstrap次数上,有人为了“支持率高”把重复设到5000,跑一整天,最后数值几乎不变。支持率偏低是数据信号或模型问题,不是重复次数的问题,1000次已足够收敛。

4.3 外类群设置:树是“无根”的,方向感全靠外类群

MEGA建出来的ML树默认是无根树,图上所有末端到根的距离不代表演化方向。想让树“有方向”,必须显式指定外类群(Outgroup)。选择原则是:与研究类群亲缘关系最近、但明确不属于该类群的物种,而不是随便抓一个远缘物种。

操作上,在树形窗口里右键点击外类群的末端节点,选择Set as Outgroup,MEGA会重新以它为根绘制有根树。外类群选得太远,会把长分支集中在根部,改变内部节点的相对位置,甚至翻转某些短分支。

提示:如果外类群分支长度显著长于内部分支,优先检查它是不是拼接不完整的序列混进来了。这种假长枝会拖动整个根部的形态。

5. 常见“树不对”的情况与一个保底技巧

5.1 Bootstrap支持率普遍偏低时,先改什么

支持率大面积低于50,先别急着换模型。按顺序检查三处:比对是否做过gap列修剪;是否把内含子和外显子混在同一段里比对;序列末端低质量区域是否已经清除。90%的“ML树跑不出支持率”都出在这三个环节。数据问题排除后,再把均匀速率改成Gamma分布,把Partial deletion的Site Coverage Cutoff调到95%以上,支持率通常能回升10到20个百分点。

也要接受另一种情况:某些分支本身只支持一个无分辨率的多分叉(polytomy)。这时如实报告多分叉,比强行选一个支持率40%的二叉分支更严谨。

5.2 大数据集(大于200条序列)时MEGA还是很慢

MEGA在100条序列以内运转流畅,超过200条以后ML搜索会明显吃力。常见做法是用外部MAFFT做比对,用列覆盖度过滤做修剪,再把结果导入MEGA建NJ树看全局;精细树计算交给RAxML或IQ-TREE这类并行工具。MEGA更适合教学演示、中小数据集的完整流程验证、以及快速跟合作者确认分支关系。

5.3 保底技巧:导出Newick,让所有下游工具都能接手

很多人把MEGA的树截图贴进PPT就结束了,但下游的FigTree、ggtree、iTOL都无法读取图片。正确做法是File → Export Current Tree (Newick),保存一份.nwk文本。之后在FigTree里打开,统一字体、颜色和分支粗细,导出300 dpi的PDF。

我常用的一条经验是:MEGA里的树先导出Newick,再在FigTree里把支持率大于等于70的分支加粗,低于70的用细线或虚线段,审稿人一眼就能看出证据薄弱的节点。树的元数据全部保留在文本文件里,任何时候都能重新读入,比截图可复现得多。配合模型选择时留下的文本记录,整条MEGA建树路径就具备了完整的审计链。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询