我正在尝试使用heatmap.2
包创建热图。我的数据中有很多NaN
值,我想要做的是以下内容。每次有NaN
值时,只需将单元格设置为浅灰色(或其他一些中性色,可能是白色),并将所有其他值(即log2表达式)设置为标准绿色/黄色/红色着色方案。这是我使用的代码:
heatmap.2(as.matrix(foo2[rowSums (abs(foo2)) != 0,]),
col = redgreen,
margins = c(12, 22),
trace = "none",
xlab = "Comparison",
lhei = c(2, 8),
scale = c("none"),
symbreaks = min(foo2 = 0, na.rm = TRUE),
na.color = "blue",
cexRow = 0.5,
cexCol = .7,
main = "DE geness",
Colv = F)
当没有NaN
值时这很有效,但当数据有NaN
时,我收到的错误是:
Error in hclustfun(distfun(x)) :
NA/NaN/Inf in foreign function call (arg 11)
基本上,我想让它忽略数据中的NaN
。我不知道如何处理这个问题。任何帮助将不胜感激。
答案 0 :(得分:11)
TL; DR:问题可能是由于委派了distfun
而不是heatmap2
函数本身。默认的dist
函数会尝试计算数据点之间的距离,如果距离计算返回NA,则群集功能无法处理。
版本较长:
我最近遇到了与OP相同的问题,并且不得不深入研究为什么问题不能为其他人重现。
基本问题如下:默认情况下,heatmap2将hclust
和hclustfun
以及dist
作为distfun
参数传递。错误消息明确指出hclustfun
(在这种情况下默认为hclust
)不喜欢NA
。
下一部分信息是这样的:即使数据矩阵包含NA
s,dist
的结果(传递到hclust
)也可能没有NA,是@ kdauria的回答。见下文:
> library(gplots)
> mat = matrix( rnorm(25), 5, 5)
> mat[c(1,6,8,11,15,20,22,24)] = NaN
>
> heatmap.2( mat,
+ col = colorpanel(100,"red","yellow","green"),
+ margins = c(12, 22),
+ trace = "none",
+ xlab = "Comparison",
+ lhei = c(2, 8),
+ scale = c("none"),
+ symbreaks = min(mat, na.rm=TRUE),
+ na.color="blue",
+ cexRow = 0.5, cexCol = 0.7,
+ main = "DE genes",
+ dendrogram = "row",
+ Colv = FALSE )
> ?dist
> mat
[,1] [,2] [,3] [,4] [,5]
[1,] NaN NaN NaN -1.10103187 -1.4396185
[2,] -0.8821449 1.4891180 0.41956063 -0.06442867 NaN
[3,] -2.5912928 NaN -0.56603029 -0.55177559 -2.0313602
[4,] 0.8348197 0.2199583 0.06318663 1.59697764 NaN
[5,] -0.2632078 -1.2193110 NaN NaN 0.8618543
> dist(mat)
1 2 3 4
2 2.317915
3 1.276559 2.623637
4 6.032933 3.050821 5.283828
5 5.146250 4.392798 5.871684 2.862324
随机值矩阵不能重现问题,因为它避免了手头的问题。这让我想到了一个问题:从dist
获取NAs需要什么?
我的数据有一些偏大的值,我认为是原因,但我只是通过添加一行NA来重现问题:
> mat = matrix(rnorm(49), 7, 7)
> mat[c(3,17,28, 41)] = mat[c(3,17,28, 41)] * 100000
> mat
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] -6.175928e-01 1.68691561 -1.233250e+00 -7.355322e-01 -0.37392178 3.559804e-01 1.7536137
[2,] 6.680429e-01 0.90590237 -1.375424e+00 5.842512e-01 -0.09376548 -3.556098e-01 -1.2926535
[3,] -3.739372e+04 -1.74534887 -2.241643e+05 -2.209226e-01 -0.86769435 -4.590908e-01 1.6306854
[4,] -1.283405e+00 0.20698245 3.635557e-01 3.673208e-01 -0.12339047 1.119922e+00 0.4301094
[5,] -5.430687e-02 -0.75219479 2.609126e+00 -1.340564e-01 0.54016622 2.885021e-01 0.9237946
[6,] -8.395116e-01 0.03675002 2.455545e+00 4.432025e-02 -0.86194910 1.302758e+05 0.6062505
[7,] 1.817036e-01 -1.46137388 -1.853179e+00 -2.177306e+03 2.36763806 -2.273134e+00 1.2440088
> dist(mat)
1 2 3 4 5 6
2 3.726858e+00
3 2.272605e+05 2.272606e+05
4 2.966078e+00 3.537475e+00 2.272620e+05
5 4.787577e+00 5.039154e+00 2.272644e+05 3.016614e+00
6 1.302754e+05 1.302762e+05 2.619559e+05 1.302747e+05 1.302755e+05
7 2.176576e+03 2.177895e+03 2.272705e+05 2.177679e+03 2.177179e+03 1.302963e+05
> mat = rbind(mat[1:4, ], rep(NA,7), mat[5:6, ])
> mat
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] -6.175928e-01 1.68691561 -1.233250e+00 -0.73553223 -0.37392178 3.559804e-01 1.7536137
[2,] 6.680429e-01 0.90590237 -1.375424e+00 0.58425125 -0.09376548 -3.556098e-01 -1.2926535
[3,] -3.739372e+04 -1.74534887 -2.241643e+05 -0.22092261 -0.86769435 -4.590908e-01 1.6306854
[4,] -1.283405e+00 0.20698245 3.635557e-01 0.36732078 -0.12339047 1.119922e+00 0.4301094
[5,] NA NA NA NA NA NA NA
[6,] -5.430687e-02 -0.75219479 2.609126e+00 -0.13405635 0.54016622 2.885021e-01 0.9237946
[7,] -8.395116e-01 0.03675002 2.455545e+00 0.04432025 -0.86194910 1.302758e+05 0.6062505
> dist(mat)
1 2 3 4 5 6
2 3.726858e+00
3 2.272605e+05 2.272606e+05
4 2.966078e+00 3.537475e+00 2.272620e+05
5 NA NA NA NA
6 4.787577e+00 5.039154e+00 2.272644e+05 3.016614e+00 NA
7 1.302754e+05 1.302762e+05 2.619559e+05 1.302747e+05 NA 1.302755e+05
> heatmap.2( mat,
+ col = colorpanel(100,"red","yellow","green"),
+ margins = c(12, 22),
+ trace = "none",
+ xlab = "Comparison",
+ lhei = c(2, 8),
+ scale = c("none"),
+ symbreaks = min(mat, na.rm=TRUE),
+ na.color="blue",
+ cexRow = 0.5, cexCol = 0.7,
+ main = "DE genes",
+ dendrogram = "row",
+ Colv = FALSE )
Error in hclustfun(distfun(x)) :
NA/NaN/Inf in foreign function call (arg 11)
然而,这种情况似乎并不特定于存在完全由NA组成的行的情况。例如:
> mat
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] NaN NaN NaN NaN NA -7.531027e-01 0.2238252
[2,] 3.210084e-01 -1.55702840 2.777516e-01 0.2176875 1.3310334 -9.621561e-01 NaN
[3,] 1.159837e+05 0.04480172 -1.649482e+04 NaN 2.4748122 8.446133e-01 -0.4240776
[4,] -8.584051e-01 NaN NaN 1.0557713 -1.0855826 -5.638023e-02 -0.3789979
[5,] NA NA -2.539003e-01 -0.4552776 0.3856384 NA NA
[6,] NaN 1.31986556 NaN -1.0393147 -1.9197183 -1.434064e+00 0.6334569
[7,] NaN -0.42180912 NaN -0.8023476 -0.8264077 4.471358e+04 0.5046408
> dist(mat)
1 2 3 4 5 6
2 5.531033e-01
3 3.225471e+00 1.386143e+05
4 1.723619e+00 3.913983e+00 1.534332e+05
5 NA 1.949799e+00 3.085851e+04 3.945524e+00
6 1.486699e+00 6.010961e+00 6.905415e+00 3.743585e+00 4.449179e+00
7 8.365286e+04 5.915178e+04 5.914939e+04 5.915058e+04 2.358664e+00 5.290752e+04
答案 1 :(得分:0)
所以我根本不是编码方面的专家,但我一直在学习在R上制作热图,并且我的NA数据保持相同的错误信息。事实证明我收到错误消息的原因是我的数据的第一列中有NA条款,而R根本不喜欢它。所以我添加了一个额外的列并填充了1并且它工作了! 我希望也许有人会觉得这很有用!
卡希纳
答案 2 :(得分:0)
除了posdef非常有启发性的答案之外,只是建议一个实用的解决方案:
由于distfun仅用于确定树形图的结构,因此您只需将dist矩阵中的NA替换为略高于非NA值的最大值即可。
为此,我们需要一个新的距离函数(一个包含正常dist函数并且只是替换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中使用此函数:
heatmap.2(mat, ..., dendrogram="row", Colv="NA", na.color="black", distfun=dist_no_na)
<强>属性强>
这当然不是一个完美的解决方案。它将数值距离值分配给矢量对,对于这些矢量对,没有可以计算(欧几里德?)距离的基础。但是,它确实有一些理想的属性。
heatmap.2功能有效: - )
例如,仅包含NA的行将首先从主分支中拆分(这很好地反映了手头的问题)。
我不完全确定它会替换由矩阵的其他属性引起的NA值。 posdef指出可能存在这样的NA值。在posdef的例子中,有两行,在同一列中没有一对非NA条目 - 即不可能确定欧氏距离。在这种情况下,可能仍然适合将其反映为比所有可以数值计算的距离更大的距离。
我不会选择比非NA最大值大得多的替换值。 (上面代码中选择的值大10%。)这会增加所有NA行的分离点到下面的分离点(树形图的相关部分)的距离,并可能使相关树形图的一部分很难看到。
答案 3 :(得分:0)
如果这似乎我已经过简化了,我深表歉意,但是我知道我会喜欢这样的简化文章(因为我不是R方面的专家)。到目前为止,我发现这是最简单的方法,我将在数据中显示它;
我的数据在具有很多NA值的数据矩阵中的范围从0到114,所以我要做的是首先将所有NA值替换为-1(在我的数据集范围之内)
headerLeft
然后我使用heatmap.2()设置休息时间。如果您希望将NA值设为“黑色”,而其余值使用带有多种颜色的调色板,则可以使用seq()设置间隔。由于我的数据范围是0到114,因此我将seq设置为从0到114,以1为增量。然后使用heatmap.2()将中断设置为-1,然后将序列设置为(所以中断看起来像( -1,0,1,2,3..etc)。我将-1值(NA)的颜色设置为“黑色”,并使用蓝色调色板中的114种颜色作为其余值。
x <- mymatrix %>% replace(is.na(.), -1)
我希望这会有所帮助!
答案 4 :(得分:-1)
我无法重现这个问题。下面的代码工作得很好。所有NaN值都是蓝色的。
library(gplots)
mat = matrix( rnorm(25), 5, 5)
mat[c(1,6,8,11,15,20,22,24)] = NaN
heatmap.2( mat,
col = colorpanel(100,"red","yellow","green"),
margins = c(12, 22),
trace = "none",
xlab = "Comparison",
lhei = c(2, 8),
scale = c("none"),
symbreaks = min(mat, na.rm=TRUE),
na.color="blue",
cexRow = 0.5, cexCol = 0.7,
main = "DE genes",
dendrogram = "row",
Colv = FALSE )