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

uma*_*ani 5 r hierarchical-clustering

目标

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

我知道的:

我已经看到使用欧几里得距离等创建距离矩阵的例子,通过dist()在 R 中使用函数。我还看到相关性用于创建变量(列)之间的不相似性(或相似性度量)。

我想做的事?

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

cha*_*ers 6

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

基本上,您想通过使用某种距离和相关性的方法来确定两个变量是否相似。这可以使用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)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

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

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

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

在此处输入图片说明

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

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


如果你想在 Rows 上做信息,只需使用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)
Run Code Online (Sandbox Code Playgroud)