【问题标题】:Pheatmap won’t cluster rows: NA/NaN/Inf in foreign function call (arg 10)Pheatmap 不会聚集行:外部函数调用中的 NA/NaN/Inf (arg 10)
【发布时间】:2020-08-11 14:48:53
【问题描述】:

几个月来,我一直在使用相同的 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,聚类就一直有效。没有任何列或行是零方差。这是我用来制作热图的代码:

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。我很困惑为什么它工作得很好,而现在却不行,据我所知,我输入数据的方式并没有改变任何东西。

任何帮助将不胜感激!

【问题讨论】:

  • 两行之间一次不行,没有完整的观察结果
  • 喜欢这个 pheatmap(matrix(c(NA,1,NA,2,3,NA),ncol=3))
  • @StupidWolf 我不明白?我已经将这个确切的代码与其他几个填充了 NA 的数据集一起使用,并且从未遇到过丢失数据的问题。我所有的行都有 >2 个 z 分数的样本,并且没有一个是零方差
  • 你检查过我提供的例子吗?你可以看到计算距离是不可能的。检查 > 2 个样本等并不能保证这一点
  • @StupidWolf 是的,但是在示例中没有足够数量的值来计算距离,而在我的中不应该有很多吗?

标签: r na hclust pheatmap


【解决方案1】:

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

mat[is.na(mat)] = 0

pheatmap(mat)

【讨论】:

  • 这不适用于所有零并且不反映数据(零实际上不是零,只是太低而无法检测),这就是为什么我必须将它们转换为 NA第一名。
【解决方案2】:

我将您的文件转换为 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)

【讨论】:

  • 太棒了,我刚刚在我的其他几个数据集上尝试了这个,这些数据集也没有工作,现在它们都工作了!感谢您抽出宝贵时间提供帮助!
  • 酷。没问题..是的,抱歉,用语言解释这个问题有点困难。很高兴你能克服绘图的挫败感:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-05
  • 2016-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-27
  • 1970-01-01
相关资源
最近更新 更多