Pheatmap赢得’;t集群行:外部函数调用中的NA/NaN/Inf(arg 10)

Pheatmap赢得’;t集群行:外部函数调用中的NA/NaN/Inf(arg 10),r,na,hclust,pheatmap,R,Na,Hclust,Pheatmap,几个月来,我一直在使用pheatmap代码的相同变体来制作热图,没有任何问题,但最近它已经停止了对行进行集群。列仍然像普通的一样聚集,但每当我尝试添加行聚集时,它都会在数据中给出关于NA/NaN/Inf的相同错误消息 我所有的数据集看起来都非常相似,主要是行数在变化(40-2000+之间)。下面是我当前使用的数据头,所有0都已替换为NA: > head(protdata, 4) PR1 PO1 WA1 PR2 PO2 WA

几个月来,我一直在使用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))
我能得到一个显示的绘图的唯一方法是上面包含的
cluster\u rows=FALSE
。就我所知,我在输入数据的方式上没有任何改变,但我很困惑,为什么这样做可以完美地工作,而现在不行


任何帮助都将不胜感激

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

mat = read.csv("peet_protdata.csv",row.names=1)
mat[mat==0] = NA
没有像您所说的所有NAs或零方差的行,但是如果您进行dist计算,则某些条目中存在NAs,这表明在某些行之间,不可能计算欧几里德距离。您需要使用欧几里德距离矩阵,以便无需NAs进行群集:

 sum(is.na(as.matrix(dist(mat))))
[1] 434
下面是一个快速(令人讨厌的)查找NAs最多的行的方法,删除它们以获得完整的距离矩阵:

giveNAs = which(is.na(as.matrix(dist(mat))),arr.ind=TRUE)
head(giveNAs)
    row col
G103  18   1
G100  53   1
例如,第18行和第1行给出了问题,您可以看到没有完整的观察结果(成对):

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

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之前,您需要删除NAs(在此处更改为零)


它不会在两行之间工作一次,没有像这张pheatmap(矩阵(c(NA,1,NA,2,3,NA),ncol=3))这样的完整观测,我不明白?我在其他几个充满NAs的数据集中使用过这段代码,并且从未遇到过丢失数据的问题。我所有的行都有>2个z分数的样本,并且没有一个是零差异的。您是否检查了我提供的示例?你可以看到,计算距离是不可能的。检查>2个样品等不能保证this@StupidWolf是的,但是在这个例子中,没有足够数量的值来计算距离,而在我的例子中,不应该有足够数量的值吗?太棒了,我只是在我的其他几个数据集上尝试了这个方法,这些数据集也不起作用,现在都起作用了!感谢您抽出时间来帮助我们!酷。没问题。。是的,对不起,用语言解释这个问题有点困难。很高兴您能够克服绘图的挫折:)这不适用于所有的零,也不反映数据(零实际上不是零,只是太低而无法检测),这就是为什么我必须首先将它们转换为NAs的原因。
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"
mat = mat[-as.numeric(rmv),]
pheatmap(mat)
mat[is.na(mat)] = 0

pheatmap(mat)