2013-08-21 43 views
3

我有以下代码执行hiearchical 集群并将它们绘制在热图中。如何从R的hclust/heatmap.2获得集群成员

library(gplots) 
set.seed(538) 
# generate data 
y <- matrix(rnorm(50), 10, 5, dimnames=list(paste("g", 1:10, sep=""), paste("t", 1:5, sep=""))) 
# the actual data is much larger that the above 

# perform hiearchical clustering and plot heatmap 
test <- heatmap.2(y) 

哪些情节是: enter image description here

我想要做的是从情节 的各层次得到群集成员产生:

Clust 1: g3-g2-g4 
Clust 2: g2-g4 
Clust 3: g4-g7 
etc 
Cluster last: g1-g2-g3-g4-g5-g6-g7-g8-g9-g10 

有没有一种办法做它?

+0

我认为我有答案,但结果并不符合我的预期。您可以使用以下代码为行的树状图吐出一个簇成员资格矩阵: \t'cutree(as.hclust(test $ rowDendrogram),1:dim(y)[1])' 但是结果与热图树状图不一致。不知道为什么。也许别人可以阐明。 –

+1

如果您在生成数据之前使用'set.seed(10)'(或10以外的某个数字),那么人们可能会更容易回答您的问题。比我们都有完全相同的数据。 – zkurtz

回答

1

这种解决方案需要使用不同的packags计算集群结构:

# Generate data 
y = matrix(rnorm(50), 10, 5, dimnames=list(paste("g", 1:10, sep=""), paste("t", 1:5, sep=""))) 
# The new packags: 
library(nnclust) 
# Create the links between all pairs of points with 
# squared euclidean distance less than threshold 
links = nncluster(y, threshold = 2, fill = 1, give.up =1) 
# Assign a cluster number to each point 
clusters=clusterMember(links, outlier = FALSE) 
# Display the points that are "alone" in their own cluster: 
nas = which(is.na(clusters)) 
print(rownames(y)[nas]) 
clusters = clusters[-nas] 
# For each cluster (with at least two points), display the included points 
for(i in 1:max(clusters, na.rm = TRUE)) print(rownames(y)[clusters == i]) 

很明显,你会想这个修改成某种形式的功能更加人性化。特别是,这使聚类仅在树状图的一个水平上。要获得其他级别的集群,您必须使用参数threshold

1

毕竟我确实有答案! @zkurtz发现问题...我使用的数据与您使用的数据不同。我在代码中添加了set.seed(538)声明以稳定数据。

使用此代码来创建集群成员的矩阵使用下面的代码行的树状图:

cutree(as.hclust(test$rowDendrogram), 1:dim(y)[1]) 

这会给你:

1 2 3 4 5 6 7 8 9 10 
g1 1 1 1 1 1 1 1 1 1 1 
g2 1 2 2 2 2 2 2 2 2 2 
g3 1 2 2 3 3 3 3 3 3 3 
g4 1 2 2 2 2 2 2 2 2 4 
g5 1 1 1 1 1 1 1 4 4 5 
g6 1 2 3 4 4 4 4 5 5 6 
g7 1 2 2 2 2 5 5 6 6 7 
g8 1 2 3 4 5 6 6 7 7 8 
g9 1 2 3 4 4 4 7 8 8 9 
g10 1 2 3 4 5 6 6 7 9 10 
+0

谢谢。矩阵中每个值的含义是什么? 例如g9-9 = 8。 8是什么意思? – neversaint

+1

有10列数字。每列的名称是指集群(组)的数量。并且每列中的数字标识该行是哪个群集的成员。所以,当这些行被分组为9个簇时,第9列给出了每个行被分配到的簇号(1-9)。在这种情况下,g1在簇1中,g2和g4在簇2中,g3在簇3中,g5在簇4中,g6在簇5中,...,g9在簇8中,并且g10在集群9。 –