1000*1000 のマトリックス (整数の 0 と 1 のみを含む) がありますが、ヒートマップを作成しようとすると、大きすぎてエラーが発生します。
このような大規模なマトリックスを使用してヒートマップを作成するにはどうすればよいですか?
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))
ヒートマップから本当に欲しいものを検討したい場合があります。つまり、派手な樹状図/並べ替えが必要ですか?
このSOの質問には、Rメモリ管理に関するアドバイスがあります。1000 x 1000の画像を割り当てることができない場合は、携帯電話で統計情報を取得するのをやめる必要があります。
試してみるとエラーはありません。コードは次のとおりです。
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))
ラスターパッケージを試してみると、巨大なラスターファイルを扱うことができます。
を使用すると、デフォルトの関数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)
メモリ使用量を制限内に保つことはuseRaster=TRUE
非常に重要なようです。で同じ引数を使用できますheatmap.2
。階層的クラスタリングの距離行列の計算は、計算の主なオーバーヘッドですが、大きな行列にheatmap3
はより効率的なfastcluster
パッケージを使用します。非常に大きな行列を使用すると、距離ベースの階層クラスターを実行しようとしても、問題が発生することは避けられません。その場合でも、引数Rowv=NA
を使用Colv=NA
して行と列のデンドログラムを抑制し、他のロジックを使用して行と列を並べ替えることができます。
nrowcol <- 5000
dat <- matrix(ifelse(runif(nrowcol*nrowcol) > 0.5, 1, 0), nrow=nrowcol)
heatmap3(dat,useRaster=TRUE,Rowv=NA,Colv=NA)
8 Gb メモリを搭載した私のラップトップでも問題なく動作しますが、デンドログラムが含まれていると、すでにクランチし始めています。