如何制作带有大矩阵的热图?

que*_*ion 10 r heatmap

我有一个1000*1000矩阵(只包含整数0和1),但是当我尝试制作热图时,会发生错误,因为它太大了.

如何创建具有如此大矩阵的热图?

Ben*_*ker 13

我相信热图至少需要很长时间,因为heatmap很多花哨的东西需要额外的时间和记忆.使用dat来自@ bill_080的示例:

## basic command: 66 seconds
t0 <- system.time(heatmap(dat))
## don't reorder rows & columns: 43 seconds
t1 <- system.time(heatmap(dat,Rowv=NA))
## remove most fancy stuff (from ?heatmap): 14 seconds
t2 <- system.time( heatmap(dat, Rowv = NA, Colv = NA, scale="column",
             main = "heatmap(*, NA, NA) ~= image(t(x))"))
## image only: 13 seconds
t3  <- system.time(image(dat))
## image using raster capability in R 2.13.0: 1.2 seconds
t4 <- system.time(image(dat,useRaster=TRUE))
Run Code Online (Sandbox Code Playgroud)

您可能想要考虑热像图中您真正想要的东西 - 即,您是否需要花式树形图/重新排序的东西?


Ric*_*ton 11

关于R内存管理的SO问题有建议.如果您无法分配1000 x 1000图像,那么您可能应该停止尝试在手机上执行统计信息.

  • 我可以为我的palmpilot获得R backported吗? (5认同)
  • 从我的iPhone发送 (2认同)
  • 主要的开销不是绘制图像,而是进行层次聚类分析,因为这需要计算成对距离矩阵,众所周知,这很难扩展到更大的问题...甚至只是绘制图像内存使用量异常高 - 5000 x 5000矩阵的水平图占用了6 Gb的内存; 这可以通过在heatmap.2或heatmap3中使用参数useRaster = TRUE来解决....不知道标准热图功能在那里发生了什么...... (2认同)

bil*_*080 8

我尝试时没有错误.这是代码:

 library(lattice)

 #Build the data
 nrowcol <- 1000
 dat <- matrix(ifelse(runif(nrowcol*nrowcol) > 0.5, 1, 0), nrow=nrowcol)

 #Build the palette and plot it
 pal <- colorRampPalette(c("red", "yellow"), space = "rgb")
 levelplot(dat, main="1000 X 1000 Levelplot", xlab="", ylab="", col.regions=pal(4), cuts=3, at=seq(0,1,0.5))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


dic*_*koa 5

尝试光栅包,它可以处理巨大的光栅文件.


Tom*_*ers 5

使用heatmap3,它比默认heatmap函数具有更高的内存效率,并且通过使用fastcluster包进行分层聚类对我来说效果更好。添加参数useRaster=TRUE也有帮助:

library(heatmap3)
nrowcol <- 1000
dat <- matrix(ifelse(runif(nrowcol*nrowcol) > 0.5, 1, 0), nrow=nrowcol)
heatmap3(dat,useRaster=TRUE)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

useRaster=TRUE将内存使用控制在限制范围内似乎非常重要。您可以在 中使用相同的参数heatmap.2。计算层次聚类的距离矩阵是计算中的主要开销,但对于大型矩阵,heatmap3使用更有效的包。对于非常大的矩阵,尽管尝试进行基于距离的层次聚类,您将不可避免地遇到麻烦。在这种情况下,您仍然可以使用参数并抑制行和列树状图,并使用其他一些逻辑对行和列进行排序,例如fastclusterRowv=NAColv=NA

nrowcol <- 5000
dat <- matrix(ifelse(runif(nrowcol*nrowcol) > 0.5, 1, 0), nrow=nrowcol)
heatmap3(dat,useRaster=TRUE,Rowv=NA,Colv=NA)
Run Code Online (Sandbox Code Playgroud)

在我的 8 Gb 内存笔记本电脑上仍然可以毫无问题地运行,而包含树状图后,它已经开始崩溃了。