首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >系统发育树

系统发育树
EN

Stack Overflow用户
提问于 2014-02-17 20:50:08
回答 1查看 1K关注 0票数 0

我正致力于建立一个基于成对的系统发育树-- genes.Below的数据是我的数据子集(test.txt).The树不需要根据任何DNA序列构建,而只是将它当作单词来处理。

代码语言:javascript
运行
复制
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代码

代码语言:javascript
运行
复制
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))

我的数字附在这里

我有个问题问他们是怎样的clustered.Since这对

代码语言:javascript
运行
复制
 17 AR  ADRA1B
 18 AR  ADRA1A

代码语言:javascript
运行
复制
 2  ADRA1B  ADK
 3  ADRA1A  ADK

应该紧密地聚集在一起,因为它们有一个共同的gene.so 17和2应该在一起,而18和3。

如果我使用这个方法(欧几里得距离)是错误的,我应该使用其他方法吗?

我是否应该将数据转换为一个由行和列组成的矩阵,其中gene1是x轴,gene2是y轴,每个单元格被填充1或0?(基本上,如果它们成对就意味着1,如果不是,则表示0)。

经修订的守则:

代码语言:javascript
运行
复制
   table=table(tab$gene1, tab$gene2)
   d <- dist(table,method="euclidean")
   fit <- hclust(d, method="ward")
   plot(as.phylo(fit))

然而,在这里,我只得到gene1的基因,而不是gene2 column.The,这正是我想要的,但也应该有gene2列中的基因。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-17 22:51:40

在这个问题的例子中有一些解释的余地。我的答案只有在每个个体中只有两个基因的情况下才是有效的,每一行描述一个个体。但是,如果每一行都意味着gene1gene2一起发生,那么在我看来,不能执行任何有用的集群。在这种情况下,我希望增加一列,说明它们常见的可能性,并且可能更喜欢主成分分析(PCA),但我远不是(层次结构)聚类方面的专家。

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

代码语言:javascript
运行
复制
# 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具有如下形状:

代码语言:javascript
运行
复制
     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列):

代码语言:javascript
运行
复制
d <- dist(gene.matrix[,-1],method="euclidean")
fit <- hclust(d, method="ward")
plot(as.phylo(fit))

也许,读一读距离度量euclideanmanhattan等的差异是个好主意。例如,ID=1ID=2的个体之间的欧几里得距离是:

代码语言:javascript
运行
复制
euclidean_dist = sqrt((0-0)^2 + (1-1)^2 + (0-0)^2 + (0-0)^2 + (0-1)^2 + ...)

而曼哈顿的距离是

代码语言:javascript
运行
复制
manhattan_dist = abs(0-0) + abs(1-1) + abs(0-0) + abs(0-0) + abs(0-1) + ...
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21839012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档