2013-08-21 3 views
3

J'ai le code suivant qui effectue la classification hiérarchique et les tracer dans heatmap.Comment obtenir un membre de clusters à partir de h/h heat/heatmap.2 R

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) 

Ce qui intrigue ceci: enter image description here

Ce que je veux faire est d'obtenir le membre du cluster de chaque hiérarchie de la parcelle qui donne:

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 

est-il un moyen de fais le?

+0

Je pensais avoir la réponse, mais les résultats ne sont pas ce que je m'attendais. Vous pouvez cracher sur une matrice d'appartenance de groupe pour le dendrogramme des lignes en utilisant le code suivant: \t 'cutree (as.hclust (test rowDendrogram de $), 1: dim (y) [1])' Mais la le résultat n'est pas d'accord avec le dendrogramme heatmap. Pas certain de pourquoi. Peut-être que quelqu'un d'autre peut l'expliquer. –

+1

Il peut être plus facile pour les gens de répondre à votre question en détail si vous utilisez 'set.seed (10)' (ou un nombre autre que 10) juste avant de générer les données. Que nous avons tous exactement les mêmes données. – zkurtz

Répondre

1

Cette solution nécessite calcul de la structure du cluster en utilisant un autre 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]) 

Il est évident que vous voulez réviser cela en fonction d'une certaine sorte d'être plus convivial. En particulier, cela donne les grappes à un seul niveau du dendrogramme. Pour obtenir les clusters à d'autres niveaux, vous devez jouer avec le paramètre threshold.

1

J'ai eu la réponse, après tout! @zkurtz a identifié le problème ... les données que j'utilisais étaient différentes des données que vous utilisiez. J'ai ajouté une instruction set.seed(538) à votre code pour stabiliser les données.

Utilisez ce code pour créer une matrice d'appartenance de groupe pour le dendrogramme des lignes en utilisant le code suivant:

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

Cela vous donnera:

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

Merci. Quelle est la signification de chaque valeur dans la matrice? Par exemple g9-9 = 8. Que veut dire 8 ici? – neversaint

+1

Il y a 10 colonnes de nombres. Le nom de chaque colonne fait référence au nombre de groupes (groupes). Et les numéros de chaque colonne identifient le cluster dont la ligne est membre. Ainsi, lorsque les lignes sont regroupées en 9 groupes, la 9e colonne indique le numéro de groupe (1-9) dans lequel chaque ligne est affectée. Dans ce cas, g1 est dans le cluster 1, g2 et g4 sont dans le cluster 2, g3 dans le cluster 3, g5 dans le cluster 4, g6 dans le cluster 5, ..., g9 dans le cluster 8 et g10 dans le cluster cluster 9. –

Questions connexes