繁体   English   中英

热图中的错误.2(gplots)

[英]Error in heatmap.2 (gplots)

我已经转移到一个新的服务器和安装R版本3.0上。 (gplots库不再适用于2.14)

使用适用于版本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()

其中“test”是带有标题和行名称以及40 * 5000 0/1矩阵的tdl文件

任何帮助,将不胜感激

PS:当我将数据集减少到2000行时,我不再收到错误。

PSS:将数据集增加到2500行会导致相同的错误; 然而,删除所有非信息线(全1)给我留下了3700行。 使用此数据集不会导致错误。

我是gplots包的作者。 当字节编译函数具有太多递归调用时,会发生“节点堆栈溢出”错误。

在这种情况下,它的出现是因为绘制树状图对象(stats ::: plotNode)的函数是使用递归算法实现的,而树形图对象是深度嵌套的。

最终,正确的解决方案是修改plotNode以使用迭代算法,这将防止发生递归深度错误。

在短期内,可以强制stats ::: plotNode作为解释代码运行,而不是通过讨厌的hack运行字节编译代码。

这是食谱:

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

另一篇文章中,这是来自stats:::midcache.dendrogram的函数setmid setmid递归setmid调用自身,并且这种递归可能太深 - 可能树形图太密集而无法在视觉上产生任何意义? 通过查看错误发生后的最后几行traceback() ,可以看到错误发生的位置。

为了在这方面取得进一步进展,您需要能够提供一个可重复性最小的示例 (使用heatmap而不是heatmap heatmap.2 ,或者甚至根据您对traceback()的解释进行更精细化,可能是通过使数据文件可用,或者通过提供模拟数据的方法( m <- matrix(runif(1000), 40) ?),以可靠的方式再现错误。

由于矩阵中特定列中的相同值太多而导致此问题(使用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
    }
}

通过这种方式,创建热图没有任何问题,因为不再有太多相同的数字,而且它实际上不会影响您的矩阵,因为您可以选择一个非常小的间隔来生成围绕您的相同值的随机数生成在热图上以不可见的颜色变化反映原始值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM