4

我有以下代码执行分层聚类并将它们绘制在热图中。

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)

哪个情节: 在此处输入图像描述

我想要做的是从图中的每个层次结构中获取集群成员,从而产生:

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

有没有办法做到这一点?

4

2 回答 2

2

毕竟,我确实有答案!@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
于 2013-08-21T16:37:10.890 回答
1

此解决方案需要使用不同的包计算集群结构:

# 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参数。

于 2013-08-21T13:14:34.160 回答