【问题标题】:Phylogenetic tree系统发育树
【发布时间】:2014-02-17 20:50:08
【问题描述】:

我正在努力建立一个基于成对基因数据的系统发育树。下面是我的数据子集(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列的基因

【问题讨论】:

  • 我有点疑惑。如何在字符串上计算欧几里得距离?您的示例中的gene1 和gene2 列真的是字符串还是因子?如果它们是因子并且dist计算因子水平上的欧几里得距离,我认为没有什么是合理的。
  • 我不确定,但看起来您正在尝试基于给定分类单元中存在的基因的 union 进行聚类,而我认为 @ 987654329@ 将根据 each 基因的身份进行聚类——即如果分类单元 1 具有 gene1=Agene2=B 和分类单元 2 具有 gene2=Bgene2=A,它们将不匹配完全...
  • @Georg 这些是字符串,我正在寻找从该表中获取一些关系以进行一些聚类并构建树的方法。我同意不能使用欧几里得,我只是想给出一个例子,我想要什么。

标签: r tree phylogeny


【解决方案1】:

这个问题的例子有一些解释的余地​​。我的回答只有在每个个体中确实只有两个基因并且每一行描述一个个体时才有效。但是,如果每一行都意味着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=1ID=2 的个体之间的欧几里得距离是:

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

而曼哈顿距离是

manhattan_dist = abs(0-0) + abs(1-1) + abs(0-0) + abs(0-0) + abs(0-1) + ...

【讨论】:

  • 我使用了这个命令:table(tab$gene1, tab$gene2) 来获取矩阵。我想绘制基因的系统发育图,而不是成对的。我想看看它们是如何单独聚集在一起的不是成对的。
  • 群组成员的数量由聚类算法决定。我认为您的(示例)数据中缺少一些信息来正确执行层次聚类。每行都应包含个体中存在的基因的所有字符串。
  • 我能够获得我正在寻找的系统发育图。正如我所说,我想对单个基因(而不是对)进行聚类,所以不得不稍微修改一下代码。但是它可能会很有趣也这样做。有没有办法获得关于哪些聚集在一起的表格信息(集群编号)?这样我就可以有一个包含集群编号及其分配项目的表格,在我们计算“fit
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-17
  • 1970-01-01
  • 2014-03-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多