如何使用相关性而不是 R 中的欧氏距离创建用于聚类的距离矩阵?

How to create a distance matrix for clustering using correlation instead of euclidean distance in R?

目标

我想对我的数据集中的样本(行)进行层次聚类。

我知道的:

我见过使用欧几里得距离等创建距离矩阵的示例,方法是在 R 中使用 dist() 函数。我还看到相关性用于创建变量(列)之间的差异(或相似性度量) .

我想做什么?

我想使用相关性为数据中的行创建一个距离矩阵。因此,我想使用每一行之间的相关性,而不是 dist() 中的欧氏距离。但是可用的 methods 不包括相关性。有什么办法可以做到吗?这可能不是一种常见做法,但我认为它适合我的应用程序。

我认为您对什么是 distance metric 有点困惑。距离度量不能为负,但我们知道相关性绝对可以为负。不过我会尽量回答你问题的要点。

基本上你想通过一些距离和相关性的方法来找出两个变量是否相似。这可以使用 corrplot 库轻松可视化。因此,以 mlbench 库中的数据集为例,我们可以将其可视化如下:

library(mlbench)
library(corrplot)
data(PimaIndiansDiabetes)
plot1 <- corrplot(cor(PimaIndiansDiabetes[,!(names(PimaIndiansDiabetes) %in% c("diabetes"))]), 
                  method="square",
                  order="hclust", tl.cex=0.7, cl.cex=0.5, tl.col="black", addrect=2)

在这里我们可以使用 hclust 突出显示两组相似的变量,使用相关性作为相似性的度量。

如果您想使用基础库查看树状图的外观,也可以轻松实现:

cor.info <- cor(PimaIndiansDiabetes[,!(names(PimaIndiansDiabetes) %in% c("diabetes"))])
sim.by.hclust <- hclust(dist(cor.info))
plot(sim.by.hclust)

在这里我们可以直接使用相关矩阵看到变量是如何分组在一起的。请注意,在此示例中,相关性是 而不是 距离度量!

希望这能回答您的问题...


如果你想做行的信息,只需使用t(),所以使用上面相同的信息我们有:

data(PimaIndiansDiabetes)
tdat <- t(PimaIndiansDiabetes[,!(names(PimaIndiansDiabetes) %in% c("diabetes"))])
cor.tdat <- cor(tdat)
sim.by.hclust <- hclust(dist(cor.tdat))
plot(sim.by.hclust)