简介
FastTree 可以基于核酸或者蛋白多序列比对结果,构建近似最大似然(Approximately-Maximum-Likelihood)系统发育树。 它可以处理多达百万条序列的比对文件,内存和耗时可控。对于大数据集,比 PhyML、RAxML 快 100–1000 倍。 开源地址:
- 官网:FastTree 2.2: Approximately-Maximum-Likelihood Trees for Large Alignments
- Github:GitHub - morgannprice/fasttree: FastTree 2: Approximately-Maximum-Likelihood Trees for Large Alignments · GitHub
精度说明: 默认参数下,FastTree 精度优于 PhyML 3;远优于传统距离矩阵类建树方法。 替换模型:
- 核酸:Jukes-Cantor、GTR
- 蛋白:JTT、WAG、LG 位点异质性:默认采用 CAT 近似模型,给每个位点分配独立进化速率。 分支可靠性:输出 SH-like 局部支持值(和 PhyML3 的 SH-like support 算法一致)。
更多文档入口:
- How:FastTree 2.2: Approximately-Maximum-Likelihood Trees for Large Alignments
- Install:FastTree 2.2: Approximately-Maximum-Likelihood Trees for Large Alignments
- Usage:FastTree 2.2: Approximately-Maximum-Likelihood Trees for Large Alignments
- Performance / Accuracy:FastTree 2.2: Approximately-Maximum-Likelihood Trees for Large Alignments、FastTree 2.2: Approximately-Maximum-Likelihood Trees for Large Alignments
特色功能:
- Gamma20
- OpenMP 多线程
- 自定义替换矩阵
- FAQ
原理:五大建树阶段
- 启发式邻接树(Heuristic Neighbor-Joining)
- 最小进化(Minimum Evolution):NNI + SPR 重排
- 距离校正
- 最大似然拓扑优化与分支长度优化(ML)
- 局部支持值计算(SH test)
1. 启发式邻接树
FastTree 使用改良版邻接算法生成初始拓扑;不存储距离矩阵,而是存储节点 profile,大幅降低内存。 三层启发加速:
- 记录每个节点最优配对
- 爬山搜索寻找更优配对
- top-hits 策略,避免计算全部两两距离
局限:邻接阶段距离没有多重替换校正,会受到长枝吸引(LBA)影响,后续最小进化阶段修正这个问题。
2. 最小进化 ME 阶段
通过 NNI、SPR 重排,不断降低总树长;和 FastME 思路接近,但基于 profile 而非距离矩阵,速度更快。 默认:4*log2(N)轮 NNI,2 轮 SPR。 SPR 代价高,FastTree 将 SPR 拆解成一串 NNI,只延伸最优分支链。 在噪声不大的距离矩阵下,NNI+SPR 足以收敛到较优拓扑。
距离计算规则:
- 蛋白:BLOSUM45 矩阵,校正公式
-1.3 * log(1-d) - 核酸:JC 距离
-0.75*log(1 - 4/3 d) - 两条序列比对:gap 位点直接忽略;两个 profile 比对:按非 gap 比例加权
3. 最大似然 ML 优化
在 ME 树基础上,同时优化拓扑 + 枝长。 模型:JC / GTR(核酸);JTT / WAG / LG(蛋白)。 CAT 模型:默认 20 个速率分类,速率几何分布 0.05~20;贝叶斯先验分配每个位点到最可能速率组,避免小比对过拟合。
ML 搜索提速策略(也是和 RAxML 核心区别):
- 只做 NNI,不做 SPR
- 同一时间只维护一棵拓扑
- 位点速率、模型参数只优化一次,不每轮 NNI 都重算
- NNI 之间不单独迭代优化枝长
- 枝长收敛阈值:0.0001 或者 枝长的 0.1%,取较大值
- 四元组似然优化最多 2 轮;第一轮后似然差 > 5 则直接抛弃该拓扑
- 连续两轮似然提升不足 0.1 的子树直接跳过
- 分支稳定、显著优于星型树时,不再尝试替代拓扑
- 限制 NNI 轮次上限
2*log2(N),保证运行时间可控(一般提前收敛)
4. 局部支持值 SH-like support
对每个分支拆分,评估 3 种四元组拓扑(A,B),(C,D)/(A,C),(B,D)/(A,D),(B,C),使用 SH 检验对比。
说明:使用 CAT 近似、不完整重优化枝长,结果和 PhyML3 的 SH-like 支持几乎一致;两者默认 1000 次重采样,重采样比对不重新优化枝长。
👉 传统 bootstrap 怎么做(FastTree 不内置):
- seqboot(phylip)生成重采样比对
- FastTree
-n批量分析所有重采样比对 - CompareToBootstrap.pl 对比原始树和 bootstrap 树 超大比对推荐
-intree1全局快速 bootstrap:以原始比对树作为每一轮重采样的起始树,速度很快,相关性高(r=0.975)。 关闭 ML 阶段-noml,则会使用旧版最小进化局部 bootstrap。
编译 & 安装 FastTree
可执行文件:
- FastTree 单线程版
- FastTreeMP OpenMP 多线程版
- FastTree.exe Windows 版
- FastTree.c 源码
单线程编译
gcc -O3 -fopenmp-simd -funsafe-math-optimizations -march=native -o FastTree FastTree.c -lmMac 注意:需要安装 Xcode 命令行工具;
-finline-functions可能报错,可删掉。
多线程 FastTreeMP
gcc -DOPENMP -O3 -fopenmp -fopenmp-simd -funsafe-math-optimizations -march=native -o FastTree FastTree.c -lmMac 原生 clang 对 OpenMP 支持差,建议换 gcc。
开源协议:自由修改分发;改进建议发邮件 fasttree@microbesonline.org。 历史版本:ChangeLog.txt/github old 分支。
运行命令(重点,你跑 TE 树高频用)
✅ 蛋白比对,默认 JTT+CAT
FastTree < alignment_file > tree_file # 或者 FastTree alignment.file > tree_file✅ 蛋白换成 WAG / LG(你 Gypsy RT 蛋白树常用 LG)
FastTree -lg pep.aln > tree.newick FastTree -wag pep.aln > tree.newick✅ 核酸比对 GTR+CAT
FastTree -gtr -nt < alignment.file > tree_file不加-gtr则默认 JC+CAT。
✅-gamma:CAT 跑完之后,重新缩放枝长,输出 Gamma20 似然值
速度仅慢约 5%;Gamma 似然跨样本可比,适合拓扑 SH/AU 检验,搭配
-log。
FastTree -gamma -lg pep.aln > tree.newickWindows:cmd 运行;Linux/Mac:
./FastTree查看参数:直接敲 FastTree 或者FastTree -help(⚠️ 没有-h)
输入格式
支持 FASTA、交错 PHYLIP。
- 序列 ID 必须唯一
- 序列名不要包含
: , ( ),否则 newick 树无法解析 - FASTA:> 后第一个空格后的内容默认丢弃;
-quote开启保留空格(单引号除外,输出树加引号,后续 FastTree 无法再读取这棵树) - PHYLIP:支持长 ID,块之间名字对齐;单文件可放多个比对,搭配
-n
输出格式
标准 Newick;树根位置无生物学意义。 内部节点携带 SH 支持值,范围0~1,不是 0~100。 完全相同序列会产生多歧分支;冗余序列的父节点无支持值。 可视化工具:MEGA、iTOL。
速度、复杂度、实测数据
单线程基准测试:
| 数据集 | 序列数 | 比对长度 | 模型 | 耗时 | 内存 | RAxML/PhyML 耗时 |
|---|---|---|---|---|---|---|
| 外排通透酶 COG2814 | 8362 | 394 aa | JTT+CAT | 0.25 h | 0.35 GB | >1200h |
| ABC 转运蛋白 PF00005 | 39092 | 214 aa | JTT+CAT | 1 h | 0.96 GB | —— |
| 16S rRNA | 15011 | 1287 nt | GTR+CAT | 0.66 h | 0.56 GB | 99h |
| 16S rRNA | 15011 | 1287 nt | JC+CAT | 0.49 h | 0.36 GB | —— |
| 16S rRNA | 237882 | 1287 nt | JC+CAT -fastest | 21.8 h | 5.8 GB | —— |
复杂度:
- 默认:空间 O (N L a + N^1.5),时间 O (N^1.5 log (N) L a)
-fastest:空间 O (N L a + N^1.25),时间 O (N^1.25 L a)
N = 序列数,L = 比对长度,a = 字母表大小(核酸 4,蛋白 20)
237k 16S 案例时间拆分(-fastest):邻接阶段最耗时;ML NNI 是每轮最慢的步骤。 FastTreeMP 3 线程一般提速 1.5~1.7 倍;邻接阶段可多线程,ML NNI、ME 阶段不并行。
精度对比小结
- 对比 PhyML3(仅 NNI):FastTree 略准(得益于 ME-SPR 初始树)
- 对比 RAxML/PhyML(带 SPR 全搜索):FastTree 精度略低,但速度快几百倍;两者不一致的分支大多支持度很低
- 模拟数据:几千~几万条序列,拓扑正确率很高;大数据集非常划算
似然对比(500 条 16S 子集): RAxML GTR+Γ4 > FastTree GTR+CAT > PhyML3 GTR+Γ4 > PhyML3 HKY+Γ4 > FastTree JC+CAT
500 条 COG 蛋白家族也有相同趋势。
OpenMP 多线程 FastTreeMP
并行模块:top-hits、NJ 节点距离比对、ML NNI 的 3 个拓扑似然、SH 支持计算。 ⚠️ 重要:FastTreeMP非确定性,多线程调度顺序会影响 NJ 启发搜索,树拓扑可能轻微变化,但质量基本一致。 控制线程数:
export OMP_NUM_THREADS=3 ./FastTreeMP -lg pep.aln > tree.newick运行
FastTreeMP -help会打印当前线程设置。
CAT / Gamma20 模型详解
-gamma:先用 CAT 模型优化树,再缩放枝长,计算 Gamma20 离散伽马似然。 Gamma20 优势:跨运行可比;大数据下甚至优于很多工具 Gamma4。 局限:
- 核酸 GTR+Gamma20,速率参数没有完全优化,精度略降
- 少于 50 条序列的小比对不推荐,位点速率估计误差大
- Gamma20 似然和别的软件 Gamma4 不能直接等价对比
原理:预先计算 20 个固定速率(0.05~20)的位点似然,Brent 法优化 Gamma 形状参数 α。 常规 Gamma 是等概率离散区间;FastTree Gamma20 是按连续 Gamma 积分分配每个速率的权重。
自定义氨基酸替换矩阵-trans
仅蛋白、仅 ML 阶段生效;ME 阶段用-matrix/-nomatrix。 矩阵是制表符分隔,顺序:A R N D C Q E G H I L K M F P S T W Y V *,最后一列是稳态频率 π。 校验条件:
- π 全部 > 0
- π 总和 = 1
- Q 对角元为负,非对角元≥0
- Q・π = 0(稳态)
- ∑Qᵢᵢπᵢ = -1(平均突变速率 = 1)
- 时间可逆 Qᵢⱼ / Qⱼᵢ = πᵢ / πⱼ
单精度版本容易数值不稳定,自定义矩阵优先用默认双精度版。
FAQ(高频踩坑,你跑 TE 树经常遇到)
Q1:必须要比对好的序列吗?
✅ 是。
- 蛋白家族:muscle /hmmalign;hmmalign 小写是未匹配结构域,建议删掉
- RNA:infernal
- 修剪:Gblocks /trimal 去除低质量 gap 列
Q2:报未识别字符?
只识别: 核酸:A C G T(U 兼容) 蛋白:20 标准氨基酸;gap-其他字符(N、R、X、Z、U 硒代半胱氨酸)都会告警,当成缺失。
Q3:大量 0.0001/0.0005 甚至负枝长?
-noml最小进化阶段:负枝长是噪声,代表该分支极短、不确定- 旧单精度版本:枝长下限 0.0001;新版单精度 0.0005
- 需要精确短枝:用默认双精度版本
Q4:怎么加速?
-fastest:>5 万序列首选,NJ 阶段大幅提速- FastTreeMP 多线程
-mlnni 4减少 ML NNI 轮次-noml直接关掉 ML(不推荐正式文章)- 过滤大量 gap 列、提前聚类去冗余序列(usearch)
Q5:怎么提高精度?
-pseudo:大量碎片化序列(很多 gap)推荐-spr 4:增加 ME 阶段 SPR 轮次-mlacc 2 -slownni:ML 搜索更彻底(≈4 倍慢)-fastest -no2nd:超大数据集,NJ 阶段更保守,小幅提升精度
Q6:不同拓扑做 SH/AU 检验?
搭配-gamma -log,输出位点似然,用 CONSEL 包做拓扑检验。 固定拓扑只优化枝长:
FastTree -gamma -nt -gtr -nome -mllen -intree top1.newick -log top1.log aln.fasta > top1.ftlen FastTree -gamma -nt -gtr -nome -mllen -intree top2.newick -log top2.log aln.fasta > top2.ftlen perl GammaLogToPaup.pl top1.log top2.log > top12.txt makermt --paup top12.txt consel top12 catpv top12.pv⚠️ 坑:不要漏写 log 文件名,否则会覆盖比对文件!
Q7:树根有生物学意义吗?
❌ FastTree 输出无根树,根位置是程序随便放的。 校正:外类群重根 / 中点根;超大树可以用自带 reroot.pl。
Q8:是否可复现?
- 单线程:确定可复现;跨平台浮点误差很小,似然几乎一致
- FastTreeMP:非确定性,线程调度影响 NJ 启发,树会轻微变化,质量不变
- SH 支持值有随机种子,每次运行会浮动
Q9:-intree -nome -mllen拓扑变了?
如果比对里有完全相同序列,输入树里这些相同序列放在不同位置,FastTree 内部会合并,输出树会统一放到同一个位置,拓扑改变,无告警。
Q10:全基因组超宽比对内存爆炸?
FastTree 擅长序列多、比对短;不擅长比对长度极大。
- 支持值计算内存:8 * 1000 * L bytes,百万位点就要 8GB
- 方案 1:
-nosupport关闭支持值 - 方案 2:
-boot 100减少重采样次数 - 方案 3:JC 模型、
-noml降低内存
宽比对支持值本身参考意义有限,重组会破坏系统发育假设。
适合你的常用命令汇总(Gypsy/Copia RT 蛋白树)
# LG模型(推荐,和IQ-TREE一致) FastTree -lg -gamma -log tree.log Gypsy_rt.aln > Gypsy_rt.newick # 关闭支持值,极速跑海量TE FastTree -lg -nosupport Gypsy_rt.aln > Gypsy_rt.newick # 五万条以上超大TE数据集 FastTree -lg -fastest Gypsy_rt.aln > Gypsy_rt.newick参考文献:
- Price, M.N., Dehal, P.S., and Arkin, A.P. (2009) FastTree: Computing Large Minimum-Evolution Trees with Profiles instead of a Distance Matrix.Molecular Biology and Evolution26:1641-1650, doi:10.1093/molbev/msp077.
- Price, M.N., Dehal, P.S., and Arkin, A.P. (2010) FastTree 2 -- Approximately Maximum-Likelihood Trees for Large Alignments.PLoS ONE, 5(3):e9490. doi:10.1371/journal.pone.0009490.