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")
Korzystanie heatplot
daje:
heatplot(data)
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:
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")
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?
Do ostatniego polecenia spróbuj dodać 'symbreaks = FALSE', aby uzyskać podobną kolorystykę do' heatplot'. Nadal kolumny dendrogramy potrzebują pracy. – harkmug
@rmk dziękuję, nie jestem pewien, rozumiem, co to 'symbreaks' robi. jakieś pomysły na różnice w col dendrogramie? – user248237dfsf
'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