有的時候數據中有NA,可以聚類出來媒抠,但是有的時候就會報一個這樣的錯誤:
“Error in hclustfun(distfun(x)) : NA/NaN/Inf in foreign function call (arg 11)”
為什么會有這個錯誤戒劫,要從heatmap函數調用的計算距離的方法dist()和聚類方法hclust()說起伊脓。
首先創(chuàng)建一個存在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.2默認調用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)
計算dist():
dist(mat)
返回:
這時候去做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)
注意有的有的熱圖函數是不能調整聚類方法的名段。