簡體   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