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)
几个月来,我一直在使用相同的 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)