IQTREE 使用记录
2024-06-25 00:00:38  阅读数 9036

什么是iqtree?

iqtree是一款构建进化树的软件,类似于phyml,raxml。
文章地址:W-IQ-TREE: a fast online phylogenetic tool for maximum likelihood analysis | Nucleic Acids Research | Oxford Academic (oup.com)

官方说这款软件相比于其他构树软件的优势在于:

  • 支持快速的bootstrap方法计算(Ultrafast bootstrap)
  • 相比于jModelTest和ProtTest能够更快的进行构树模型的选择
  • 能够对更大的数据集进行建树:几千条序列或者百万个位点
  • 支持快速的系统发育关系检验方法:SH-aLRT 和 aBayes test

这款软件有本地版和在线版,在线版网址为IQTREE Web Server: Fast and accurate phylogenetic trees under maximum likelihood (univie.ac.at),这个网址能运行时间不超过24小时的分析。

iqtree 使用

iqtree软件需要的输入文件是任意比对好的序列文件,氨基酸和核苷酸的比对可以通过mafft、clustalw软件或其他比对软件进行。最简单的的运行iqtree方式是:

iqtree -s example.phy

一般会输出如下的文件:

example.phy.iqtree
example.phy.treefile
c.contree
example.phy.log
example.phy.ckp.gz
example.phy.bionj
example.phy.mldist
example.phy.model.gz.
example.phy.splits.nex

其中iqtree后缀文件可以以文本形式看到输出的树,如:

treefile后缀文件是后续画图或进行选择分析所需要的树文件,这个文件是NEWICK格式的,可以直接输入到paml或者hyphy中。如:(sp3,(sp1,sp2));

在得到前面的输出后,如果还想加参数重新建树,在当前目录下运行一般会报错ERROR: Checkpoint (example.phy.ckp.gz) indicates that a previous run successfully finished
这时候可以通过参数-redo再重新跑一次,这个参数会丢弃原来所有输出重新进行分析。

如果要设置不同的参数去测试建树的结构,那可能会需要将输出文件改名或放在另一文件夹下。可以使用参数-prefix进行设置:

iqtree -s example.phy -pre ../example.c1    #放在上级目录中,以example.c1命名输出文件

iqtree一般会根据输入文件自己去测试最佳建树模型,但如果你已经用其他软件去预测过最佳模型,只想用iqtree快速的建个树,可以用-m XXX进行建树模型的设置。

想要更快的建树,可以设置多线程运行-T,使用下来-T AUTO是最方便的,让iqtree根据自身需要去设置相应核数,如果盲目设置过高核数,有时候还会比AUTO的时间更长,除此之外,如果想节省计算资源,可以通过-cmax进行设置。如果说不需要用bootstrap自举树结构,那单核速度会更快,AUTO在序列较长和算bootstrap value的时候更加有效

建树结果的可信度一般用自举值来衡量,也就是bootstrap,可以通过-b来设置,标准的自举值不小于100,iqtree的一大特色就是其快速自举-bb,设置值不少于1000,一般来说标准的自举值在80%以上我们认为是可信的,快速自举则要求在95%以上,官方还推荐使用-alrt进行SH-test,在快速自举>95%及alrt>80时认为结果可靠。
如果在没遇到报错的情况下,个人推荐使用标准自举值建树,但不想耗费太多资源并节约时间可以使用快速自举。

所以对于一般的核苷酸序列建树,可以使用的命令是:

iqtree -s example.phy -T AUTO -b 1000
或
iqtree -s example.phy -T AUTO -bb 1000 -alrt 1000

如果需要用密码子模型或氨基酸模型建树:

iqtree -s example.phy -T AUTO -b 1000 -st CODON  #服从标准密码子分布
iqtree -s example.phy -T AUTO -b 1000 -st CODON5  #无脊椎动物线粒体密码子模型
iqtree -s example.phy -T AUTO -b 1000 -st AA #氨基酸模型
一些可能会用到的信息:

100条序列800个位点的文件跑自举值1000的核苷酸模型需要5-8小时,密码子模型需要13-24小时,最开始跑密码子模型时会消耗大量运算资源,基本就是有多少用多少,这个时间大概会持续半小时。

使用密码子模型的报错记录及可能的解决方案

iqtree version: 2.2.0

报错①
ERROR: iqtree.cpp:3105: virtual std::pair<int, int> IQTree::optimizeNNI(bool): Assertion `curScore > appliedNNIs.at(0).newloglh - 0.1' failed.
ERROR: STACK TRACE FOR DEBUGGING:
ERROR: 1   funcAbort()
ERROR: 2   ()
ERROR: 3   gsignal()
ERROR: 4   abort()
ERROR: 5   ()
ERROR: 6   IQTree::optimizeNNI(bool)
ERROR: 7   IQTree::doNNISearch(bool)
ERROR: 8   IQTree::doTreeSearch()
ERROR: 9   runTreeReconstruction(Params&, IQTree*&)
ERROR: 10   runStandardBootstrap(Params&, Alignment*, IQTree*)
ERROR: 11   runPhyloAnalysis(Params&, Checkpoint*, IQTree*&, Alignment*&)
ERROR: 12   runPhyloAnalysis(Params&, Checkpoint*)
ERROR: 13   main()
ERROR: 14   __libc_start_main()
ERROR: 15   ()
ERROR: 
ERROR: *** IQ-TREE CRASHES WITH SIGNAL ABORTED
ERROR: *** For bug report please send to developers:
ERROR: ***    Log file: dnacodon_catalytic_segment2.log
ERROR: ***    Alignment files (if possible)
可能的问题及解决方案

NNI(nearest-neighbour interchange algorithm),是一种搜索邻近枝的算法,官方说可能的报错原因有:算法算的时候枝长是负数;模型冲突
解决方案:
①使用 -bnni解决在快速自举中的模型冲突
②使用 -keep-ident维持原有序列(iqtree在建树时会忽略所有位点都是gap的位点)

报错②
ERROR: phylokernelnew.h:3332: double PhyloTree::computeLikelihoodFromBufferGenericSIMD() [with VectorClass = Vec4d; bool FMA = true; bool SITE_MODEL = false]: Assertion `std::isfinite(tree_lh) && "Numerical underflow for lh-from-buffer"' failed.
ERROR: STACK TRACE FOR DEBUGGING:
ERROR: 1   funcAbort()
ERROR: 2   ()
ERROR: 3   gsignal()
ERROR: 4   abort()
ERROR: 5   ()
ERROR: 6   double PhyloTree::computeLikelihoodFromBufferGenericSIMD<Vec4d, true, false>()
ERROR: 7   PhyloTree::getBestNNIForBran(PhyloNode*, PhyloNode*, NNIMove*)
ERROR: 8   IQTree::evaluateNNIs(std::map<int, std::pair<Node*, Node*>, std::less<int>, std::allocator<std::pair<int const, std::pair<Node*, Node*> > > >&, std::vector<NNIMove, std::allocator<NNIMove> >&)
ERROR: 9   IQTree::optimizeNNI(bool)
ERROR: 10   IQTree::doNNISearch(bool)
ERROR: 11   IQTree::initCandidateTreeSet(int, int)
ERROR: 12   IQTree::doTreeSearch()
ERROR: 13   runTreeReconstruction(Params&, IQTree*&)
ERROR: 14   runStandardBootstrap(Params&, Alignment*, IQTree*)
ERROR: 15   runPhyloAnalysis(Params&, Checkpoint*, IQTree*&, Alignment*&)
ERROR: 16   runPhyloAnalysis(Params&, Checkpoint*)
ERROR: 17   main()
ERROR: 18   __libc_start_main()
ERROR: 19   ()
ERROR: 
ERROR: *** IQ-TREE CRASHES WITH SIGNAL ABORTED
ERROR: *** For bug report please send to developers:
ERROR: ***    Log file: dnacodon_seg2.log
ERROR: ***    Alignment files (if possible)
可能的问题及解决方案

数值不稳定、数值溢出?或者EM模型不适用
解决方案有:
①使用-m TEST去忽略一些自由参数比较多的模型;
②使用-optalg BFGS不使用EM算法

虽然搜索到了一些解决方案,但可惜的是,对我都不奏效,最后是放弃了标准自举使用快速自举才没有报错,如果你也是上述解决方案都不奏效,可以试试改成快速自举。
希望对你有用,欢迎讨论。

参考:
http://www.iqtree.org/doc/
IQ-TREE的使用 - 超快速用极大似然法构建进化树 - 简书 (jianshu.com)
https://groups.google.com/g/iqtree