22

Tôi đang so sánh hai cách tạo bản đồ nhiệt với dendrogram trong R, một với made4 's heatplot và một với gplots của heatmap.2. Các kết quả phù hợp phụ thuộc vào phân tích nhưng tôi đang cố gắng hiểu tại sao các giá trị mặc định khác nhau và cách lấy cả hai hàm để cho kết quả tương tự (hoặc kết quả tương tự cao) để tôi hiểu tất cả các tham số 'blackbox' vào điều này.sự khác biệt trong các giá trị mặc định của bản đồ nhiệt/nhóm trong R (heatplot so với heatmap.2)?

Đây là ví dụ dữ liệu và các gói:

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

Clustering dữ liệu với heatmap.2 cho:

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

enter image description here

Sử dụng heatplot cho:

heatplot(data) 

enter image description here

các kết quả và tỷ lệ khác nhau ban đầu. heatplot kết quả trông hợp lý hơn trong trường hợp này vì vậy tôi muốn hiểu những thông số nào để nạp vào heatmap.2 để làm cho nó giống nhau, vì heatmap.2 có các ưu điểm/tính năng khác mà tôi muốn sử dụng và vì tôi muốn hiểu Thành phần.

heatplot sử dụng liên kết trung bình với khoảng cách tương quan vì vậy chúng tôi có thể thức ăn đó vào heatmap.2 để đảm bảo clusterings tương tự được sử dụng (dựa trên: 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) 

kết quả là: enter image description here

điều này làm cho hàng dendrograms trông giống nhau hơn nhưng các cột vẫn khác nhau và do đó là các vảy. Có vẻ như heatplot quy mô các cột bằng cách nào đó theo mặc định là heatmap.2 không làm điều đó theo mặc định. Nếu tôi thêm một hàng-rộng để heatmap.2, tôi nhận được:

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

enter image description here

mà vẫn không phải là giống hệt nhau nhưng là gần gũi hơn. Làm thế nào tôi có thể tái sản xuất các kết quả của heatplot với heatmap.2? Sự khác biệt là gì?

edit2: nó có vẻ như một sự khác biệt quan trọng là heatplot lại tỷ lệ chia dữ liệu với cả hàng và cột, sử dụng:

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

đây là những gì tôi đang cố gắng để nhập khẩu kêu gọi của Mẹ để heatmap.2. Lý do tôi thích nó là bởi vì nó làm cho sự tương phản lớn hơn giữa các giá trị thấp và cao, trong khi chỉ cần đi qua zlim đến heatmap.2 bị bỏ qua. Làm thế nào tôi có thể sử dụng 'quy mô kép' này trong khi vẫn bảo toàn nhóm dọc theo các cột?Tất cả tôi muốn là sự tương phản tăng bạn nhận được với:

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

so với độ tương phản thấp bạn nhận được với:

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

bất kỳ ý tưởng về điều này?

+0

Để lệnh cuối cùng, hãy thử thêm 'symbreaks = FALSE' để có màu tương tự như' heatplot'. Dendrograms cột vẫn cần làm việc. – harkmug

+0

@rmk cảm ơn, không chắc tôi hiểu 'symbreaks' làm gì. bất kỳ ý tưởng nào về sự khác biệt về chương trình biểu diễn col? – user248237dfsf

+0

'symbreaks = FALSE' làm cho màu không đối xứng như được thấy trong' heatplot' trong đó giá trị 0 không phải là màu trắng (màu xanh dương). Đối với chương trình dendrogram, tôi nghĩ rằng 'heatamap.2' có thể là đúng. Lưu ý rằng trong 'heatmap.2', EWS.T1 và EWS.T6 là song song, trong khi trong' heatplot', EWS.T4 và EWS.T6 của nó. Các cựu có một 0,2, trong khi cặp sau có 0,5. – harkmug

Trả lời

33

Sự khác biệt chính giữa heatmap.2heatplot chức năng như sau:

  1. heatmap.2, như mặc định sử dụng Euclide biện pháp để có được ma trận khoảng cách và hoàn chỉnh phương pháp tụ cho clustering, trong khi sử dụng heatplot Tương ứng tương quantrung bình phương pháp kết tụ.

  2. heatmap.2 tính toán ma trận khoảng cách và chạy thuật toán phân cụm trước khi chia tỷ lệ, trong khi các cụm đã được chia tỷ lệ.

  3. heatmap.2 sắp xếp lại dendrogram dựa trên giá trị trung bình của hàng và cột, như được mô tả here.

Mặc định cài đặt (p. 1) có thể được chỉ đơn giản là thay đổi trong vòng heatmap.2, bằng cách cung cấp distfunhclustfun đối số tùy chỉnh. Tuy nhiên p. 2 và 3 không thể dễ dàng giải quyết, mà không thay đổi mã nguồn. Do đó heatplot hoạt động như một trình bao bọc cho bản đồ nhiệt.2. Đầu tiên, nó áp dụng chuyển đổi cần thiết cho dữ liệu, tính toán ma trận khoảng cách, cụm dữ liệu, và sau đó sử dụng chức năng heatmap.2 chỉ để vẽ sơ đồ nhiệt với các tham số trên.

Đối số dualScale=TRUE trong chức năng gia nhiệt, chỉ áp dụng định tâm và chia tỷ lệ hàng (description). Sau đó, nó reassigns những thái cực (description) của dữ liệu có quy mô đến zlim giá trị:

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

Để phù hợp với sản lượng từ các chức năng heatplot, tôi xin đề nghị hai giải pháp:

I - thêm chức năng mới vào mã nguồn -> heatmap.3

Mã này có thể tìm thấy here. Vui lòng duyệt qua các bản sửa đổi để xem các thay đổi được thực hiện với chức năng heatmap.2.Nói tóm lại, tôi giới thiệu các tùy chọn sau:

  • biến đổi z-score được thực hiện trước khi các phân nhóm: scale=c("row","column")
  • các giá trị cực đoan có thể được bố trí trong các dữ liệu quy mô: zlim=c(-3,3)
  • tùy chọn để tắt dendrogram sắp xếp lại: reorder=FALSE

Một ví dụ:

# 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 - định nghĩa một hàm mà cung cấp tất cả các đối số cần thiết để các heatmap.2

Nếu bạn thích sử dụng heatmap.2 gốc, zClust chức năng (dưới đây) tái tạo tất cả các các bước thực hiện bằng heatplot. Nó cung cấp (trong một định dạng danh sách) ma trận dữ liệu được chia tỷ lệ, hàng và cột dendrograms. Đây có thể được sử dụng như một đầu vào của hàm 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) 

vài ý kiến ​​bổ sung về heatmap.2(3) chức năng:

  • symbreak=TRUE được khuyến khích khi mở rộng quy mô được áp dụng. Nó sẽ điều chỉnh thang màu, do đó nó sẽ phá vỡ xung quanh 0. Trong ví dụ hiện tại, giá trị âm = xanh dương, trong khi giá trị dương = màu đỏ.
  • col=bluered(256) có thể cung cấp giải pháp thay thế màu và không yêu cầu thư viện RColorBrewer.
+1

Tuyệt vời và câu trả lời hoàn chỉnh. Chính xác những gì tôi cần. Cảm ơn rất nhiều! – yuk

+2

Tôi đã viết điều này như một hướng dẫn và thêm một phiên bản mở rộng của zClust của TWL vào một gói: http://stanstrup.github.io/heatmaps/ –

Các vấn đề liên quan