我正在努力建立一个基于成对数据基因的系统发育树。下面是我的数据子集(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))
我的数字附在
我有一个关于它们如何聚集的问题。因为对
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列的基因
答案 0 :(得分:2)
在问题的例子中有一些解释空间。我的答案只有在每个人中只有两个基因并且每行描述一个人时才有效。但是,如果每行意味着gene1
与gene2
一起出现,我认为无法确定是否可以执行有用的聚类。在那种情况下,我希望有一个额外的列说明它们常见的可能性,并且可能更喜欢主成分分析(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))
也许,阅读距离度量euclidean
,manhattan
等之间的差异是个好主意。例如,ID=1
和{{}之间的欧几里德距离1}}是:
ID=2
而曼哈顿距离是
euclidean_dist = sqrt((0-0)^2 + (1-1)^2 + (0-0)^2 + (0-0)^2 + (0-1)^2 + ...)