2013-05-15 6 views
5

Ive wechselte zu einem neuen Server und Installed R Version 3.0 darauf. (gplots Bibliothek war nicht mehr verfügbar für 2.14)Fehler in heatmap.2 (gplots)

Mit einem Skript, das für Version 2.14 funktionierte, stoße ich jetzt auf ein Problem beim Erzeugen einer Heatmap.

In R-Version 3 Ich erhalte eine Fehlermeldung:

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-Version 2.14 Ich erhalte eine Fehlermeldung:

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

Was ich durch die Erhöhung der Optionen lösen kann (Ausdrücke = 500000)

In R Version 3 löst das Erhöhen dieser Option das Problem nicht. Und ich bin immer noch mit dem gleichen Fehler fest.

Das Skript ist für beide gleich:

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() 

Wo „test“ ist eine TDL-Datei mit Kopf- und Zeilennamen und eine 40 * 5000 0/1 Matrix

Jede Hilfe würde geschätzt

PS: Wenn ich meinen Datensatz auf 2000 Zeilen reduzieren, erhalte ich den Fehler nicht mehr.

PSS: Erhöhung des Datensatzes auf 2500 Zeilen führte zum gleichen Fehler; Das Entfernen aller nicht informativen Zeilen (alle 1) hat mich jedoch mit 3700 Zeilen belassen. Die Verwendung dieses Datensatzes führte nicht zum Fehler.

Antwort

4

In another post ist dies von stats:::midcache.dendrogram die Funktion setmid. setmid nennt sich rekursiv, und diese Rekursion könnte zu tief sein - wahrscheinlich ist das Dendrogramm zu dicht, um visuell Sinn zu machen? Sie sehen, wo der Fehler auftritt, indem Sie nach dem Auftreten des Fehlers die letzten Zeilen von traceback() betrachten.

Um weitere Fortschritte mit diesem zu machen, müssen Sie in der Lage sein, ein minimal reproducible example zu liefern (heatmap statt heatmap.2, oder sogar auf Ihre Interpretation von Traceback() verfeinert mehr basiert), vielleicht durch die Datendatei zur Verfügung stellt, oder durch ein Rezept zur Simulation der Daten (m <- matrix(runif(1000), 40)?) in einer Weise, die den Fehler zuverlässig reproduziert.

+0

der Tat ist es wahrscheinlich eine Rekursion Ausgabe als 1300 Zeilen identisch sind. Ich habe diese nicht informativen Daten aus der Matrix entfernt und damit das Problem gelöst. Danke für deine Antwort. –

3

Dieses Problem ("Knoten-Stack-Überlauf" -Fehler bei der Verwendung der heatmap.2-Funktion) tritt aufgrund zu vieler identischer Werte in einer bestimmten Spalte in Ihrer Matrix auf, was zu Rekursionsproblemen bei R führt, die den Fehler erzeugen.

Was kann ich vorschlagen (was zumindest, wie ich mein sehr genaues Problem für meine Daten gelöst) Zufallszahl um die identischen Zahlen zu erzeugen, und ersetzen Sie sie mit den ursprünglichen Zahlen in der Matrix:

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 
    } 
} 

Auf diese Weise wird die Heatmap ohne Probleme erstellt, da es nicht mehr viele identische Nummern gibt, und sie hat praktisch keinen Einfluss auf Ihre Matrix, da Sie ein sehr kleines Intervall für die Zufallsgenerierung um Ihren identischen Wert herum wählen können spiegeln die ursprünglichen Werte mit unsichtbaren Farbänderungen auf der Heatmap wieder.

6

Ich bin der Autor des Pakets gplots.Der Fehler "Knoten-Stack-Überlauf" tritt auf, wenn eine Byte-kompilierte Funktion zu viele rekursive Aufrufe aufweist.

In diesem Fall tritt es auf, weil die Funktion, die Dendrogrammobjekte (stats ::: plotNode) plottet, mithilfe eines rekursiven Algorithmus implementiert wird und das Dendrogrammobjekt tief verschachtelt ist.

Letztlich ist die richtige Lösung, PlotNode zu ändern, um einen iterativen Algorithmus zu verwenden, der verhindert, dass der Rekursionstiefenfehler auftritt.

Kurzfristig ist es möglich zu erzwingen, dass stats ::: plotNode als interpretierter Code statt als Byte-kompilierter Code über einen fiesen Hack ausgeführt wird.

Hier ist das Rezept:

## 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(...)