web-dev-qa-db-fra.com

différences dans les valeurs par défaut de heatmap / clustering dans R (heatplot versus heatmap.2)?

Je compare deux façons de créer des heatmaps avec des dendrogrammes en R, une avec heatplot de made4 Et une avec gplots de heatmap.2. Les résultats appropriés dépendent de l'analyse, mais j'essaie de comprendre pourquoi les valeurs par défaut sont si différentes et comment obtenir les deux fonctions pour donner le même résultat (ou un résultat très similaire) afin que je comprenne tous les paramètres de la `` boîte noire '' qui vont en cela.

Voici les exemples de données et de packages:

require(gplots)
# made4 from bioconductor
require(made4)
data(khan)
data <- as.matrix(khan$train[1:30,])

Le regroupement des données avec heatmap.2 donne:

heatmap.2(data, trace="none")

enter image description here

L'utilisation de heatplot donne:

heatplot(data)

enter image description here

résultats et échelles très différents au départ. heatplot les résultats semblent plus raisonnables dans ce cas, donc j'aimerais comprendre quels paramètres alimenter heatmap.2 pour qu'il fasse de même, car heatmap.2 a d'autres avantages/fonctionnalités que je voudrais utiliser et parce que je veux comprendre les ingrédients manquants.

heatplot utilise une liaison moyenne avec une distance de corrélation afin que nous puissions l'intégrer dans heatmap.2 pour garantir que des regroupements similaires sont utilisés (basé sur: https://stat.ethz.ch/pipermail/ bioconducteur/2010-août/034757.html )

dist.pear <- function(x) as.dist(1-cor(t(x)))
hclust.ave <- function(x) hclust(x, method="average")
heatmap.2(data, trace="none", distfun=dist.pear, hclustfun=hclust.ave)

résultant en: enter image description here

cela rend les dendrogrammes côté ligne plus similaires mais les colonnes sont toujours différentes et les échelles aussi. Il semble que heatplot redimensionne les colonnes par défaut que heatmap.2 Ne le fasse pas par défaut. Si j'ajoute une mise à l'échelle des lignes à heatmap.2, j'obtiens:

heatmap.2(data, trace="none", distfun=dist.pear, hclustfun=hclust.ave,scale="row")

enter image description here

qui n'est toujours pas identique mais plus proche. Comment puis-je reproduire les résultats de heatplot avec heatmap.2? Quelles sont les différences?

edit2 : il semble que la principale différence est que heatplot redimensionne les données avec des lignes et des colonnes, en utilisant:

if (dualScale) {
    print(paste("Data (original) range: ", round(range(data), 
        2)[1], round(range(data), 2)[2]), sep = "")
    data <- t(scale(t(data)))
    print(paste("Data (scale) range: ", round(range(data), 
        2)[1], round(range(data), 2)[2]), sep = "")
    data <- pmin(pmax(data, zlim[1]), zlim[2])
    print(paste("Data scaled to range: ", round(range(data), 
        2)[1], round(range(data), 2)[2]), sep = "")
}

c'est ce que j'essaie d'importer dans mon appel à heatmap.2. La raison pour laquelle je l'aime est parce qu'elle rend les contrastes plus grands entre les valeurs basses et hautes, alors que le simple passage de zlim à heatmap.2 Est simplement ignoré. Comment puis-je utiliser cette "double mise à l'échelle" tout en préservant le clustering le long des colonnes? Tout ce que je veux, c'est le contraste accru que vous obtenez avec:

heatplot(..., dualScale=TRUE, scale="none")

par rapport au faible contraste que vous obtenez avec:

heatplot(..., dualScale=FALSE, scale="row")

des idées à ce sujet?

25
user248237

Les principales différences entre les fonctions heatmap.2 Et heatplot sont les suivantes:

  1. heatmap.2, par défaut utilise mesure euclidienne pour obtenir la matrice de distance et complète méthode d'agglomération pour le clustering, tandis que le heatplot utilise corrélation , et moyenne agglomération respectivement.

  2. heatmap.2 calcule la matrice de distance et exécute l'algorithme de clustering avant la mise à l'échelle, tandis que heatplot (lorsque dualScale=TRUE) regroupe les données déjà mises à l'échelle.

  3. heatmap.2 réorganise le dendrogramme en fonction des valeurs moyennes des lignes et des colonnes, comme décrit ici .

Les paramètres par défaut (p. 1) peuvent être simplement modifiés dans heatmap.2, en fournissant des arguments distfun et hclustfun personnalisés. Cependant p. 2 et 3 ne peuvent pas être facilement adressés, sans changer le code source. Par conséquent, la fonction heatplot agit comme un wrapper pour heatmap.2. Tout d'abord, il applique la transformation nécessaire aux données, calcule la matrice de distance, regroupe les données, puis utilise la fonctionnalité heatmap.2 uniquement pour tracer la heatmap avec les paramètres ci-dessus.

L'argument dualScale=TRUE Dans la fonction de tracé de chaleur, applique uniquement le centrage et la mise à l'échelle basés sur les lignes ( description ). Ensuite, il réaffecte les extrêmes ( description ) des données mises à l'échelle aux valeurs zlim:

z <- t(scale(t(data)))
zlim <- c(-3,3)
z <- pmin(pmax(z, zlim[1]), zlim[2])

Afin de faire correspondre la sortie de la fonction de tracé de chaleur, je voudrais proposer deux solutions:

I - ajoute de nouvelles fonctionnalités au code source -> heatmap.3

Le code peut être trouvé ici . N'hésitez pas à parcourir les révisions pour voir les modifications apportées à la fonction heatmap.2. En résumé, j'ai présenté les options suivantes:

  • la transformation z-score est effectuée avant le clustering: scale=c("row","column")
  • les valeurs extrêmes peuvent être réaffectées dans les données mises à l'échelle: zlim=c(-3,3)
  • option pour désactiver la réorganisation du dendrogramme: reorder=FALSE

Un exemple:

# require(gtools)
# require(RColorBrewer)
cols <- colorRampPalette(brewer.pal(10, "RdBu"))(256)

distCor <- function(x) as.dist(1-cor(t(x)))
hclustAvg <- function(x) hclust(x, method="average")

heatmap.3(data, trace="none", scale="row", zlim=c(-3,3), reorder=FALSE,
          distfun=distCor, hclustfun=hclustAvg, col=rev(cols), symbreak=FALSE) 

enter image description here


II - définir une fonction qui fournit tous les arguments requis au heatmap.2

Si vous préférez utiliser la heatmap.2 d'origine, la fonction zClust (ci-dessous) reproduit toutes les étapes effectuées par heatplot. Il fournit (sous forme de liste) la matrice de données mise à l'échelle, les dendrogrammes de lignes et de colonnes. Ceux-ci peuvent être utilisés comme entrée pour la fonction heatmap.2:

# depending on the analysis, the data can be centered and scaled by row or column. 
# default parameters correspond to the ones in the heatplot function. 
distCor <- function(x) as.dist(1-cor(x))
zClust <- function(x, scale="row", zlim=c(-3,3), method="average") {
    if (scale=="row") z <- t(scale(t(x)))
    if (scale=="col") z <- scale(x)
    z <- pmin(pmax(z, zlim[1]), zlim[2])
    hcl_row <- hclust(distCor(t(z)), method=method)
    hcl_col <- hclust(distCor(z), method=method)
    return(list(data=z, Rowv=as.dendrogram(hcl_row), Colv=as.dendrogram(hcl_col)))
}

z <- zClust(data)

# require(RColorBrewer)
cols <- colorRampPalette(brewer.pal(10, "RdBu"))(256)

heatmap.2(z$data, trace='none', col=rev(cols), Rowv=z$Rowv, Colv=z$Colv)

Quelques commentaires supplémentaires concernant la fonctionnalité heatmap.2(3):

  • symbreak=TRUE Est recommandé lorsque la mise à l'échelle est appliquée. Il ajustera l'échelle des couleurs, de sorte qu'il casse autour de 0. Dans l'exemple actuel, les valeurs négatives = bleu, tandis que les valeurs positives = rouge.
  • col=bluered(256) peut fournir une solution de coloration alternative et ne nécessite pas la bibliothèque RColorBrewer.
38
TWL