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")
L'utilisation de heatplot
donne:
heatplot(data)
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:
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")
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?
Les principales différences entre les fonctions heatmap.2
Et heatplot
sont les suivantes:
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.
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.
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:
scale=c("row","column")
zlim=c(-3,3)
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)
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.