在没有插补的情况下对热图的具有 NA 值的不同矩阵进行聚类

Clustering of dissimilar matrix with NA values for heatmap without imputation

我正在尝试制作一个包含大量 NA 的不同矩阵的热图。但是,我 运行 在尝试执行集群时遇到了问题。如果不聚类,热图就可以正常工作。我不想impute/remove NAs。无论如何执行聚类? 我知道 NA 计算距离是个问题,但应该有办法解决它,对吗?

我收到以下错误消息:

" hclust(get_dist(submat, distance), method = method) 错误: NA/NaN/Inf 在外部函数调用中 (arg 10)

另外:警告信息: 矩阵中存在NA,通过去掉NA值计算距离。"

编辑:

我使用的数据是一个不寻常的矩阵,有很多 NA。也许这就是问题所在?但我也想在热图中可视化这些 NA。所以只聚类行而不是列。

dissimilar matrix example

我不确定您为什么会收到该错误。 dist 函数应该默认处理 NA。下面是一个例子。此外,您可能想先简单地计算您的距离矩阵,然后输入 hclustvegan 包可以计算许多距离度量,您可以指定是否应删除 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 都一视同仁,而无需在每个 row/column 中根据其他样本(例如 mean/median/regression 方法)为每个 NA 分配一个值。这种方法最适合我的数据集,不会向任何方向倾斜。