2017-06-02 5 views
3

ヒートマップを描きたい。
私は100k * 100k正方行列(50Gb(csv)、右上の数字とそれ以外は0で塗りつぶしています)。"スーパービッグ"マトリックスでヒートマップを描く

「Rでヒートマップを描くにはどうすればよいですか?」この巨大なデータセットで
私は大規模なRAMマシン上でこのコードを試しています。

d = read.table("data.csv", sep=",") 
d = as.matrix(d + t(d)) 
heatmap(d) 

ヒートマップ2(gplots)などのライブラリを試しました。
しかし、彼らは非常に多くの時間と記憶があります。

+0

申し訳ありませんが、100kのX 100kのタイルのヒートマップもそれならば、画面上に可視化する全く不可能です画像が大きく縮小され、50×50のタイルがあるはずの補間されたピクセルが1つ表示されるため、マトリックスを拡大/縮小してヒートマップを呼び出すのはなぜですか? – digEmAll

+0

10:1の行と列のようにダウンサンプリングして描くべき意味ですか?この場合、クラスタは等しく見えますか? – kgyk1993

+0

ええと、それは私の言いたいことです...代わりに、100個のサブマトリクスでマトリクスを分けて、それぞれをプロットすることができます。 – digEmAll

答えて

9

ヒートマップをプロットする前にマトリックスを大幅にダウンサンプリングすることをお勧めします。各部分行列の平均値(@IaroslavDominにより示唆されるように)やって:あなたの巨大な行列で確実に

# example of big mx 10k x 10 k 
bigMx <- matrix(rnorm(10000*10000,mean=0,sd=100),10000,10000) 

# here we downsample the big matrix 10k x 10k to 100x100 
# by averaging each submatrix 
downSampledMx <- matrix(NA,100,100) 
subMxSide <- nrow(bigMx)/nrow(downSampledMx) 
for(i in 1:nrow(downSampledMx)){ 
    rowIdxs <- ((subMxSide*(i-1)):(subMxSide*i-1))+1 
    for(j in 1:ncol(downSampledMx)){ 
    colIdxs <- ((subMxSide*(j-1)):(subMxSide*j-1))+1 
    downSampledMx[i,j] <- mean(bigMx[rowIdxs,colIdxs]) 
    } 
} 

# NA to disable the dendrograms 
heatmap(downSampledMx,Rowv=NA,Colv=NA) 

enter image description here

をそれがdownSampledMxを計算するためにしばらく時間がかかるだろうが、それは実現可能でなければなりません。


EDIT:

私はダウンサンプリングは、例えば、認識可能な "マクロパターン" を維持すべきだと思います次の例を参照してください。

# create a matrix with some recognizable pattern 
set.seed(123) 
bigMx <- matrix(rnorm(50*50,mean=0,sd=100),50,50) 
diag(bigMx) <- max(bigMx) # set maximum value on the diagonal 
# set maximum value on a circle centered on the middle 
for(i in 1:nrow(bigMx)){ 
    for(j in 1:ncol(bigMx)){ 
    if(abs((i - 25)^2 + (j - 25)^2 - 10^2) <= 16) 
     bigMx[i,j] <- max(bigMx) 
    } 
} 

# plot the original heatmap 
heatmap(bigMx,Rowv=NA,Colv=NA, main="original") 


# function used to down sample 
downSample <- function(m,newSize){ 
    downSampledMx <- matrix(NA,newSize,newSize) 
    subMxSide <- nrow(m)/nrow(downSampledMx) 
    for(i in 1:nrow(downSampledMx)){ 
    rowIdxs <- ((subMxSide*(i-1)):(subMxSide*i-1))+1 
    for(j in 1:ncol(downSampledMx)){ 
     colIdxs <- ((subMxSide*(j-1)):(subMxSide*j-1))+1 
     downSampledMx[i,j] <- mean(m[rowIdxs,colIdxs]) 
    } 
    } 
    return(downSampledMx) 
} 

# downsample x 2 and plot heatmap 
downSampledMx <- downSample(bigMx,25) 
heatmap(downSampledMx,Rowv=NA,Colv=NA, main="downsample x 2") 

# downsample x 5 and plot heatmap 
downSampledMx <- downSample(bigMx,10) 
heatmap(downSampledMx,Rowv=NA,Colv=NA, main="downsample x 5") 

はここ3本のヒートマップです:

enter image description here enter image description here enter image description here

+0

ありがとう@digEmAll !!私ははっきり理解した。ところで、ダウンサンプリングした行列は元の行列と同じ性質を示すと思いますか?私はマトリックスのプロパティがダウンサンプリングによって変更されることを心配しています(それがオリジナルのもので描画しようとした理由です)。 – kgyk1993

+0

私の編集をチェック;) – digEmAll

+0

丁寧な解説ありがとうございました。私がクラスタリングする必要がないときは、あなたが言ったことは正しいと思いますが、ダウンサンプリング後にクラスタリングを行う必要がある場合は似ていますか? – kgyk1993