22

Ich vergleiche zwei Möglichkeiten zum Erstellen von Heatmaps mit Dendrogramme in R, eins mit made4heatplot und eins mit gplots von heatmap.2. Die entsprechenden Ergebnisse hängen von der Analyse ab, aber ich versuche zu verstehen, warum die Standardwerte so unterschiedlich sind und wie beide Funktionen das gleiche Ergebnis (oder ein sehr ähnliches Ergebnis) erhalten, so dass ich alle Blackbox-Parameter verstehe das mögen.Unterschiede in Heatmap/Clustering Standard in R (Heatplot gegen Heatmap.2)?

Dies ist das Beispiel Daten und Pakete:

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

die Daten mit heatmap.2 Clustering gibt:

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

enter image description here

heatplot Verwendung gibt:

heatplot(data) 

enter image description here

sehr unterschiedliche Ergebnisse und Skalierungen zunächst. heatplot Ergebnisse sehen in diesem Fall vernünftiger, so würde ich gerne verstehen, welche Parameter in heatmap.2 eingegeben werden, um es gleich zu tun, da heatmap.2 hat andere Vorteile/Funktionen, die ich gerne verwenden würde und weil ich die fehlenden verstehen will Zutaten.

heatplot verwendet durchschnittliche Verknüpfung mit Abstandskorrelation so wir das in heatmap.2 einspeisen kann ähnlich Clusterings verwendet (auf der Grundlage: https://stat.ethz.ch/pipermail/bioconductor/2010-August/034757.html) sind, um sicherzustellen,

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) 

ergibt: enter image description here

Dies macht die Zeilen -Dendrogramme sehen ähnlicher aus, aber die Spalten sind immer noch unterschiedlich und auch die Skalen. Es scheint, dass heatplot skaliert die Spalten irgendwie standardmäßig heatmap.2 nicht standardmäßig tun. Wenn ich eine Reihe-Skalierung heatmap.2 hinzufügen, erhalte ich:

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

enter image description here

, die noch nicht identisch ist, aber näher. Wie kann ich die heatplot Ergebnisse mit heatmap.2 reproduzieren? Was sind die Unterschiede?

edit2: es wie ein wesentlicher Unterschied scheint ist, dass heatplot die Daten sowohl mit Zeilen und Spalten neu skaliert, mit:

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 = "") 
} 

das ist, was ich versuche zu heatmap.2 meinen Ruf zu importieren. Der Grund, warum ich es mag, ist, weil es die Kontraste zwischen den niedrigen und hohen Werten größer macht, während einfach zlim zu heatmap.2 einfach ignoriert wird. Wie kann ich diese "doppelte Skalierung" verwenden, während das Clustering entlang der Spalten beibehalten wird?Alles was ich will ist der erhöhte Kontrast Sie erhalten:

auf diesem

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

alle Ideen:

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

mit dem niedrigen Kontrast Sie erhalten im Vergleich? die folgende

+0

Zum letzten Befehl, fügen Sie 'symreaks = FALSE' hinzu, um eine ähnliche Färbung wie' heatplot' zu erhalten. Trotzdem müssen die Spalten-Dendrogramme funktionieren. – harkmug

+0

@rmk danke, nicht sicher, ich verstehe, was 'symbreaks' tut, obwohl. Irgendwelche Ideen zu den Farbendogramm-Unterschieden? – user248237dfsf

+0

'symmreaks = FALSE' macht die Färbung nicht symmetrisch, wie in' heatplot' zu sehen, wo der Wert 0 nicht weiß ist (immer noch ein bisschen blau). Was das Dendrogramm betrifft, denke ich, dass 'heatamap.2' es richtig machen könnte. Beachten Sie, dass EWT.T1 und EWS.T6 in 'heatmap.2' nebeneinander stehen, während in 'heatplot' die EWS.T4 und EWS.T6 sind. Ersteres hat einen Abstand von 0.2, während letzteres 0.5 hat. – harkmug

Antwort

33

Die Hauptunterschiede zwischen heatmap.2 und heatplot Funktionen sind:

  1. heatmap.2, als Standard euklidischen Maßnahme verwendet Distanzmatrix und vollständige Agglomerationsverfahren zum Clustern zu erhalten, während heatplot Verwendungen Korrelation und Durchschnitt Agglomerationsmethode, beziehungsweise.

  2. heatmap.2 berechnet die Abstandsmatrix und führt den Clustering-Algorithmus vor der Skalierung aus, während heatplot (wenn dualScale=TRUE) bereits skalierte Daten gruppiert.

  3. heatmap.2 ordnet das Dendrogramm auf der Basis der Zeilen- und Spaltenmittelwerte neu an, wie beschrieben here.

Standardeinstellungen (Seite 1) einfach innerhalb heatmap.2 geändert werden, indem Sie benutzerdefinierte distfun und hclustfun Argumente liefern. Jedoch p. 2 und 3 können nicht einfach angesprochen werden, ohne den Quellcode zu ändern. Daher fungiert heatplot Funktion als Wrapper für heatmap.2. Zuerst wendet es die notwendige Transformation auf die Daten an, berechnet die Abstandsmatrix, gruppiert die Daten und verwendet dann die heatmap.2-Funktionalität, um nur die Heatmap mit den obigen Parametern zu plotten.

Das Argument dualScale=TRUE in der Heatplot-Funktion gilt nur für die zeilenbasierte Zentrierung und Skalierung (description). Dann ordnet er die Extrema (description) der skalierten Daten an die zlim Werte:

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

Um die Ausgabe von der heatplot Funktion übereinstimmen, ich möchte zwei Lösungen vorgeschlagen:

I - neue Funktionen zur Codequelle hinzufügen -> heatmap.3

der Code here gefunden werden kann. Fühlen Sie sich frei, durch Revisionen zu sehen, um die Änderungen an der heatmap.2-Funktion zu sehen.Zusammenfassend stellte ich die folgenden Optionen:

  • Z-Score-Transformation wird vor dem Clustering durchgeführt: zlim=c(-3,3)
  • Option auszuschalten dendrogram: scale=c("row","column")
  • die Extremwerte innerhalb des skalierten Daten neu zugewiesen werden Neuordnen: reorder=FALSE

Ein Beispiel:

# 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 - definiert eine Funktion, die alle erforderlichen Argumente an die heatmap.2

Wenn Sie es vorziehen, verwenden, um die ursprüngliche heatmap.2, die zClust Funktion (unten) wiedergibt alle stellt die Schritte, die vom Heatplot durchgeführt werden. Es stellt (in einem Listenformat) die skalierten Datenmatrix-, Zeilen- und Spalten-Dendrogramme bereit. Diese können als eine Eingabe in den heatmap.2 Funktion verwendet werden:

# 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) 

Ein paar zusätzliche Kommentare zu heatmap.2(3) Funktionalität:

  • symbreak=TRUE wird empfohlen, wenn die Skalierung angewendet wird. Es wird die Farbskala anpassen, so dass es um 0 herum bricht. Im aktuellen Beispiel sind die negativen Werte = blau, während die positiven Werte = rot sind.
  • col=bluered(256) kann eine alternative Färbung Lösung zur Verfügung stellen, und es erfordert keine RColorBrewer-Bibliothek.
+1

Großartig und vollständige Antwort. Genau das, was ich brauchte. Danke vielmals! – yuk

+2

Ich habe dies als Tutorial geschrieben und eine erweiterte Version von TWL's zClust zu einem Paket hinzugefügt: http://stanstrup.github.io/heatmaps/ –