有的时候数据中有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
注意有的有的热图函数是不能调整聚类方法的。