原文链接《 Data Integration, Manipulation and Visualization of Phylogenetic Trees》
1、树文件输入
1.1系统发育树构建综述
系统发育树是一种描述一群生物之间亲缘关系的树,它可以根据生物的遗传序列来构建。根状的系统发育树表示一种进化历史模型,该模型由树节点之间的祖先-后代关系和不同亲缘程度的姐妹或表亲生物体的聚类关系所描述,如图1.1所示。在传染病研究中,系统发育树通常由病原体基因或基因组序列构建,以显示哪个病原体样本在遗传上更接近另一个样本,从而为未观察到的潜在流行病学联系和暴发的潜在来源提供见解。
系统发育树可以用基于距离的方法或基于字符的方法由遗传序列构建。基于距离的方法,包括UPGMA (unweighted pair group method with算术均值法)和NJ (Neighbor-joining法),都是基于序列间的两两遗传距离矩阵。基于字符的方法,包括最大节约法(MP) (Fitch 1971)
、最大似然法(ML) (J. Felsenstein 1981)和贝叶斯马尔科夫链蒙特卡罗法(BMCMC) (Rannala and Yang 1996),基于描述遗传特征演化的数学模型,并根据其最优性准则寻找最佳的系统发育树。
最大简约(MP)方法假设进化变化是罕见的,并将特征状态变化的数量最小化(例如,DNA替换的数量)。这一标准类似于奥卡姆的剃刀,即能够解释数据的最简单的假设就是最好的假设。不加权简约法假设不同字符(核苷酸或氨基酸)的突变是等可能的,而加权法假设突变的不均等可能(例如,第三个密码子位置比其他密码子位置更容易发生突变;而且过渡突变的频率比反转突变高)。MP方法的概念是直接和直观的,这可能是它在生物学家中流行的原因,他们更关心研究问题,而不是分析的计算细节。然而,这种方法有几个缺点,特别是树推理可能会受到众所周知的系统错误——长分枝吸引(long-branch attraction, LBA)——的影响,它错误地将远亲谱系推断为近亲 (Joseph Felsenstein 1978)。这是因为MP方法较差地考虑了从现有遗传数据中很难观察到的许多序列进化因素(如逆转和收敛)。
最大似然法(ML)和贝叶斯马尔可夫链蒙特卡罗法(BMCMC)是构建系统发育树最常用的两种方法,也是科学出版物中最常用的方法。ML和BMCMC方法需要序列演化的替代模型。不同的序列数据有不同的替代模型来表述DNA、密码子和氨基酸的进化过程。目前有几种核苷酸取代模型,包括JC69、K2P、F81、HKY和GTR (Arenas 2015)。这些模型可结合各站点间的比率变化(记作+ Γ) (Z. Yang 1994)和不变站点的比例(记作+I) (Shoemaker and Fitch 1989)使用。之前的研究 (Lemmon and Moriarty 2004)表明,对替代模型的错误说明可能会导致系统发育推断的偏差。推荐对最适合的替换模型进行过程测试。
ML方法的最优准则是找到给定序列数据的最大似然树。ML方法的过程很简单:计算一棵树的可能性,并优化其拓扑和分支(以及替代模型参数,如果不是固定的),直到找到最好的树。启发式搜索,例如那些在PhyML和RAxML中实现的搜索,通常用于基于似然准则寻找最佳树。贝叶斯方法基于给定的替换模型,通过MCMC对树进行抽样,找到后验概率最大的树。BMCMC的优点之一是,在MCMC过程中,可以自然、方便地从采样树中获得包含后验枝概率的参数方差和树的拓扑不确定性。此外,拓扑不确定性对其他参数估计的影响也自然地集成到BMCMC系统发育框架中。
在一个简单的系统发育树中,与树分支/节点相关的数据可以是分支长度(表明遗传或时间发散)和谱系支持,如bootstrap程序估计的bootstrap值或BMCMC分析中从采样树中总结的后验进化枝概率。
1.2系统发育树格式
有几种文件格式设计用于存储系统发育树以及与节点和分支相关的数据。三种常用的格式是Newick3, NEXUS (Maddison et al. 1997)和Phylip (Joseph Felsenstein 1989)。一些格式(例如,NHX)是从Newick格式扩展而来的。大多数进化生物学软件都支持Newick和NEXUS格式作为输入,而一些软件工具则通过引入新的规则/数据块来存储进化推理,从而输出更新的标准文件(如 BEAST
和MrBayes)。在其他情况下(例如,PAML和 r8s),输出日志文件只能由它们自己的单一软件识别。
1.2.1 Newich 格式
Newick树格式是用计算机可读形式表示树的标准格式。
用于演示Newick文本编码树结构的示例树。尖端对齐到右边,树枝的长度被标记在每个树枝的中间。
图1.2中所示的根树可以用以下字符序列表示为Newick树文本。
((t2:0.04,t1:0.34):0.89,(t5:0.37,(t4:0.03,t3:0.67):0.9):0.59);
Newick格式以分号结束。内部节点由一对匹配的圆括号表示。括号之间是该节点的后代节点。例如(t2:0.04,t1:0.34)表示t2和t1的父节点,它们是直系后代。同级节点由逗号分隔,提示由名称表示。分支长度(从父节点到子节点)由子节点之后和冒号前面的实数表示。与内部节点或分支相关联的奇异数据(例如,引导值)可以编码为节点标签,并用冒号前的简单文本/数字表示。
Newick树的格式是由Meacham在1984年开发的 PHYLIP (Retief 2000)包。Newick格式现在是最广泛使用的树格式,使用的是 PHYLIP, PAUP* (Wilgenbusch and Swofford 2003), TREE-PUZZLE (Schmidt et al. 2002), MrBayes和许多其他应用。Phylip tree格式包含了一种基于MSA序列在同一文件中构建的相应Newick树文本的Phylip多重序列对齐(MSA)。
1.2.2 NEXUS tree format
NEXUS格式 (Maddison et al. 1997)
将Newick树形文本与相关信息组织成称为块的独立单元。NEXUS块具有以下结构
#NEXUS
...
BEGIN characters;
...
END;
上面的示例树可以保存为以下NEXUS格式:
#NEXUS
[R-package APE, Fri Dec 31 09:56:12 2021]
BEGIN TAXA;
DIMENSIONS NTAX = 5;
TAXLABELS
t2
t1
t5
t4
t3
;
END;
BEGIN TREES;
TRANSLATE
1 t2,
2 t1,
3 t5,
4 t4,
5 t3
;
TREE * UNTITLED = [&R] ((1:0.04,2:0.34):0.89,(3:0.37,(4:0.03,5:0.67):0.9):0.59);
END;
可以使用方括号放置注释。大多数程序都能识别出一些块,包括TAXA(包含分类单元信息)、DATA(包含数据矩阵,如序列比对)和TREE(包含系统发育树,即Newick树文本)。值得注意的是,块可以非常多样化,其中一些块只能被一个特定的程序识别。例如,由 PAUP*导出的NEXUS文件有一个包含PAUP*命令的PAUP块,而 FigTree导出的NEXUS文件有一个包含可视化设置的FigTree块。NEXUS将不同类型的数据组织成不同的块,而支持读取NEXUS的程序可以解析一些它们识别到的块,并忽略那些它们无法识别的块。这是一种很好的机制,允许不同的程序使用相同的格式,而不会在出现不支持的数据类型时崩溃。值得注意的是,大多数程序只支持TAXA、DATA和TREE块的解析,因此,能够从NEXUS中通用地读取所有类型的数据块的程序/平台将对系统发育数据集成非常有用。
数据块广泛用于存储序列对齐。为此,用户可以以Phylip格式存储树和序列数据,这实际上分别是Phylip多序列对齐和Newick树文本。它用于系统发育分析包(PHYLIP)。
1.2.3新Hampshire扩展格式
Newick、NEXUS和phylip主要用于存储系统发育树和与内部节点或分支相关的基本奇异数据( basic singular data)。除了分支和节点上的奇异数据注释(上面提到过),基于Newick(也称为New Hampshire)的新Hampshire扩展格式(New Hampshire eXtended format, NHX)被开发出来,用来引入标签,将多个数据字段与树节点(内部节点和提示)关联起来。标签放置在分支长度之后,必须在[&&NHX and]之间包装,这使得它可能与NEXUS格式兼容,因为它定义了[和]之间的注释字符。NHX也是 PHYLDOG (Boussau et al. 2013) 和 RevBayes (Höhna et al. 2016)。r (ATV) (Zmasek and Eddy 2001)是一个java工具,它支持显示以NHX格式存储的注释数据,但是这个包不再更新了。
下面是一个NHX格式的文档
(((ADH2:0.1[&&NHX:S=human], ADH1:0.11[&&NHX:S=human]):0.05
[&&NHX:S=primates:D=Y:B=100],ADHY:0.1[&&NHX:S=nematode],
ADHX:0.12[&&NHX:S=insect]):0.1[&&NHX:S=metazoa:D=N],(ADH4:0.09
[&&NHX:S=yeast],ADH3:0.13[&&NHX:S=yeast],ADH2:0.12[&&NHX:S=yeast],
ADH1:0.11[&&NHX:S=yeast]):0.1[&&NHX:S=Fungi])[&&NHX:D=N];
1.2.4 Jplace 格式
为了存储映射到系统发育树上的NGS短序列(用于宏基因组分类),Matsen提出了这种系统发育位置的jplace格式 (Frederick A. Matsen et al. 2012)。Jplace格式基于JSON,包含四个键:树、字段、位置、元数据和版本。树值包含从Newick树格式扩展而来的树文本,方法是将边缘标签放在括号中(如果可用),然后在分支长度之后,将边缘编号放在花括号中,放在边缘标签之后。字段值包含位置数据的头信息。位置的值是一个pquery列表。每个pquery包含两个键:p表示位置,n表示名称或nm表示具有多重性的名称。p的值是该pquery的位置列表。
下面是一个jplace格式文件
{
"tree": "(((((((A:4{1},B:4{2}):6{3},C:5{4}):8{5},D:6{6}):
3{7},E:21{8}):10{9},((F:4{10},G:12{11}):14{12},H:8{13}):
13{14}):13{15},((I:5{16},J:2{17}):30{18},(K:11{19},
L:11{20}):2{21}):17{22}):4{23},M:56{24});",
"placements": [
{"p":[24, -61371.300778, 0.333344, 0.000003, 0.003887],
"n":["AA"]
},
{"p":[[1, -61312.210786, 0.333335, 0.000001, 0.000003],
[2, -61322.210823, 0.333322, 0.000003, 0.000003],
[3, -61352.210823, 0.333322, 0.000961, 0.000003]],
"n":["BB"]
},
{"p":[[8, -61312.229128, 0.200011, 0.000001, 0.000003],
[9, -61322.229179, 0.200000, 0.000003, 0.000003],
[10, -61342.229223, 0.199992, 0.000003, 0.000003]],
"n":["CC"]
}
],
"metadata": {"info": "a jplace sample file"},
"version" : 2,
"fields": ["edge_num", "likelihood", "like_weight_ratio",
"distal_length", "pendant_length"
]
}
Jplace是 PPLACER (Frederick A. Matsen, Kodner, and Armbrust 2010b)和 (EPA) (Berger, Krompass, and Stamatakis 2011)的输出格式。但是这两个程序不包含可视化工具。PPLACER提供placeviz来将jplace文件转换为系统演化xml或Newick格式,Archaeopteryx可以将其可视化。
1.2.5软件输出
RAxML (Stamatakis 2014)可以通过将bootstrap值存储为内部节点标签来输出Newick格式。RAxML支持的另一种方式是将bootstrap值放在方括号内和分支长度之后。这不能被大多数支持Newick格式的软件支持,方括号将被忽略。
BEAST (Bouckaert et al. 2014)的输出是基于NEXUS的,并且在树块中引入了方括号来存储BEAST推断出的进化证据。在括号内,如果特征值的长度超过1(例如HPD或替代率范围),也可以加入花括号。这些括号放在节点长度和分支长度之间(即,如果存在,则放在label之后,冒号之前)。括号不是Newick格式定义的,它是NEXUS注释的保留字符。因此,对于标准的NEXUS解析器,这些信息将被忽略。
下面是一个BEAST模块输出格式
TREE * TREE1 = [&R] (((11[&length=9.47]:9.39,14[&length=6.47]:6.39)[&length=25.72]:25.44,4[&length=9.14]:8.82)[&length=3.01]:3.1,
(12[&length=0.62]:0.57,(10[&length=1.6]:1.56,(7[&length=5.21]:5.19,
((((2[&length=3.3]:3.26,(1[&length=1.34]:1.32,(6[&length=0.85]:0.83,
13[&length=0.85]:0.83)[&length=2.5]:2.49)[&length=0.97]:0.94)
[&length=0.5]:0.5,9[&length=1.76]:1.76)[&length=2.41]:2.36,
8[&length=2.19]:2.11)[&length=0.27]:0.24,(3[&length=3.33]:3.31,
(15[&length=5.29]:5.27,5[&length=3.29]:3.27)[&length=1.04]:1.04)
[&length=1.98]:2.04)[&length=2.83]:2.84)[&length=5.39]:5.37)
[&length=2.02]:2)[&length=4.35]:4.36)[&length=0];
BEAST输出可以包含许多不同的进化推理,这取决于在BEAUTi中定义的用于运行的分析模型。例如在分子时钟分析中,它包含速率、长度、高度、后验和相应的HPD以及用于不确定度估计的范围。速率是该分支的估计进化速率。长度是指树枝的长度,以年为单位。高度为节点到根的时间,后验为贝叶斯演化支可信度值。上面的例子是分子时钟分析的输出树,应该包含这些推论。为了节省空间,上面只显示了长度估计。此外,分子进化遗传学分析 (MEGA) (Kumar, Stecher, and Tamura 2016)也支持以BEAST兼容的Nexus格式导出树(见1.3.2节)。
MrBayes (Huelsenbeck and Ronquist 2001)是一个程序,它使用马尔可夫链蒙特卡罗方法从后验概率分布中采样。它的输出文件用两组方括号分别注释节点和分支。例如下面,节点的后验分支概率和分支长度估计
tree con_all_compat = [&U] (8[&prob=1.0]:2.94e-1[&length_mean=2.9e-1],10[&prob=1.0]:2.25e-1[&length_mean=2.2e-1],((((1[&prob=1.0]:1.43e-1
[&length_mean=1.4e-1],2[&prob=1.0]:1.92e-1[&length_mean=1.9e-1])[&prob=1.0]:
1.24e-1[&length_mean=1.2e-1],9[&prob=1.0]:2.27e-1[&length_mean=2.2e-1])
[&prob=1.0]:1.72e-1[&length_mean=1.7e-1],12[&prob=1.0]:5.11e-1
[&length_mean=5.1e-1])[&prob=1.0]:1.76e-1[&length_mean=1.7e-1],
(((3[&prob=1.0]:5.46e-2[&length_mean=5.4e-2],(6[&prob=1.0]:1.03e-2
[&length_mean=1.0e-2],7[&prob=1.0]:7.13e-3[&length_mean=7.2e-3])[&prob=1.0]:
6.93e-2[&length_mean=6.9e-2])[&prob=1.0]:6.03e-2[&length_mean=6.0e-2],
(4[&prob=1.0]:6.27e-2[&length_mean=6.2e-2],5[&prob=1.0]:6.31e-2
[&length_mean=6.3e-2])[&prob=1.0]:6.07e-2[&length_mean=6.0e-2])[&prob=1.0]:,
1.80e-1[&length_mean=1.8e-1]11[&prob=1.0]:2.37e-1[&length_mean=2.3e-1])
[&prob=1.0]:4.05e-1[&length_mean=4.0e-1])[&prob=1.0]:1.16e+000
[&length_mean=1.162699558201079e+000])[&prob=1.0][&length_mean=0];
为了节省空间,删除了大部分推理,只包含分枝概率的prob和分枝长度的平均值的length_mean。此文件的完整版本还包含prob_stddev、prob_range、probb (percent)、probb +-sd(概率推断)和length_median、length_95%_HPD(每个分支)。
BEAST和MrBayes的输出预计将被支持NEXUS的软件不进行推理分析(作为注释删除)。FigTree支持对BEAST和MrBayes输出进行解析,并提供可用于在树上显示或注释的推理。但是从那里提取这些数据进行进一步的分析仍然是一个挑战。
HyPhy (Pond, Frost, and Muse 2005)可以进行大量的系统发育分析,包括祖先序列重建。对于祖先序列重建,这些序列和Newick树文本以NEXUS格式存储,作为主要的分析输出。它没有完全遵循NEXUS的定义,只是将祖先节点标签而不是外部节点标签放在TAXA中。MATRIX块包含祖先节点的序列比对,不能被转回存储在TREES块中的树,因为它不包含节点标签。下面是示例输出(为了节省空间,只显示前72bp的对齐位置)
#NEXUS
[
Generated by HYPHY 2.0020110620beta(MP) for MacOS(Universal Binary)
on Tue Dec 23 13:52:34 2014
]
BEGIN TAXA;
DIMENSIONS NTAX = 13;
TAXLABELS
'Node1' 'Node2' 'Node3' 'Node4' 'Node5' 'Node12' 'Node13' 'Node15'
'Node18' 'Node20' 'Node22' 'Node24' 'Node26' ;
END;
BEGIN CHARACTERS;
DIMENSIONS NCHAR = 2148;
FORMAT
DATATYPE = DNA
GAP=-
MISSING=?
NOLABELS
;
MATRIX
ATGGAAGACTTTGTGCGACAATGCTTCAATCCAATGATCGTCGAGCTTGCGGAAAAGGCAATGAAAGAATAT
ATGGAAGACTTTGTGCGACAATGCTTCAATCCAATGATCGTCGAGCTTGCGGAAAAGGCAATGAAAGAATAT
ATGGAAGACTTTGTGCGACAATGCTTCAATCCAATGATCGTCGAGCTTGCGGAAAAGGCAATGAAAGAATAT
ATGGAAGACTTTGTGCGACAATGCTTCAATCCAATGATCGTCGAGCTTGCGGAAAAGGCAATGAAAGAATAT
ATGGAAGACTTTGTGCGACAATGCTTCAATCCAATGATTGTCGAGCTTGCGGAAAAGGCAATGAAAGAATAT
ATGGAAGACTTTGTGCGACAATGCTTCAATCCAATGATCGTCGAGCTTGCGGAAAAGGCAATGAAAGAATAT
ATGGAAGACTTTGTGCGACAATGCTTCAATCCAATGATCGTCGAGCTTGCGGAAAAGGCAATGAAAGAATAT
ATGGAAGACTTTGTGCGACAATGCTTCAATCCAATGATCGTCGAGCTTGCGGAAAAGGCAATGAAAGAATAT
ATGGAAGACTTTGTGCGACAATGCTTCAATCCAATGATCGTCGAGCTTGCGGAAAAGGCAATGAAAGAATAT
ATGGAAGACTTTGTGCGACAATGCTTCAATCCAATGATCGTCGAGCTTGCGGAAAAGGCAATGAAAGAATAT
ATGGAAGACTTTGTGCGACAATGCTTCAATCCAATGATCGTCGAGCTTGCGGAAAAGGCAATGAAAGAATAT
ATGGAAGACTTTGTGCGACAATGCTTCAATCCAATGATCGTCGAGCTTGCGGAAAAGGCAATGAAAGAATAT
ATGGAAGACTTTGTGCGACAGTGCTTCAATCCAATGATCGTCGAGCTTGCGGAAAAGGCAATGAAAGAATAT
END;
BEGIN TREES;
TREE tree = (K,N,(D,(L,(J,(G,((C,(E,O)),(H,(I,(B,(A,(F,M)))))))))));
END;
还有其他一些应用程序输出丰富的信息文本,其中也包含与相关数据相关的系统发育树。例如, r8s (Sanderson 2003)在其日志文件中输出三棵树,即TREE、RATE和PHYLO,分别用于按时间、替换率和绝对替换缩放的分支。
最大似然系统发育分析 (PAML) (Ziheng Yang 2007)是一个用于DNA或蛋白质序列系统发育分析的程序包。两个主要程序,BASEML和CODEML,实现了各种模型。BASEML使用许多可用的核苷酸替换模型(包括JC69、K80、F81、F84、HKY85、T92、TN93和GTR)来估计树拓扑结构、分支长度和替换参数。CODEML估计了密码子替代模型下的同义和非同义替换率、阳性选择的似然比检验(Goldman and Yang 1994)。
BASEML输出mlb文件,其中包含输入序列(taxa)比对和一个具有分支长度的系统发育树,以及替换模型和其他估计参数。补充结果文件rst包含序列比对(若重建祖先序列则与祖先序列比对)和比对中每个位点演化的朴素经验贝叶斯(Naive Empirical Bayes, NBE)概率。 CODEML输出mlc文件,该文件包含树形结构和同义词和非同义词替换率的估计。CODEML还输出一个补充的结果文件rst,该文件与BASEML类似,不同之处在于该位点被定义为密码子而不是核苷酸。解析这些文件可能是乏味的,通常需要许多后期处理步骤,并需要编程方面的专业知识(例如使用Python5或Perl6)。
引入方括号用于存储额外信息是很常见的,包括用于存储bootstrap值的RAxML、用于注释的NHX格式、用于边缘标签的jplace格式、用于进化估计的BEAST格式等。但不同软件中方括号的位置不一致,内容使用不同的规则存储关联数据,这些属性使关联数据难以解析。对于大多数软件来说,他们只会忽略方括号,只在文件是兼容的情况下解析树结构。其中一些包含无效字符(如jplace格式的tree字段中的花括号),甚至树结构无法被标准解析器解析。
从不同的进化推理软件产生的不同分析结果中提取有用的系统发育/分类单元相关信息显示在同一棵系统发育树上,并进行进一步的分析是很困难。FigTree支持BEAST输出,但不支持其他大多数包含进化推理或相关数据的软件输出。对于那些输出丰富的文本文件(如r8s、pml等),树状结构无法被任何树查看软件解析,用户需要专门知识从输出文件中手工提取系统发育树和其他有用的结果数据。但这种手工操作速度慢,容易出错。
从该领域常用软件的不同分析输出中提取进化数据的系统发育树并不容易。其中的一些(如PAML产出和jplace文件)不需要软件或编程库来解析文件的支持,而其他人(例如, BEAST
和MrBayes输出)可以解析没有进化推理时存储在方括号将省略的评论,大多数软件。虽然FigTree支持可视化由BEAST和MrBayes推断出的进化统计数据,但是提取这些数据以进行进一步的分析是不支持的。不同的软件包为不同的分析实现不同的算法(例如,PAML用于dN/dS, HyPhy用于祖先序列,BEAST用于skyline分析)。因此,在处理基因组序列数据时,需要高效灵活地整合不同的分析推理结果,以便全面理解、比较和进一步分析。这促使我们开发程序库来解析来自不同来源的系统发育树和数据。
1.3使用treeio获取树数据
系统发育树是描述物种进化关系的常用方法。与分类单元种/株相关的信息可以在系统发育树描述的进化历史的背景下进一步分析。例如,可以研究树中流感病毒株的宿主信息,以了解病毒系的宿主范围。此外,与分类单元毒株直接相关的这些元数据(如隔离宿主、时间、地点等)也经常受到进一步进化或比较系统发育模型和分析的影响,以推断其与病毒进化或传播过程相关的动态。所有这些元数据或其他表型数据或实验数据都存储为与节点或分支相关的注释数据,并且通常由不同的分析程序以不一致的格式产生。
R语言读取树文件仍然是有限制的。Newick和Nexus可以通过几个包导入,包括 ape, phylobase。NeXML格式可以被 RNeXML解析。然而,该领域广泛使用的软件包的分析结果并没有得到很好的支持。SIMMAP输出可以被phyext2和 phytools解析。虽然 PHYLOCH可以导入BEAST和MrBayes的输出文件,但只能解析内部节点属性,而tip属性则会被忽略掉。许多其他软件输出主要是需要编程专家来导入带有相关数据的树。将外部数据(包括实验和临床数据)与系统发育联系起来是进化生物学家面临的另一个障碍。
为了填补大多数树格式或软件输出无法在同一软件/平台中解析的空白,开发了一个R包 treeio (Wang et al. 2020),用于解析来自通用进化分析软件的各种树文件格式和输出。treeio包是用R编程语言(R Core Team 2016)开发的。不仅可以解析树结构,还可以解析相关的数据和进化推断,包括NHX注释、时钟速率推断(来自BEAST)或r8s (Sanderson 2003)程序)、同义和非同义替换(来自CODEML)、祖先序列构建(来自HyPhy、BASEML或CODEML)等。目前,treeio能够读取以下文件格式:Newick, Nexus, New Hampshire eXtended format (NHX), jplace和Phylip,以及以下分析程序的数据输出:ASTRAL, BEAST, EPA, HyPhy, MEGA, MrBayes, pml, PHYLDOG, PPLACER, r8s, RAxML和RevBayes等。这可以通过treeio中开发的几个解析器函数实现(表1.1) (Wang et al. 2020)。
Parser function | Description |
---|---|
read.astral | parsing output of ASTRAL |
read.beast | parsing output of BEAST |
read.codeml | parsing output of CodeML (rst and mlc files) |
read.codeml_mlc | parsing mlc file (output of CodeML) |
read.fasta | parsing FASTA format sequence file |
read.hyphy | parsing output of HYPHY |
read.hyphy.seq | parsing ancestral sequences from HYPHY output |
read.iqtree | parsing IQ-Tree Newick string, with the ability to parse SH-aLRT and UFBoot support values |
read.jplace | parsing jplace file including the output of EPA and pplacer |
read.jtree | parsing jtree format |
read.mega | parsing MEGA Nexus output |
read.mega_tabular | parsing MEGA tabular output |
read.mrbayes | parsing output of MrBayes |
read.newick | parsing Newick string, with the ability to parse node label as support values |
read.nexus | parsing standard NEXUS file (re-exported from ape) |
read.nhx | parsing NHX file including the output of PHYLDOG and RevBayes |
read.paml_rst | parsing rst file (output of BaseML or CodeML) |
read.phylip | parsing phylip file (phylip alignment + Newick string) |
read.phylip.seq | parsing multiple sequence alignment from phylip file |
read.phylip.tree | parsing newick string from phylip file |
read.phyloxml | parsing phyloXML file |
read.r8s | parsing output of r8s |
read.raxml | parsing output of RAxML |
read.tree | parsing newick string (re-exported from ape) |
TABLE 1.1: treeio中定义的解析器函数
treeio包定义了用于系统发育树输入和输出的基类和函数。可以将常用软件包获得进化证据推断数据用于R语言分析的基础程序 。例如,dN / dS值或祖先序列推断 CODEML (Ziheng Yang 2007),进化枝支持值(后)推断 BEAST (Bouckaert et al. 2014)和短期读取位置由 EPA (Berger, Krompass, and Stamatakis 2011)和 PPLACER (Frederick A. Matsen, Kodner, and Armbrust 2010a)。这些进化证据可以在R中进一步分析,并使用 ggtree (Yu et al. 2017)来注释系统发育树。随着分析工具和模型的不断发展,整合来自不同来源的不同种类的数据和分析结果以在相同的系统发育树背景下进行整合分析是一个挑战。treeio包 (Wang et al. 2020)提供了一个merge_tree函数,允许组合来自不同来源的树数据。此外,treeio还允许将外部数据链接到系统发育树结构。
解析之后,将通过一个在tidytree包中定义的S4类treedata来存储具有关联数据的树结构。这些被解析的数据被映射到treedata对象内部的树分支和节点,因此可以有效地使用 ggtree (Yu et al. 2017)和 ggtreeExtra (Xu, Dai, et al. 2021)可视化地对树进行注释。用于系统发育数据解析、集成和注释的可编程平台使我们更容易识别进化动力学和相关模式(图1.3,图1 (Wang et al. 2020))。
1.3.1 treeio概述
treeio包 (Wang et al. 2020)定义了S4类,用于存储系统发育树,这些树包含来自不同来源的不同类型的相关数据或协变量,包括来自不同软件包的分析输出。它还定义了相应的解析器函数,用于用注释数据解析系统发育树,并将它们作为数据对象存储在R中,以便进一步操作或分析(见表1.1)。定义了几个访问器函数来方便访问树注释数据,包括get.field 用于获取树对象中可用的注释特性的字段get.placements 用于获得系统发育放置结果(即 PPLACER, EPA等的输出),get.subs用于获取父节点到子节点的遗传替换,get.tipseq用于得到 tip sequences。
S3类phlo是由 ape (Paradis, Claude, and Strimmer 2004)包中定义的,在R社区和许多包中被广泛使用。由于treeio使用S4类,为了使那些可用的R包能够分析treeio导入的树,treeio提供了as.phylo函数将treeio生成的树对象转换为只包含树结构而不包含注释数据的Phylo对象。另一方面,treeio也提供了as.treedata函数将phylo对象与进化分析结果(例如,由ape计算的bootstrap values或 phangorn (Schliep 2011) 推断的祖先状态等)存储treedata S4对象,因此很容易将数据映射到树结构和使用ggtree可视化 ggtree (Yu et al. 2017)。
为了在系统发育树中集成不同类型的数据,treeio (Wang et al. 2020)提供了merge_tree函数(详细信息见2.2.1节),用于结合从不同来源导入的进化统计数据/证据,包括那些常见的树文件和分析程序的输出(表1.1)。还有其他信息,如采样位置、分类信息、实验结果、进化特征等,以用户定义的格式存储在单独的文件中。在treeio中,我们可以使用标准的R IO函数从用户文件中读取这些数据,并通过在tidytree和treeio包中定义的full_join方法将它们附加到树对象(请参阅ggtree中定义的 %<+%
operator)。附加后的数据将成为节点或分支的关联属性,可以与合并的其他数据进行比较,也可以在树中直观显示 (Yu et al. 2018)。
为了便于存储与系统发育树相关的复杂数据,treeio应用write.baset和write.jtree功能可以将一个treedata对象导出到单个文件中(参见第3章)。
1.3.2功能演示
#######1.3.2.1 BEAST输出解析
file <- system.file("extdata/BEAST", "beast_mcc.tree", package="treeio")
beast <- read.beast(file)
beast
## 'treedata' S4 object that stored information
## of
## '/home/ygc/R/library/treeio/extdata/BEAST/beast_mcc.tree'.
##
## ...@ phylo:
##
## Phylogenetic tree with 15 tips and 14 internal nodes.
##
## Tip labels:
## A_1995, B_1996, C_1995, D_1987, E_1996, F_1997, ...
##
## Rooted; includes branch lengths.
##
## with the following features available:
## 'height', 'height_0.95_HPD', 'height_median',
## 'height_range', 'length', 'length_0.95_HPD',
## 'length_median', 'length_range', 'posterior', 'rate',
## 'rate_0.95_HPD', 'rate_median', 'rate_range'.
由于%不是names中的有效字符,所有包含x%的特性名都会转换为0.x。例如,length_95%_HPD将被更改为length_0.95_HPD。
不仅树结构,而且BEAST推断的所有特性都将存储在S4对象中。这些特性可以用于树的注释(图5.8)。
1.3.2.2 MEGA输出解析
分子进化遗传学分析(MEGA)软件(Kumar, Stecher,和Tamura 2016)支持导出三种不同格式的树:Newick,tabular,和Nexus。Newick文件可以使用read.tree或read.newick来解析。newick功能。MEGA Nexus文件类似于BEAST Nexus, treeio (Wang et al. 2020),可以使用read.mega功能来解析。
file <- system.file("extdata/MEGA7", "mtCDNA_timetree.nex",
package = "treeio")
read.mega(file)
## 'treedata' S4 object that stored information
## of
## '/home/ygc/R/library/treeio/extdata/MEGA7/mtCDNA_timetree.nex'.
##
## ...@ phylo:
##
## Phylogenetic tree with 7 tips and 6 internal nodes.
##
## Tip labels:
## homo_sapiens, chimpanzee, bonobo, gorilla,
## orangutan, sumatran, ...
##
## Rooted; includes branch lengths.
##
## with the following features available:
## 'branch_length', 'data_coverage', 'rate',
## 'reltime', 'reltime_0.95_CI', 'reltime_stderr'.
表格输出包含表格平面文本文件中的树和相关信息(本例中的分化时间)。ead.mega_tabular 功能可以同时用数据解析树。
file <- system.file("extdata/MEGA7", "mtCDNA_timetree_tabular.txt",
package = "treeio")
read.mega_tabular(file)
## 'treedata' S4 object that stored information
## of
## '/home/ygc/R/library/treeio/extdata/MEGA7/mtCDNA_timetree_tabular.txt'.
##
## ...@ phylo:
##
## Phylogenetic tree with 7 tips and 6 internal nodes.
##
## Tip labels:
## chimpanzee, bonobo, homo sapiens, gorilla,
## orangutan, sumatran, ...
## Node labels:
## , , demoLabel2, , ,
##
## Rooted; no branch lengths.
##
## with the following features available:
## 'RelTime', 'CI_Lower', 'CI_Upper', 'Rate', 'Data
## Coverage'.
1.3.2.3解析MrBayes输出
虽然MrBayes生成的Nexus文件与BEAST的输出不同,但它们是相似的。treeio包提供了read.mrbayes(),它在内部调用read.beast()来解析MrBayes的输出。
file <- system.file("extdata/MrBayes", "Gq_nxs.tre", package="treeio")
read.mrbayes(file)
## 'treedata' S4 object that stored information
## of
## '/home/ygc/R/library/treeio/extdata/MrBayes/Gq_nxs.tre'.
##
## ...@ phylo:
##
## Phylogenetic tree with 12 tips and 10 internal nodes.
##
## Tip labels:
## B_h, B_s, G_d, G_k, G_q, G_s, ...
##
## Unrooted; includes branch lengths.
##
## with the following features available:
## 'length_0.95HPD', 'length_mean', 'length_median',
## 'prob', 'prob_range', 'prob_stddev', 'prob_percent',
## 'prob+-sd'.
1.3.2.4 PAML输出解析
最大似然系统发育分析(PAML)是一套工具,用于DNA和蛋白质序列的系统发育分析使用最大似然。树搜索算法是在 BASEML和CODEML中实现的。treeio中提供的read.paml_rst()函数可以解析BASEML和CODEML中的rst文件。唯一的区别是序列中的空间。对于BASEML,每十个碱基用一个空格隔开,而对于CODEML,每三个碱基(三联体)用一个空格隔开。
brstfile <- system.file("extdata/PAML_Baseml", "rst", package="treeio")
brst <- read.paml_rst(brstfile)
brst
## 'treedata' S4 object that stored information
## of
## '/home/ygc/R/library/treeio/extdata/PAML_Baseml/rst'.
##
## ...@ phylo:
##
## Phylogenetic tree with 15 tips and 13 internal nodes.
##
## Tip labels:
## A, B, C, D, E, F, ...
## Node labels:
## 16, 17, 18, 19, 20, 21, ...
##
## Unrooted; includes branch lengths.
##
## with the following features available:
## 'subs', 'AA_subs'.
类似地,我们可以从CODEML解析rst文件。
crstfile <- system.file("extdata/PAML_Codeml", "rst", package="treeio")
## type can be one of "Marginal" or "Joint"
crst <- read.paml_rst(crstfile, type = "Joint")
crst
## 'treedata' S4 object that stored information
## of
## '/home/ygc/R/library/treeio/extdata/PAML_Codeml/rst'.
##
## ...@ phylo:
##
## Phylogenetic tree with 15 tips and 13 internal nodes.
##
## Tip labels:
## A, B, C, D, E, F, ...
## Node labels:
## 16, 17, 18, 19, 20, 21, ...
##
## Unrooted; includes branch lengths.
##
## with the following features available:
## 'subs', 'AA_subs'.
树节点。treeio (Wang et al. 2020)将自动确定每个分支两端序列之间的替换。氨基酸替换也将通过将核苷酸序列翻译成氨基酸序列来确定。这些计算得到的替换也将存储在S4对象中,以便以后进行有效的树注释(图5.10)。
CODEML推断选择压力和估计dN/dS, dN和dS。这些信息存储在输出文件mlc中,该文件可由read.codeml_mlc()函数解析。
mlcfile <- system.file("extdata/PAML_Codeml", "mlc", package="treeio")
mlc <- read.codeml_mlc(mlcfile)
mlc
## 'treedata' S4 object that stored information
## of
## '/home/ygc/R/library/treeio/extdata/PAML_Codeml/mlc'.
##
## ...@ phylo:
##
## Phylogenetic tree with 15 tips and 13 internal nodes.
##
## Tip labels:
## A, B, C, D, E, F, ...
## Node labels:
## 16, 17, 18, 19, 20, 21, ...
##
## Unrooted; includes branch lengths.
##
## with the following features available:
## 't', 'N', 'S', 'dN_vs_dS', 'dN', 'dS', 'N_x_dN',
## 'S_x_dS'.
可以像前面演示的那样分别解析rst和mlc文件,也可以使用read.codeml()函数将它们一起解析。
## tree can be one of "rst" or "mlc" to specify
## using tree from which file as base tree in the object
ml <- read.codeml(crstfile, mlcfile, tree = "mlc")
ml
## 'treedata' S4 object that stored information
## of
## '/home/ygc/R/library/treeio/extdata/PAML_Codeml/rst',
## '/home/ygc/R/library/treeio/extdata/PAML_Codeml/mlc'.
##
## ...@ phylo:
##
## Phylogenetic tree with 15 tips and 13 internal nodes.
##
## Tip labels:
## A, B, C, D, E, F, ...
## Node labels:
## 16, 17, 18, 19, 20, 21, ...
##
## Unrooted; includes branch lengths.
##
## with the following features available:
## 'subs', 'AA_subs', 't', 'N', 'S', 'dN_vs_dS', 'dN',
## 'dS', 'N_x_dN', 'S_x_dS'.
rst和mlc文件中的所有特性都被导入到一个单独的S4对象中,因此可用于进一步的注释和可视化。例如,我们可以在同一棵系统发育树上注释和显示dN/dS(来自mlc文件)和氨基酸替换(来自rst文件)(Yu et al. 2017)。
1.3.2.5 HyPhy输出解析
HyPhy (Hypothesis testing using Phylogenies)是一个用于分析基因序列的软件包。由HyPhy推断出的祖先序列存储在Nexus输出文件中,其中包含树形拓扑和祖先序列。要解析这个数据文件,用户可以使用read.hyphy.seq()函数。
ancseq <- system.file("extdata/HYPHY", "ancseq.nex", package="treeio")
read.hyphy.seq(ancseq)
## 13 DNA sequences in binary format stored in a list.
##
## All sequences of same length: 2148
##
## Labels:
## Node1
## Node2
## Node3
## Node4
## Node5
## Node12
## ...
##
## Base composition:
## a c g t
## 0.335 0.208 0.237 0.220
## (Total: 27.92 kb)
为了将序列映射到树中,用户还应该提供一个内部的节点标记树。如果用户想要确定替换,他们还需要提供提示序列。在这种情况下,替换将自动确定,就像我们解析 CODEML的输出一样。
nwk <- system.file("extdata/HYPHY", "labelledtree.tree", package="treeio")
tipfas <- system.file("extdata", "pa.fas", package="treeio")
hy <- read.hyphy(nwk, ancseq, tipfas)
hy
## 'treedata' S4 object that stored information
## of
## '/home/ygc/R/library/treeio/extdata/HYPHY/labelledtree.tree'.
##
## ...@ phylo:
##
## Phylogenetic tree with 15 tips and 13 internal nodes.
##
## Tip labels:
## K, N, D, L, J, G, ...
## Node labels:
## Node1, Node2, Node3, Node4, Node5, Node12, ...
##
## Unrooted; includes branch lengths.
##
## with the following features available:
## 'subs', 'AA_subs'.
1.3.2.6 r8输出解析
r8s包使用参数、半参数和非参数方法松弛分子钟,以便更好地估计散度时间和进化速率 (Sanderson 2003)。日志文件中输出三棵树,时间树、速率树和绝对替换树分别为TREE、RATO和PHYLO。
时间树是由散度时间标度的,速率树是由替换率标度的,绝对替换树是由替换的绝对数量标度的。解析文件后,这三棵树都存储在一个multiPhylo对象中(图4.15)。
r8s <- read.r8s(system.file("extdata/r8s", "H3_r8s_output.log", package="treeio"))
r8s
## 3 phylogenetic trees
1.3.2.7 RAxML引导分析的解析输出
RAxML引导分析输出的Newick树文本不是标准的,因为它将引导值存储在分支长度后的方括号中。这个文件通常不能被传统的Newick解析器解析,比如ape::read.tree()。函数read.raxml()可以读取这样的文件,并将引导程序存储为一个额外的特性,它可以用于显示在树中,或用于为树分支着色,等等。
raxml_file <- system.file("extdata/RAxML",
"RAxML_bipartitionsBranchLabels.H3",
package="treeio")
raxml <- read.raxml(raxml_file)
raxml
## 'treedata' S4 object that stored information
## of
## '/home/ygc/R/library/treeio/extdata/RAxML/RAxML_bipartitionsBranchLabels.H3'.
##
## ...@ phylo:
##
## Phylogenetic tree with 64 tips and 62 internal nodes.
##
## Tip labels:
## A_Hokkaido_M1_2014_H3N2_2014,
## A_Czech_Republic_1_2014_H3N2_2014,
## FJ532080_A_California_09_2008_H3N2_2008,
## EU199359_A_Pennsylvania_05_2007_H3N2_2007,
## EU857080_A_Hong_Kong_CUHK69904_2006_H3N2_2006,
## EU857082_A_Hong_Kong_CUHK7047_2005_H3N2_2005, ...
##
## Unrooted; includes branch lengths.
##
## with the following features available:
## 'bootstrap'.
1.3.2.8解析NHX树
NHX (New Hampshire eXtended)格式是通过引入NHX标签对Newick的扩展。NHX通常用于系统发育软件,包括 PHYLDOG (Boussau et al. 2013), RevBayes (Höhna et al. 2014),用于存储统计推断。下面的代码导入了一个带有由PHYLDOG推断的相关数据的NHX树(图3.1A)。
nhxfile <- system.file("extdata/NHX", "phyldog.nhx", package="treeio")
nhx <- read.nhx(nhxfile)
nhx
## 'treedata' S4 object that stored information
## of
## '/home/ygc/R/library/treeio/extdata/NHX/phyldog.nhx'.
##
## ...@ phylo:
##
## Phylogenetic tree with 16 tips and 15 internal nodes.
##
## Tip labels:
## Prayidae_D27SS7@2825365, Kephyes_ovata@2606431,
## Chuniphyes_multidentata@1277217,
## Apolemia_sp_@1353964, Bargmannia_amoena@263997,
## Bargmannia_elongata@946788, ...
##
## Rooted; includes branch lengths.
##
## with the following features available:
## 'Ev', 'ND', 'S'.
1.3.2.9解析Phylip tree
Phylip格式包含多个序列对齐的Phylip序列格式与相应的Newick树文本,由分类单元序列构建。多序列比对可通过ggtree的msaplot()函数或结合ggmsa包进行树状结构排序,并显示在树的右侧(see also Basic Protocol 5 of (Yu 2020))。
phyfile <- system.file("extdata", "sample.phy", package="treeio")
phylip <- read.phylip(phyfile)
phylip
## 'treedata' S4 object that stored information
## of
## '/home/ygc/R/library/treeio/extdata/sample.phy'.
##
## ...@ phylo:
##
## Phylogenetic tree with 15 tips and 13 internal nodes.
##
## Tip labels:
## K, N, D, L, J, G, ...
##
## Unrooted; no branch lengths.
1.3.2.10解析EPA和pplacer输出
EPA (Berger, Krompass, and Stamatakis 2011)和PPLACER (Frederick A. Matsen, Kodner, and Armbrust 2010a)具有共同的输出文件格式jplace,可以通过read.jplace()函数进行解析。
jpf <- system.file("extdata/EPA.jplace", package="treeio")
jp <- read.jplace(jpf)
print(jp)
## 'treedata' S4 object that stored information
## of
## '/home/ygc/R/library/treeio/extdata/EPA.jplace'.
##
## ...@ phylo:
##
## Phylogenetic tree with 493 tips and 492 internal nodes.
##
## Tip labels:
## CIR000447A, CIR000479, CIR000078, CIR000083,
## CIR000070, CIR000060, ...
##
## Rooted; includes branch lengths.
##
## with the following features available:
## 'nplace'.
每个分支上的进化放置数量将被计算并存储为nplace特征,可以使用ggtree将其映射为行大小和/或颜色(Yu et al. 2017)。
1.3.2.11解析jtree格式
jtree是一种基于json的格式,在treeio包中定义(Wang et al. 2020),以支持树数据交换(见 session 3.3)。带有相关数据的系统发育树可以使用write.jtree()函数导出到单个jtree文件。jtree可以使用任何JSON解析器轻松解析。jtree格式包含三块:tree、data和metadata。树值包含从Newick树格式扩展而来的树文本,方法是将边号放在分支长度之后的花括号中。数据值包含特定于节点/分支的数据,而元数据值包含额外的元信息。
jtree_file <- tempfile(fileext = '.jtree')
write.jtree(beast, file = jtree_file)
read.jtree(file = jtree_file)
## 'treedata' S4 object that stored information
## of
## '/tmp/Rtmp5zDeZ2/file1eea82133a2fb.jtree'.
##
## ...@ phylo:
##
## Phylogenetic tree with 15 tips and 14 internal nodes.
##
## Tip labels:
## K_2013, N_2010, D_1987, L_1980, J_1983, G_1992, ...
##
## Rooted; includes branch lengths.
##
## with the following features available:
## 'height', 'height_0.95_HPD', 'height_range',
## 'length', 'length_0.95_HPD', 'length_median',
## 'length_range', 'rate', 'rate_0.95_HPD',
## 'rate_median', 'rate_range', 'height_median',
## 'posterior'.
1.3.3将其他树状对象转换为phylo或treedata
为了扩展treeio、tidytree和ggtree的应用范围,treeio (Wang et al. 2020)提供了几个as.phylo和as.treedata方法,用于将其他树状对象(如phylo4d和pml)转换为phylo或treedata对象。因此,用户可以很容易地将相关数据映射到树结构,将有/没有数据的树导出到单个文件,操作和可视化有/没有数据的树。这些转换函数(表1.2)创造了使用tidy接口来处理tree和使用图形语法的ggtree来可视化tree的可能性。
|-|-|-|
Convert function | Supported object | Description |
---|---|---|
as.phylo | ggtree | convert ggtree object to phylo object |
as.phylo | igraph | convert igraph object (only tree graph supported) to phylo object |
as.phylo | phylo4 | convert phylo4 object to phylo object |
as.phylo | pvclust | convert pvclust object to phylo object |
as.phylo | treedata | convert treedata object to phylo object |
as.treedata | ggtree | convert ggtree object to treedata object |
as.treedata | phylo4 | convert phylo4 object to treedata object |
as.treedata | phylo4d | convert phylo4d object to treedata object |
as.treedata | pml | convert pml object to treedata object |
as.treedata | pvclust | convert pvclust object to treedata object |
表1.2:树状对象到phylo或 treedata对象的转换
这里,我们以pml对象为例,它是在phangorn包中定义的。pml()函数计算给定序列比对和模型的系统发育树的可能性,而 optim.pml()函数优化不同的模型参数。输出是一个pml对象,可以使用 treeio (Wang et al. 2020)的as.treedata将其转换为一个treedata对象。存储在树状数据对象中的氨基酸替换(pml估计的祖先序列)可以使用ggtree进行可视化,如图1.4所示。
library(phangorn)
treefile <- system.file("extdata", "pa.nwk", package="treeio")
tre <- read.tree(treefile)
tipseqfile <- system.file("extdata", "pa.fas", package="treeio")
tipseq <- read.phyDat(tipseqfile,format="fasta")
fit <- pml(tre, tipseq, k=4)
fit <- optim.pml(fit, optNni=FALSE, optBf=T, optQ=T,
optInv=T, optGamma=T, optEdge=TRUE,
optRooted=FALSE, model = "GTR",
control = pml.control(trace =0))
pmltree <- as.treedata(fit)
ggtree(pmltree) + geom_text(aes(x=branch, label=AA_subs, vjust=-.5))
图1.4:将pml对象转换为treedata对象这允许使用tidytree来处理树数据,以及使用ggtree和ggtreeExtra来显示与相关数据相关的树。
1.3.4从树数据对象中获取信息
导入树后,用户可能希望提取存储在树数据对象中的信息。Treeio提供了几种访问器方法来提取树结构、存储在对象中的特性/属性以及它们对应的值。
get.tree()或as.phylo()方法可以将treedata对象转换为一个phylo对象,这是R社区中的基本树对象,许多包都使用phylo对象。
beast_file <- system.file("examples/MCC_FluA_H3.tree", package="ggtree")
beast_tree <- read.beast(beast_file)
# or get.tree
as.phylo(beast_tree)
##
## Phylogenetic tree with 76 tips and 75 internal nodes.
##
## Tip labels:
## A/Hokkaido/30-1-a/2013, A/New_York/334/2004, A/New_York/463/2005, A/New_York/452/1999, A/New_York/238/2005, A/New_York/523/1998, ...
##
## Rooted; includes branch lengths.
get.fields方法返回存储在对象中并与系统发育相关的特征/属性向量。
get.fields(beast_tree)
## [1] "height" "height_0.95_HPD"
## [3] "height_median" "height_range"
## [5] "length" "length_0.95_HPD"
## [7] "length_median" "length_range"
## [9] "posterior" "rate"
## [11] "rate_0.95_HPD" "rate_median"
## [13] "rate_range"
get.data 方法返回所有关联数据的浮点数。
get.data(beast_tree)
## # A tibble: 151 × 14
## height height_0.95_HPD height_median height_range
##
## 1 19 19
## 2 17 17
## 3 14 14
## 4 12 12
## 5 9 9
## 6 10 10
## 7 10 10
## 8 10.8 10.8
## 9 9 9
## 10 9 9
## # … with 141 more rows, and 10 more variables:
## # length , length_0.95_HPD ,
## # length_median , length_range ,
## # posterior , rate , rate_0.95_HPD ,
## # rate_median , rate_range , node
如果用户只想使用get.fields获得features/attributes的部分子集数据,可以使用get.data或直接使用 [ 或 [[ 提取子集。
beast_tree[, c("node", "height")]
## # A tibble: 151 × 2
## node height
##
## 1 10 19
## 2 9 17
## 3 36 14
## 4 31 12
## 5 29 9
## 6 28 10
## 7 39 10
## 8 90 10.8
## 9 16 9
## 10 2 9
## # … with 141 more rows
head(beast_tree[["height_median"]])
## height_median1 height_median2 height_median3
## 19 17 14
## height_median4 height_median5 height_median6
## 12 9 10
1.4总结
用于推断分子进化的软件工具(例如,祖先状态、分子年代测定和选择压力等)正在激增,但没有一种单一的数据格式可以被所有不同的程序使用,并能够存储不同类型的系统发育数据。大多数软件包都有其独特的输出格式,并且这些格式彼此之间不兼容。解析软件输出具有挑战性,这限制了使用不同工具进行联合分析。treeio包(Wang et al. 2020)提供了一组函数(表1.1),用于解析各种类型的系统发育数据文件,以及一组转换器(表1.2),用于将树状对象转换为门或树状数据对象。这些系统发育数据可以被整合,从而允许进一步的探索和比较。到目前为止,分子进化领域的大多数软件工具都是孤立的,并且常常不能完全兼容彼此的输入和输出文件。这些软件工具被设计用来进行分析,而输出通常在其他软件中是不可读的。目前还没有设计任何工具来统一来自不同分析程序的推理数据。有效整合不同推理方法的数据,可以增强对研究对象的比较和理解,有助于发现新的系统模式,产生新的假设。
随着系统发育树在进化背景下识别模式的应用越来越广泛,越来越多的不同学科在研究中使用系统发育树。例如,空间生态学家可以将生物体的地理位置绘制到系统发育树中,以了解该物种的生物地理学 (Schön et al. 2015);疾病流行病学家可以将病原体采样的时间和地点纳入系统发育分析中,推断疾病在时空空间的传播动态 (Y.-Q. He et al. 2013);微生物学家可以确定不同病原菌株的致病性,并将其绘制到系统发育树中,以确定致病性的遗传决定因素(Bosi et al. 2016);基因组科学家可以使用系统发育树来帮助对他们的宏基因组序列数据进行分类((Gupta and Sharma 2015)。treeio等强大的工具可以将不同类型的数据导入并映射到系统发育树中,这对于促进这些与系统发育相关(也被称为phylodynamics)的研究有着重要意义。这些工具还可以帮助在最高水平上整合不同的元数据(时间、地理、基因型、流行病学信息)和分析结果(选择压力、进化速率),并提供对研究生物体的全面了解。在流感研究领域,通过在同一种系统发育树和进化时间尺度上绘制不同元数据和分析结果来研究流感病毒的phylodynamics(Lam et al. 2015)。