2013-05-15 2 views
5

Ive перешел на новый сервер и установил R версии 3.0 на нем. (gplots library больше не предлагается для версии 2.14)Ошибка в heatmap.2 (gplots)

Использование сценария, который работал для версии 2.14, теперь я столкнулся с проблемой создания тепловой карты.

В R 3 версии я получаю сообщение об ошибке:

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

В R версии 2.14 я получаю сообщение об ошибке:

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

Что я могу решить за счет увеличения опциями (выражения = +500000)

В R версии 3 увеличение этой опции не позволяет устранить проблему. И я все еще придерживался той же ошибки.

Сценарий одинаков для обоих:

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

Где «тест» является TDL файл с заголовками и названиями строк и 40 * 5000 0/1 матрица

Любая помощь будет оценена

PS: Когда я уменьшаю свои данные до 2000 строк, я больше не получаю ошибку.

PSS: увеличение набора данных до 2500 строк привело к той же ошибке; Однако удаление всех неинформативных строк (всего 1 с) оставило мне 3700 строк. Использование этого набора данных не привело к ошибке.

ответ

4

В another post это от stats:::midcache.dendrogram 's функция setmid. setmid называет себя рекурсивно, и эта рекурсия может быть слишком глубокой - возможно, дендрограмма слишком плотная, чтобы визуально визуализировать? Вы видите, где происходит ошибка, если посмотреть на последние несколько строк traceback() после возникновения ошибки.

Чтобы добиться дальнейшего прогресса с этим, вы должны быть в состоянии обеспечить minimal reproducible example (с использованием heatmap, а не heatmap.2, или даже более рафинированное на основе вашей интерпретации TRACEBACK()), возможно, путем создания файла данных доступны, или путем предоставления рецепта для имитации данных (m <- matrix(runif(1000), 40)?) таким образом, чтобы достоверно воспроизводить ошибку.

+0

В самом деле, это, вероятно, вопрос рекурсии в 1300 линии идентичны. Я удалил эти неинформативные данные из матрицы, и это действительно устраняет проблему. Спасибо за Ваш ответ. –

3

Эта проблема (ошибка переполнения стека узла при использовании функции heatmap.2) возникает из-за слишком большого количества идентичных значений в определенном столбце в вашей матрице, что вызывает проблему рекурсии на R, вызывающую ошибку.

Что я могу предложить (что, по крайней мере, как я решить мою очень точную проблему для моих данных), чтобы произвести случайные числа вокруг одинаковых чисел и заменить их с оригинальными номерами в матрице:

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

Таким образом, тепловая карта создается без каких-либо проблем, так как больше нет одинаковых чисел, а также она практически не влияет на вашу матрицу, так как вы можете выбрать очень маленький интервал для генерации случайных чисел вокруг вашего одинакового значения, которое будет по-прежнему отражают исходные значения с невидимыми изменениями цвета на тепловой карте.

6

Я являюсь автором пакета gplots.Ошибка «переполнение стека узла» возникает, когда функция с байтом скомпилирована слишком много рекурсивных вызовов.

В этом случае это происходит потому, что функция, которая отображает объекты дендрограммы (stats ::: plotNode), реализуется с использованием рекурсивного алгоритма, а объект dendrogram глубоко вложен.

В конечном счете, правильным решением является изменение plotNode для использования итеративного алгоритма, который предотвратит возникновение ошибки глубины рекурсии.

В краткосрочной перспективе можно заставить статистику ::: plotNode запускать как интерпретируемый код, а не байт-скомпилированный код через неприятный взломать.

Вот рецепт:

## 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(...) 
Смежные вопросы