ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

FastTree v2.2.0安装与使用--生信工具116

FastTree v2.2.0安装与使用--生信工具116

简介

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

原理:五大建树阶段

  1. 启发式邻接树(Heuristic Neighbor-Joining)
  2. 最小进化(Minimum Evolution):NNI + SPR 重排
  3. 距离校正
  4. 最大似然拓扑优化与分支长度优化(ML)
  5. 局部支持值计算(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 不内置):

  1. seqboot(phylip)生成重采样比对
  2. FastTree-n批量分析所有重采样比对
  3. 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 -lm

Mac 注意:需要安装 Xcode 命令行工具;-finline-functions可能报错,可删掉。

多线程 FastTreeMP

gcc -DOPENMP -O3 -fopenmp -fopenmp-simd -funsafe-math-optimizations -march=native -o FastTree FastTree.c -lm

Mac 原生 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.newick

Windows: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 耗时
外排通透酶 COG28148362394 aaJTT+CAT0.25 h0.35 GB>1200h
ABC 转运蛋白 PF0000539092214 aaJTT+CAT1 h0.96 GB——
16S rRNA150111287 ntGTR+CAT0.66 h0.56 GB99h
16S rRNA150111287 ntJC+CAT0.49 h0.36 GB——
16S rRNA2378821287 ntJC+CAT -fastest21.8 h5.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 *,最后一列是稳态频率 π。 校验条件:

  1. π 全部 > 0
  2. π 总和 = 1
  3. Q 对角元为负,非对角元≥0
  4. Q・π = 0(稳态)
  5. ∑Qᵢᵢπᵢ = -1(平均突变速率 = 1)
  6. 时间可逆 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:怎么加速?

  1. -fastest:>5 万序列首选,NJ 阶段大幅提速
  2. FastTreeMP 多线程
  3. -mlnni 4减少 ML NNI 轮次
  4. -noml直接关掉 ML(不推荐正式文章)
  5. 过滤大量 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

参考文献:

  1. 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.
  2. 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.
返回列表