22

Porównuję dwa sposoby tworzenia map ciepła z dendrogramami w R, jednym z made4 's heatplot i jednym z gplots z heatmap.2. Odpowiednie wyniki zależą od analizy, ale próbuję zrozumieć, dlaczego wartości domyślne są tak różne, i jak uzyskać obie funkcje, które dają ten sam wynik (lub bardzo podobny wynik), tak że rozumiem wszystkie parametry "czarnej skrzynki", zaangażowany w to.różnice w domyślnych ustawieniach heatmapy/klastrowania w R (heatplot versus heatmap.2)?

To jest przykład dane i pakiety:

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

klastrowania dane z heatmap.2 daje:

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

enter image description here

Korzystanie heatplot daje:

heatplot(data) 

enter image description here

początkowo bardzo różne wyniki i skalowania. heatplot wyniki wyglądają bardziej rozsądnie w tym przypadku, więc chciałbym zrozumieć, jakie parametry podać do heatmap.2, aby uzyskać to samo, ponieważ heatmap.2 ma inne zalety/cechy, których chciałbym użyć i ponieważ chcę zrozumieć brakujące Składniki.

heatplot wykorzystuje średnią wiązanie z odległością korelacji więc można karmić że w heatmap.2 celu zapewnienia podobnej clusterings wykorzystuje (w oparciu o: https://stat.ethz.ch/pipermail/bioconductor/2010-August/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) 

powodując: enter image description here

czyni wiersz -dobre dendrogramy wyglądają bardziej podobnie, ale kolumny są nadal różne, podobnie jak skale. Wygląda na to, że domyślnie heatplot skaluje kolumny domyślnie, że heatmap.2 nie robi tego domyślnie. Gdybym dodać wiersz skalowania do heatmap.2, otrzymuję:

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

enter image description here

która nadal nie jest identyczna, ale jest bliżej. Jak mogę odtworzyć wyniki heatplot z heatmap.2? Jakie są różnice?

Edit2: wydaje się, że kluczową różnicą jest to, że heatplot przeskalowanie dane z obu rzędów i kolumn, używając:

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

to co próbuję zaimportować na moje wezwanie do heatmap.2. Powodem, dla którego podoba mi się to, ponieważ powoduje, że kontrasty są większe pomiędzy wartościami niższą a wysoką, podczas gdy samo przekazywanie zlim do heatmap.2 zostaje po prostu zignorowane. Jak mogę użyć tego "podwójnego skalowania" przy zachowaniu klastrowania wzdłuż kolumn?Wszystko czego chcę to zwiększony kontrast można uzyskać z:

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

porównaniu z niskim kontraście można uzyskać z:

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

wszelkie pomysły w tej sprawie?

+0

Do ostatniego polecenia spróbuj dodać 'symbreaks = FALSE', aby uzyskać podobną kolorystykę do' heatplot'. Nadal kolumny dendrogramy potrzebują pracy. – harkmug

+0

@rmk dziękuję, nie jestem pewien, rozumiem, co to 'symbreaks' robi. jakieś pomysły na różnice w col dendrogramie? – user248237dfsf

+0

'symbreaks = FALSE' sprawia, że ​​kolorystyka nie jest symetryczna, jak widać w' heatplot', gdzie wartość 0 nie jest biała (nadal nieco niebieska). Jeśli chodzi o dendrogram, myślę, że 'heatamap.2' może być w porządku. Zauważ, że w 'heatmap.2', EWS.T1 i EWS.T6 są side-by-side, podczas gdy w' heatplot', jego EWS.T4 i EWS.T6. Pierwsza ma dystans 0,2, podczas gdy druga para ma 0,5. – harkmug

Odpowiedz

33

główne różnice między heatmap.2 i heatplot funkcji są:

  1. heatmap.2, jako domyślny wykorzystuje euklidesowa środek uzyskania macierzy odległości oraz z Metody aglomeracji do grupowania, podczas zastosowania heatplot korelacja i średnia metoda aglomeracji odpowiednio.

  2. Mapa termiczna.2 oblicza macierz odległości i uruchamia algorytm grupowania przed skalowaniem, natomiast klastry heatplot (gdy dualScale=TRUE) skalują dane.

  3. Mapa termiczna.2 zmienia kolejność dendrogramów na podstawie średnich wartości w wierszach i kolumnach, zgodnie z opisem here.

Ustawienia domyślne (str. 1) można łatwo zmienić w heatmap.2, poprzez dostarczanie niestandardowych distfun i hclustfun argumenty. Jednak p. 2 i 3 nie można łatwo rozwiązać, bez zmiany kodu źródłowego. Dlatego funkcja heatplot działa jako wrapper dla heatmap.2. Najpierw stosuje niezbędne przekształcenie danych, oblicza macierz odległości, gromadzi dane, a następnie wykorzystuje funkcjonalność mapy ciepła tylko do wykreślenia mapy cieplnej z powyższymi parametrami.

Argument dualScale=TRUE w funkcji Heatplot dotyczy tylko centrowania i skalowania opartego na wierszach (description). Następnie, przypisuje skrajne (description) skalowanego danych wartości zlim:

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

W celu dopasowania do wyjścia z funkcji heatplot, ja Proponujemy dwa rozwiązania:

I - dodać nowe funkcje do kodu źródłowego -> heatmap.3

Kod można znaleźć here. Zapraszam do przejrzenia wersji, aby zobaczyć zmiany wprowadzone w funkcji heatmap.2.Podsumowując, ja wprowadził następujące opcje:

  • transformacja z-score jest wykonywane przed klastrów: scale=c("row","column")
  • skrajne wartości mogą być zmiany przypisania w skalowany danych: zlim=c(-3,3)
  • opcji, aby wyłączyć dendrogram zmiana kolejności: reorder=FALSE

Przykład:

# 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 - zdefiniować funkcję, która zapewnia wszystkie wymagane argumenty do heatmap.2

Jeśli wolisz używać oryginalnego heatmap.2, funkcję zClust (poniżej) odtwarza wszystkie kroki wykonywane przez heatplot. Zapewnia (w formie listy) skalowane matryce danych, dendrogramy wiersza i kolumny. Mogą być używane jako wejście do funkcji 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) 

kilka dodatkowych uwag dotyczących heatmap.2(3) funkcjonalność:

  • symbreak=TRUE jest zalecane podczas skalowania jest stosowana. Skoryguje skalę kolorów, więc będzie się ona łamać około 0. W bieżącym przykładzie wartości ujemne = niebieskie, a wartości dodatnie = czerwone.
  • col=bluered(256) może stanowić alternatywne rozwiązanie kolorowania i nie wymaga biblioteki RColorBrewer.
+1

pełna odpowiedź. Dokładnie to, czego potrzebowałem. Wielkie dzięki! – yuk

+2

Napisałem to jako samouczek i dodałem rozszerzoną wersję pakietu ZClust TWL do paczki: http://stanstrup.github.io/heatmaps/ –