如何从成对距离矩阵中生成Newick树输出

时间:2018-10-08 05:30:54

标签: r phylogeny genetics distance-matrix ape-phylo

我想从遗传数据中得出系统发育树。我在R和python中发现了一些看起来很棒的树绘制包,例如R中的ggtree。但是这些要求的数据输入已经是树格式的,例如纽克。

我认为大多数人都以vcf文件开头并生成FASTA文件,但是我的出发点是基因型表-我使用单倍体生物,因此每个位置均为0(参考)或1(非参考)。据此,我使用R中的dist()计算成对遗传距离。5个样本的示例数据A-E,在十个变异位置上成对距离:

# Generate dataframe with example genotypes
Variant <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
A <- c(0, 0, 1, 1, 0, 0, 1, 1, 0, 0)
B <- c(1, 1, 0, 0, 1, 1, 0, 0, 1, 1)
C <- c(0, 0, 1, 1, 0, 0, 1, 1, 0, 1)
D <- c(1, 0, 1, 1, 0, 0, 1, 1, 0, 1)
E <- c(1, 0, 0, 0, 1, 1, 0, 0, 1, 1)
df = data.frame(Variant, A, B, C, D, E)
df
#  Remove first column with variant names
df$Variant <- NULL
# Transpose the columns and rows
df_t = t(df)
# Compute pairwise distance (Euclidean)
pdist = dist(df_t, method = "euclidean", diag = TRUE, upper = TRUE, p = 2)
pdist

我想从pdist生成一个分层的树输出文件,例如以Newick格式,这样我就可以将其插入ggtree之类的包中以绘制漂亮的树,例如圆形系统志,带有协变量等。我尝试搜索,但不确定从哪里开始。

编辑/更新 这个网站很有帮助 http://www.phytools.org/Cordoba2017/ex/2/Intro-to-phylogenies.html 我使用了包装: 猿,攀牙,phytools,盖革

此代码似乎有效-

# Produce dendrogram
hclust = hclust(pdist)
# Check dendrogram looks sensible
plot(hclust)
class(hclust) # check that class is hclust
# Save to Newick file
my_tree <- as.phylo(hclust) 
write.tree(phy=my_tree, file="ExampleTree.newick") # Writes a Newick file
# Produce tree
plot(unroot(my_tree),type="unrooted",cex=1.5,
     use.edge.length=TRUE,lab4ut="axial",
     edge.width=2,
     no.margin=TRUE)

输出树: Unrooted distance tree from example data

2 个答案:

答案 0 :(得分:1)

这是一项艰巨的任务。要从距离矩阵构建一棵树(如分叉的树),您将需要使用系统发生算法,并且最好不要从距离矩阵进行构建(请注意,对于二元矩阵使用欧几里得距离也可能有缺点) )。

尽管如此,仍然可以使用phangorn package完成任务。例如,您可以根据距离矩阵创建分割光谱(即矩阵中可能存在的分割(more details here - paywalled)。

require(phangorn)
# Generate dataframe with example genotypes
Variant <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
A <- c(0, 0, 1, 1, 0, 0, 1, 1, 0, 0)
B <- c(1, 1, 0, 0, 1, 1, 0, 0, 1, 1)
C <- c(0, 0, 1, 1, 0, 0, 1, 1, 0, 1)
D <- c(1, 0, 1, 1, 0, 0, 1, 1, 0, 1)
E <- c(1, 0, 0, 0, 1, 1, 0, 0, 1, 1)
df = data.frame(Variant, A, B, C, D, E)
df
#  Remove first column with variant names
df$Variant <- NULL
# Transpose the columns and rows
df_t = t(df)
# Compute pairwise distance (Euclidean)
pdist = dist(df_t, method = "euclidean", diag = TRUE, upper = TRUE, p = 2)

# calculate the Hadamard distance spectrum
distances <- distanceHadamard(as.matrix(pdist))
# representing the distances
lento(distances)
# Plotting the distances as a tree (a network actually)
plot(as.networx(distances), "2D")

请注意,在同一软件包neighborNet中也可用,但手册强调该功能是实验性的。我建议与软件包作者联系以获取更多信息。

然后,您可以通过强制将网络转换为"phylo"并可能由ape使用的ggtree

# Converting into a phylo object
phylo <- as.phylo(distances)

但是再次,请注意,该结果树在系统发育意义上可能是不正确的(即假设经过修饰后裔),我强烈建议您使用基于模型的方法(例如,使用MrBayes或{{3 }}。

答案 1 :(得分:0)

如@ thomas-guillerme所述,二进制数据可以有效地用于与MrBayes一起构建系统发育树。输入文件应包含二进制data块和mrbayes命令。

#nexus
begin data;
dimensions ntax = 5 nchar = 10;
format datatype = restriction;
matrix
A 0011001100
B 1100110011
C 0011001101
D 1011001101
E 1000110011;
end;

begin mrbayes;
lset coding = variable;
mcmc ngen = 1000000 samplefreq = 1000;
sump burnin = 200;
sumt burnin = 200;
end;

mcmc运行的长度将需要针对链收敛进行调整。首先,代码应该对数据可以推断的关系有一个很好的了解。