根据变量之间的相关性对变量进行聚类


23

问题:

  1. 我有一个很大的相关矩阵。除了将各个相关性聚类之外,我还想根据变量之间的相关性对变量进行聚类,即,如果变量A和变量B与变量C到Z具有相似的相关性,则A和B应该属于同一聚类。一个很好的现实例子是不同的资产类别-资产类别内的关联高于资产间类别的关联。

  2. 我也在考虑变量之间的跨度关系聚类,例如,当变量A和B之间的相关性接近于0时,它们或多或少地独立发挥作用。如果突然一些基本条件发生变化,并且出现了很强的相关性(正或负),我们可以认为这两个变量属于同一集群。因此,与其寻找正相关,不如寻找关系而不是关系。我猜比喻可能是带正电和带负电的粒子簇。如果电荷降为0,则粒子将从簇中漂移。但是,正电荷和负电荷都将粒子吸引到相关的簇中。

如果其中一些内容不太清楚,我深表歉意。请让我知道,我将澄清具体细节。


1
因子分析将不会对qn 1起作用吗?问题2有点含糊。“关系”似乎是“相关”的同义词,或者至少一种形式的关系是线性关系,而相关性捕获了这种关系。也许,您需要澄清

您已经陈述了您想做什么。你的问题是什么?是关于实施还是您的分析方法是否合适?或者是其他东西?
Jeromy Anglim

Answers:


14

这是使用bfi数据集的R中的一个简单示例:bfi是围绕5个因素组织的25个性格测试项目的数据集。

library(psych)
data(bfi)
x <- bfi 

可以使用基于变量之间绝对相关性的变量之间的欧式距离来进行等级聚类分析,如下所示:

plot(hclust(dist(abs(cor(na.omit(x))))))

替代文字 树状图显示了根据理论上的分组,物品通常如何与其他物品聚类(例如,N(神经病)物品组合在一起)。它还显示了集群中的某些项目如何更相似(例如,C5和C1可能比带有C3的C5更相似)。这也表明N群集与其他群集不太相似。

或者,您可以执行标准因子分析,如下所示:

factanal(na.omit(x), 5, rotation = "Promax")


Uniquenesses:
   A1    A2    A3    A4    A5    C1    C2    C3    C4    C5    E1    E2    E3    E4    E5    N1 
0.848 0.630 0.642 0.829 0.442 0.566 0.635 0.572 0.504 0.603 0.541 0.457 0.541 0.420 0.549 0.272 
   N2    N3    N4    N5    O1    O2    O3    O4    O5 
0.321 0.526 0.514 0.675 0.625 0.804 0.544 0.630 0.814 

Loadings:
   Factor1 Factor2 Factor3 Factor4 Factor5
A1  0.242  -0.154          -0.253  -0.164 
A2                          0.570         
A3         -0.100           0.522   0.114 
A4                  0.137   0.351  -0.158 
A5         -0.145           0.691         
C1                  0.630           0.184 
C2  0.131   0.120   0.603                 
C3  0.154           0.638                 
C4  0.167          -0.656                 
C5  0.149          -0.571           0.125 
E1          0.618   0.125  -0.210  -0.120 
E2          0.665          -0.204         
E3         -0.404           0.332   0.289 
E4         -0.506           0.555  -0.155 
E5  0.175  -0.525   0.234           0.228 
N1  0.879  -0.150                         
N2  0.875  -0.152                         
N3  0.658                                 
N4  0.406   0.342  -0.148           0.196 
N5  0.471   0.253           0.140  -0.101 
O1         -0.108                   0.595 
O2 -0.145   0.421   0.125   0.199         
O3         -0.204                   0.605 
O4          0.244                   0.548 
O5  0.139                   0.177  -0.441 

               Factor1 Factor2 Factor3 Factor4 Factor5
SS loadings      2.610   2.138   2.075   1.899   1.570
Proportion Var   0.104   0.086   0.083   0.076   0.063
Cumulative Var   0.104   0.190   0.273   0.349   0.412

Test of the hypothesis that 5 factors are sufficient.
The chi square statistic is 767.57 on 185 degrees of freedom.
The p-value is 5.93e-72 

1
嗨Jeromy。问:取abs(cor(...))的距离是什么意思?cor矩阵不是一个更大的数字表示更多关系的矩阵,而在距离矩阵中,相反的矩阵成立吗?(我怀疑我缺少了什么,您能解释一下吗?)
Tal Galili 2010年

@Tal我的理解是dist函数采用传递给它的矩阵的欧几里得距离,在这种情况下,这是一个绝对相关矩阵。也许,从相关矩阵进行更直接的转换将是as.dist()函数,该函数采用现有的距离矩阵:例如as.dist(1-abs(cor(na.omit(x))))。看到?dist
Jeromy Anglim

1
使用1-abs(cor ...)对我来说更有意义:)
Tal Galili 2010年

@Tal是的。我同意。我看了一下。在这种情况下,距离向量(abs cor的欧几里得与1-abs cor的欧几里得)的相关系数约为0.96,因此差异不大。
Jeromy Anglim

1
@Tal dist选项:每个变量都有一个绝对相关的向量。具有相似向量的变量的欧氏距离较小:en.wikipedia.org/wiki/Euclidean_distance
Jeromy Anglim

2

在聚类相关时,重要的是不要两次计算距离。当您采用相关矩阵时,实际上就是在进行距离计算。您将希望通过取1-绝对值将其转换为真实距离。

1-abs(cor(x))

当您将此矩阵转换为距离对象时,如果使用dist函数,则将采用相关之间的距离。取而代之的是,您想使用该as.dist()函数,该函数会将您预先计算的距离简单地转换为一个"dist"对象。

将此方法应用于Alglim示例

library(psych)
data(bfi)
x <- bfi 
plot(hclust(as.dist(1-abs(cor(na.omit(x))))))

导致不同的树状图 聚类树状图

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.