2017-06-02 7 views
3

Ich möchte eine Heatmap zeichnen.
Ich habe 100k * 100k quadratische Matrix (50 GB (csv), Zahlen auf der rechten oberen Seite und andere von 0 gefüllt).Zeichnen Sie eine Heatmap mit "super big" Matrix

Ich möchte fragen "Wie kann ich eine Heatmap mit R zeichnen?" mit diesem riesigen Datensatz.
Ich versuche diesen Code auf großen RAM-Rechner.

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

Ich habe einige Bibliotheken wie heatmap.2 (in gplots) oder so etwas versucht.
Aber sie brauchen so viel Zeit und Erinnerungen.

+0

Sorry, aber eine Heatmap von 100k x 100k Fliesen ist völlig unmöglich, auf einem Bildschirm sichtbar zu machen, auch wenn es funktioniert das Bild würde stark verkleinert werden und Sie werden ein interpoliertes Pixel sehen, wo es 50x50 Kacheln sein sollte ... also, warum skalieren Sie nicht die Matrix und dann Heatmap aufrufen? – digEmAll

+0

Bedeutungen sollte ich Downsampling wie 10: 1 Zeilen und Spalten und zeichnen? In diesem Fall sieht der Cluster gleich aus? – kgyk1993

+0

Yep, das ist was ich meine ... alternativ könnten Sie Ihre Matrix in etwa 100 Submatrizen trennen und jede von ihnen plotten ... – digEmAll

Antwort

9

Ich schlage vor, dass Sie Ihre Matrix vor dem Plotten der Heatmap, z. dabei den Mittelwert jeder Untermatrizen (wie von @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

Für Sie mit Ihrer großen Matrix wird es eine Weile dauern, die downSampledMx zu berechnen, aber es sollte machbar sein.


EDIT:

Ich denke, Abwärtsabtastens sollte erkennbar "Makro-Muster" erhalten, zum Beispiel siehe folgendes Beispiel:

# 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") 

Hier ist die 3 Heatmaps:

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

+0

Danke @digEmAll !! Ich habe es klar verstanden. Übrigens, glauben Sie, dass die Downsampling-Matrix die gleichen Eigenschaften wie die Original-Matrix aufweist? Ich bin besorgt, dass die Eigenschaften der Matrix durch Downsampling geändert werden (und deshalb habe ich versucht, mit Original zu zeichnen). – kgyk1993

+0

Überprüfen Sie meine Bearbeitung;) – digEmAll

+0

Vielen Dank für den höflichen Kommentar. Wenn ich nicht clustern muss, denke ich, dass das, was Sie gesagt haben, korrekt ist, aber ist es ähnlich, wenn Sie Clustering nach dem Downsampling durchführen müssen? – kgyk1993

Verwandte Themen