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

2020-04-01 15:55:01 浏览数 (2)

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

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

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

代码语言:javascript复制
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,比如构建如下一个数据:

代码语言:javascript复制
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():

代码语言:javascript复制
dist(mat)

返回:

dist2

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

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

代码语言:javascript复制
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

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

0 人点赞