2013-08-21 69 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。 –