Pheatmap 不会聚集行:NA/NaN/Inf in foreign function call (arg 10)

Pheatmap won’t cluster rows: NA/NaN/Inf in foreign function call (arg 10)

几个月来,我一直在使用相同的 pheatmap 代码变体来制作热图,没有任何问题,但最近它不再能够对行进行聚类。列仍然像正常一样聚集,但每当我尝试添加行聚集时,它都会给我关于数据 NA/NaN/Inf 中的相同错误消息

我的所有数据集看起来都非常相似,主要只是行数发生变化(在 40-2000+ 之间)。这是我目前正在使用的数据头,所有 0 都已替换为 NA:

> head(protdata, 4)
          PR1      PO1      WA1     PR2      PO2      WA2      PR3      PO3     WA3      PR4 PO4     WA4      PR5      PO5
[1,] 0.004420       NA 0.002370 0.00141 0.002890 0.003740 4.36e-03 0.005370 0.00143 0.002070  NA 0.00428 0.005220       NA
[2,] 0.000233 8.85e-06 0.000136      NA 0.000056 0.000713 5.98e-05       NA      NA 0.000541  NA      NA 0.006700 4.95e-05
[3,] 0.001220 1.79e-05 0.000447 0.00183 0.000136       NA 6.99e-04 0.000298 0.00267 0.001330  NA      NA 0.000655 1.36e-04
[4,] 0.001170 6.84e-04 0.000282 0.00173 0.001620 0.000648 1.05e-03 0.003570 0.00101 0.001410  NA      NA 0.002960       NA
          WA5     PR6      PO6      WA6      PR7      PO7      WA7
[1,] 0.001030 0.00448       NA 1.53e-03 0.005220 0.005520 1.86e-03
[2,] 0.000139 0.00145 0.000484 8.88e-05 0.000118 0.000122 1.79e-05
[3,] 0.003680 0.00033       NA       NA       NA 0.000163 3.99e-03
[4,] 0.000393 0.00023       NA       NA 0.000625       NA 7.15e-04

数据集中有很多0,但只要转换成NA,聚类就一直有效。 None 列或行的方差为零。这是我用来制作热图的代码:

protdata <- as.matrix(input[,-1])
protdata[protdata == 0] <- NA

rownames <- input[,1]
annotation_row <- data.frame(rownames)
rownames(protdata) <- annotation_row$Gene

pheatmap(log10(protdata), scale="row", border_color=NA, na_col="white", breaks=seq(-2,2,.01),
     color=colorRampPalette(rev(brewer.pal(n=7, name="RdYlBu")))(400))

这是我不断收到的错误消息:

Error in hclust(d, method = method) : 
  NA/NaN/Inf in foreign function call (arg 10)

让情节出现的唯一方法是在上面包含 cluster_rows=FALSE。我很困惑为什么这能完美地工作而现在却不能,据我所知,我输入数据的方式没有任何改变。

任何帮助将不胜感激!!

我将您的文件转换为 csv 并读入:

mat = read.csv("peet_protdata.csv",row.names=1)
mat[mat==0] = NA

没有像您所说的所有 NA 或零方差的行,但是如果您进行 dist 计算,某些条目中有 NA,表明某些行之间无法计算欧氏距离。您需要欧几里得距离矩阵没有 NA 来进行聚类:

 sum(is.na(as.matrix(dist(mat))))
[1] 434

下面是一个快速(讨厌的)位,用于查找给出最多 NA 的行,删除它们以获得完整的距离矩阵:

giveNAs = which(is.na(as.matrix(dist(mat))),arr.ind=TRUE)
head(giveNAs)
    row col
G103  18   1
G100  53   1

因此,例如,第 18 行和第 1 行给您带来了问题,您可以看到没有完整的观察结果(成对):

mat[c(1,18),]
     PR1 PO1 WA1         PR2 PO2 WA2         PR3 PO3 WA3         PR4
G56   NA  NA  NA 0.000483209  NA  NA 0.000433088  NA  NA 0.000203604
G103  NA  NA  NA          NA  NA  NA          NA  NA  NA          NA
             PO4         WA4         PR5        PO5 WA5 PR6 PO6 WA6 PR7
G56  0.000294898 0.000269724 0.000299341 0.00046987  NA  NA  NA  NA  NA
G103          NA          NA          NA         NA  NA  NA  NA  NA  NA
             PO7         WA7         PR8 PO8 WA8         PR9         PO9 WA9
G56  0.000682594 0.000656168 0.000702988  NA  NA          NA          NA  NA
G103          NA          NA          NA  NA  NA 0.000629987 0.000504159  NA

我们取出行并开始检查要删除的内容:

tab = sort(table(c(giveNAs)),decreasing=TRUE)
checkNA = sapply(1:length(tab),function(i){
sum(is.na(as.matrix(dist(mat[-as.numeric(names(tab[1:i])),]))))
})
rmv = names(tab)[1:min(which(checkNA==0))]

 [1] "18"  "53"  "81"  "84"  "54"  "97"  "55"  "38"  "70"  "100" "31"  "93" 
[13] "52"  "80"  "91"

我们删除了那 15 行:

mat = mat[-as.numeric(rmv),]
pheatmap(mat)

您需要在调用 pheatmap 之前删除您的 NA(通过在此处更改为零)

mat[is.na(mat)] = 0

pheatmap(mat)