美文网首页R语言技巧生物信息学与算法数据科学与R语言
heatmap由于有太多NA无法聚类原因和解决方法

heatmap由于有太多NA无法聚类原因和解决方法

作者: 生信编程日常 | 来源:发表于2020-01-15 11:17 被阅读0次

    有的时候数据中有NA,可以聚类出来,但是有的时候就会报一个这样的错误:
    “Error in hclustfun(distfun(x)) : NA/NaN/Inf in foreign function call (arg 11)”

    为什么会有这个错误,要从heatmap函数调用的计算距离的方法dist()和聚类方法hclust()说起。

    首先创建一个存在NA的数据集,并作出heatmap:

    library(gplots)
    library()
    mat = matrix( rnorm(25), 5, 5)
    mat[c(1,6,8,11,15,20,22,24)] = NaN
    Colors=rev(brewer.pal(11,"Spectral"))
    heatmap.2( mat, col = Colors,
               trace = "none", 
               xlab = "Comparison",
               scale = c("none"),
               na.color="gray", 
               dendrogram = "row", 
               Colv = FALSE )
    

    可以做出来热图,其中灰色部分为NA:


    heatmap with NAs

    这个数据集是这样的:


    data

    heatmap.2默认调用dist()函数计算距离(其他热图包基本默认也都是这个函数):


    dist

    这个数据集存在NA,但是仍然可以做出来热图,原因就是因为dist()计算的距离中不存在NA,hclust()就仍然可以聚类。

    如果我们有一个文件,里面存在很多NA,比如构建如下一个数据:

    mat = matrix(rnorm(49), 7, 7)
    mat = rbind(mat[1:4, ], c(rep(NA,6), 1.2416), mat[5:6, ])
    mat[1:2,3:7] <- rep(NA, 10)
    
    data2

    计算dist():

    dist(mat)
    

    返回:


    dist2

    这时候去做heatmap,报错,hclust不能聚类:
    Error in hclustfun(distr) : 外接函数调用时不能有NA/NaN/Inf(arg11)

    这个的可以通过修改distfun参数来解决,从默认的hclust改成我们自己定义的距离,把计算出来NA的距离换掉,比如可以这样:

    dist_no_na <- function(mat) {
        edist <- dist(mat)
        edist[which(is.na(edist))] <- max(edist, na.rm=TRUE) * 1.1 
        return(edist)
    }
    heatmap.2( mat, col = Colors,
               trace = "none", 
               xlab = "Comparison",
               scale = c("none"),
               na.color="gray",
               dendrogram = "row", 
               Colv = FALSE,
               distfun=dist_no_na)
    
    heatmap with changed NAs

    注意有的有的热图函数是不能调整聚类方法的。

    相关文章

      网友评论

        本文标题:heatmap由于有太多NA无法聚类原因和解决方法

        本文链接:https://www.haomeiwen.com/subject/vtftzctx.html