2013-05-15 6 views
5

Ive si è spostato su un nuovo server e ha installato R versione 3.0 su di esso. (la libreria gplots non era più disponibile per 2.14)Errore in heatmap.2 (gplots)

Utilizzando uno script che ha funzionato per la versione 2.14, ora ho riscontrato un problema nella generazione di una heatmap.

in R versione 3 ottengo un errore:

Error in lapply(args, is.character) : node stack overflow 
Error in dev.flush() : node stack overflow 
Error in par(op) : node stack overflow 

In R versione 2.14 ottengo un errore:

Error: evaluation nested too deeply: infinite recursion/options(expressions=)? 

Che posso risolvere aumentando le opzioni (espressioni = 500000)

Nella versione R 3 l'aumento di questa opzione non risolve il problema. E sono ancora bloccato con lo stesso errore.

Il copione è lo stesso per entrambi:

y=read.table("test", row.names=1, sep="\t", header=TRUE) 
hr <- hclust(dist(as.matrix(y))) 
hc <- hclust(dist(as.matrix(t(y)))) 
mycl <- cutree(hr, k=7); mycolhc <- rainbow(length(unique(mycl)), start=0.1, end=0.9); mycolhc  <- mycolhc[as.vector(mycl)] 

install.packages("gplots") 
library("gplots", character.only=TRUE) 
myheatcol <- redgreen(75) 

pdf("heatmap.pdf") 
heatmap.2(as.matrix(y), Rowv=as.dendrogram(hr), Colv=as.dendrogram(hc), col=myheatcol,scale="none", density.info="none", trace="none", RowSideColors=mycolhc, labRow=FALSE) 
dev.off() 

Dove "test" è un file TDL con le intestazioni e nomi di riga e di un 40 * 5000 0/1 matrice

Qualsiasi aiuto sarebbe apprezzato

PS: Quando riduco il mio set di dati a 2000 righe, non ricevo più l'errore.

PSS: l'aumento del set di dati a 2500 righe ha provocato lo stesso errore; Tuttavia, la rimozione di tutte le righe non informative (tutti 1) mi ha lasciato con 3700 linee. L'utilizzo di questo set di dati non ha comportato l'errore.

risposta

4

In another post è dalla funzione stats:::midcache.dendrogramsetmid. setmid si chiama in modo ricorsivo e questa ricorsione potrebbe essere troppo profonda - probabilmente il dendrogramma è troppo denso per avere un senso visivamente? È possibile vedere dove si verifica l'errore osservando le ultime righe di traceback() dopo l'errore.

di compiere ulteriori progressi con questo, è necessario essere in grado di fornire un minimal reproducible example (utilizzando heatmap piuttosto che heatmap.2, o anche più raffinato, sulla base di un'interpretazione di traceback()), forse rendendo il file di dati disponibili, o fornendo una ricetta per simulare i dati (m <- matrix(runif(1000), 40)?) in modo da riprodurre correttamente l'errore.

+0

Anzi, è probabilmente un problema di ricorsione come 1300 linee sono identiche. Ho rimosso questi dati non informativi dalla matrice e questo risolve davvero il problema. Grazie per la tua risposta. –

3

Questo problema ("errore di overflow dello stack di nodo" durante l'utilizzo della funzione heatmap.2) si verifica a causa di troppi valori identici in una colonna specifica nella matrice, che causa il problema di ricorsività su R che genera l'errore.

Quello che posso suggerire (che almeno come ho risolto il mio problema molto preciso per i miei dati) è quello di produrre numeri casuali intorno ai numeri identici e sostituirli con i numeri originali nella matrice:

for (i in 1:nrow(my_matrix)) { 
    if (my_matrix[i,my_column]=="100") { # assume i have too many 100 in my_column 
     my_matrix[i,my_column]=runif(1,99,101) # replace 100 with nearby values randomly 
    } 
} 

In questo modo, la heatmap viene creata senza alcun problema poiché non ci sono più troppi numeri identici, e inoltre non influisce virtualmente sulla tua matrice dato che puoi scegliere un intervallo molto piccolo per la generazione di numeri casuali attorno al tuo identico valore che sarà comunque riflettere i valori originali con cambiamenti di colore invisibili sulla mappa termica.

6

Sono l'autore del pacchetto gplots.L'errore "overflow dello stack di nodi" si verifica quando una funzione compilata da un byte ha troppe chiamate ricorsive.

In questo caso, si verifica perché la funzione che traccia gli oggetti dendrogramma (stats ::: plotNode) viene implementata utilizzando un algoritmo ricorsivo e l'oggetto dendrogramma è profondamente annidato.

In definitiva, la soluzione corretta è modificare plotnode utilizzare un algoritmo iterativo, che impedirà l'errore profondità di ricorsione dall'occuring.

A breve termine, è possibile forzare previsti ::: plotnode da eseguire come codice interpretato piuttosto che codice byte-compilato tramite un brutto hack.

Ecco la ricetta:

## Convert a byte-compiled function to an interpreted-code function 
unByteCode <- function(fun) 
    { 
     FUN <- eval(parse(text=deparse(fun))) 
     environment(FUN) <- environment(fun) 
     FUN 
    } 

## Replace function definition inside of a locked environment **HACK** 
assignEdgewise <- function(name, env, value) 
    { 
     unlockBinding(name, env=env) 
     assign(name, envir=env, value=value) 
     lockBinding(name, env=env) 
     invisible(value) 
    } 

## Replace byte-compiled function in a locked environment with an interpreted-code 
## function 
unByteCodeAssign <- function(fun) 
    { 
     name <- gsub('^.*::+','', deparse(substitute(fun))) 
     FUN <- unByteCode(fun) 
     retval <- assignEdgewise(name=name, 
           env=environment(FUN), 
           value=FUN 
           ) 
     invisible(retval) 
    } 

## Use the above functions to convert stats:::plotNode to interpreted-code: 
unByteCodeAssign(stats:::plotNode) 

## Now raise the interpreted code recursion limit (you may need to adjust this, 
## decreasing if it uses to much memory, increasing if you get a recursion depth error). 
options(expressions=5e4) 

## heatmap.2 should now work properly 
heatmap.2(...)