问题描述
我正在尝试制作与许多 NA 不同的矩阵的热图。但是,我在尝试执行聚类时遇到了问题。如果没有聚类,热图工作正常。我不想归咎/删除 NA。反正有没有执行聚类? 我知道 NA 计算距离是一个问题,但应该有办法解决它,对吗?
我收到以下错误消息:
" hclust(get_dist(submat,distance),method = method) 中的错误: 外部函数调用中的 NA/NaN/Inf (arg 10)
另外:警告信息: NA 存在于矩阵中,通过移除 NA 值来计算距离。"
编辑:
我使用的数据是一个不寻常的矩阵,有很多 NA。也许这就是问题所在?但我也想在热图中可视化这些 NA。所以只对行进行聚类,而不对列进行聚类。
解决方法
我不确定您为什么会收到该错误。 dist
函数应默认处理 NA。下面是一个例子。此外,您可能只想先计算距离矩阵,然后再输入 hclust
。 vegan
包可以计算许多距离度量,您可以指定是否应删除 NA:
# data
set.seed(1)
x <- matrix(rnorm(100),nrow = 5)
df <- matrix(rnorm(100),nrow = 5)
# make missing values
nvals <- length(c(df))
set.seed(1)
df[sample(x = nvals,size = nvals*0.1)] <- NaN
# distance "euclidean"
hc <- hclust(dist(df),method = "ave")
plot(hc)
# other distance metrics
D <- vegdist(df,method = "manhattan",na.rm = TRUE)
hc <- hclust(D,method = "ave")
plot(hc)
,
好的,我设法解决了这个问题。我不得不做简单的插补。 我只是用“常量”替换了所有 NA。
然后我可以在不删除任何样本或行的情况下可视化整个数据集,对行和列进行聚类。然后,当我想绘制 NA 在数据集中的位置时,我只需要在任何图中给“常量”一个特定的颜色。
通过这种方式,我将所有 NA 视为相同,而不会根据其他样本(例如均值/中值/回归方法)为每一行/列中的 NA 分配一个值。这种方法最适合我的数据集,而不会向任何方向倾斜。