系统发育树

时间:2014-02-17 20:50:09

标签: r tree phylogeny

我正在努力建立一个基于成对数据基因的系统发育树。下面是我的数据子集(test.txt)。树不必在任何DNA序列的基础上构建,而只是把它当成文字。

ID  gene1   gene2

1   ADRA1D  ADK
2   ADRA1B  ADK
3   ADRA1A  ADK
4   ADRB1   ASIC1
5   ADRB1   ADK
6   ADRB2   ASIC1
7   ADRB2   ADK
8   AGTR1   ACHE
9   AGTR1   ADK
10  ALOX5   ADRB1
11  ALOX5   ADRB2
12  ALPPL2  ADRB1
13  ALPPL2  ADRB2
14  AMY2A   AGTR1
15  AR  ADORA1
16  AR  ADRA1D
17  AR  ADRA1B
18  AR  ADRA1A
19  AR  ADRA2A
20  AR  ADRA2B

以下是我在R

中的代码
library(ape)
tab=read.csv("test.txt",sep="\t",header=TRUE)
d=dist(tab,method="euclidean")
fit <- hclust(d, method="ward")
plot(as.phylo(fit))

我的数字附在enter image description here

我有一个关于它们如何聚集的问题。因为对

 17 AR  ADRA1B
 18 AR  ADRA1A

 2  ADRA1B  ADK
 3  ADRA1A  ADK

应紧密聚集,因为它们有一个共同的基因。所以17和2应该在一起,18和3。

我是否应该使用任何其他方法,如果我使用这种方法错误(欧几里德距离)?

我应该将我的数据转换为行和列的矩阵,其中gene1是x轴,而gene2是y轴,每个单元格被1或0填充?(基本上,如果它们是配对的,则意味着1,和如果不是那么0)

更新代码:

   table=table(tab$gene1, tab$gene2)
   d <- dist(table,method="euclidean")
   fit <- hclust(d, method="ward")
   plot(as.phylo(fit))

然而,在这里,我只获得了gene1而不是gene2列的基因。下图正是我想要的,但也应该有来自gene2列的基因

enter image description here

1 个答案:

答案 0 :(得分:2)

在问题的例子中有一些解释空间。我的答案只有在每个人中只有两个基因并且每行描述一个人时才有效。但是,如果每行意味着gene1gene2一起出现,我认为无法确定是否可以执行有用的聚类。在那种情况下,我希望有一个额外的列说明它们常见的可能性,并且可能更喜欢主成分分析(PCA)之类的东西,但我远不是(层次)聚类的专家。

在使用dist功能之前,您必须将数据转换为适当的格式:

# convert test data into suitable format
gene.names <- sort(unique(c(tab[,"gene1"],tab[,"gene2"])))
gene.matrix <- cbind(tab[,"ID"],matrix(0L,nrow=nrow(tab),ncol=length(gene.names)))
colnames(gene.matrix) <- c("ID",gene.names)
lapply(seq_len(nrow(tab)),function(x) gene.matrix[x,match(tab[x,c("gene1","gene2")],colnames(gene.matrix))]<<-1)

获得的gene.matrix具有以下形状:

     ID ACHE ADK ADORA1 ADRA1A ADRA1B ADRA1D ADRA2A ...
[1,]  1    0   1      0      0      0      1      0
[2,]  2    0   1      0      0      1      0      0
[3,]  3    0   1      0      1      0      0      0
[4,]  4    0   0      0      0      0      0      0
...

因此,每一行代表一个观察(=个体),其中第一列标识个体,如果基因存在,则每个后续列包含1,如果缺失,则0。在此矩阵上,可以合理地应用dist函数(删除ID列):

d <- dist(gene.matrix[,-1],method="euclidean")
fit <- hclust(d, method="ward")
plot(as.phylo(fit))

也许,阅读距离度量euclideanmanhattan等之间的差异是个好主意。例如,ID=1和{{}之间的欧几里德距离1}}是:

ID=2

而曼哈顿距离是

euclidean_dist = sqrt((0-0)^2 + (1-1)^2 + (0-0)^2 + (0-0)^2 + (0-1)^2 + ...)