Variáveis ​​de cluster baseadas em correlações entre elas

23

Questões:

  1. Eu tenho uma grande matriz de correlação. Em vez de agrupar correlações individuais, quero agrupar variáveis ​​com base em suas correlações umas com as outras, ou seja, se a variável A e a variável B tiverem correlações semelhantes às variáveis ​​C a Z, então A e B devem fazer parte do mesmo cluster. Um bom exemplo disso são as diferentes classes de ativos - as correlações intra-classe são mais altas que as correlações entre classes.

  2. Também estou considerando agrupar variáveis ​​em termos de relação de relacionamento entre elas, por exemplo, quando a correlação entre as variáveis ​​A e B é próxima de 0, elas agem de forma mais ou menos independente. Se de repente algumas condições subjacentes mudarem e surgir uma forte correlação (positiva ou negativa), podemos pensar nessas duas variáveis ​​como pertencentes ao mesmo cluster. Então, em vez de procurar uma correlação positiva, procuraria-se relacionamento versus nenhum relacionamento. Eu acho que uma analogia pode ser um aglomerado de partículas carregadas positiva e negativamente. Se a carga cair para 0, a partícula se afasta do cluster. No entanto, cargas positivas e negativas atraem partículas para grupos reveladores.

Peço desculpas se algo disso não está muito claro. Entre em contato, esclareceremos detalhes específicos.

Eduardas
fonte
1
A análise fatorial não funcionaria para o qn 1? A questão 2 é um pouco vaga. 'Relacionamento' parece sinônimo de 'correlação' ou pelo menos uma forma de relacionamento é relacionamento linear e a correlação captura isso. Talvez, você precisa esclarecer qn 2.
Você declarou o que deseja fazer. Qual a sua pergunta? Trata-se de implementação ou se sua abordagem de análise é apropriada? ou alguma outra coisa?
Jeromy Anglim 23/09/10

Respostas:

14

Aqui está um exemplo simples em R usando o bficonjunto de dados: bfi é um conjunto de dados de 25 itens de teste de personalidade organizados em torno de 5 fatores.

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

Uma análise de cluster hi-search usando a distância euclidana entre variáveis ​​com base na correlação absoluta entre variáveis ​​pode ser obtida da seguinte forma:

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

texto alternativo O dendrograma mostra como os itens geralmente se agrupam com outros de acordo com os agrupamentos teorizados (por exemplo, itens N (Neuroticism) agrupam). Também mostra como alguns itens dos clusters são mais semelhantes (por exemplo, C5 e C1 podem ser mais semelhantes que C5 com C3). Também sugere que o cluster N é menos semelhante a outros clusters.

Como alternativa, você pode fazer uma análise fatorial padrão como esta:

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 
Jeromy Anglim
fonte
1
Oi Jeromy. P: o que significa tirar o dist do abs (cor (...))? Uma matriz cor não é aquela em que um número maior indica mais de uma relação, enquanto na matriz a distância o oposto é verdadeiro? (Eu suspeito que eu estou faltando alguma coisa, você poderia explicar?)
Tal Galili
@Tal Meu entendimento é que a função dist leva a distância euclidiana da matriz passada para ela, que neste caso era uma matriz de correlação absoluta. Talvez uma conversão mais literal a partir da matriz de correlação seja a função as.dist () que utiliza uma matriz de distância existente: por exemplo, as.dist (1-abs (cor (na.omit (x)))). Veja? dist
Jeromy Anglim
1
usando um 1-abs (cor ...) faria mais sentido para mim :)
Tal Galili
@ Tal Sim. Concordo. Eu dei uma olhada rápida. Nesse caso, o vetor de distâncias (euclidiano de abs cor com 1-abs cor) se correlaciona em torno de 0,96, portanto, não faz muita diferença.
Jeromy Anglim
1
@Tal a opção dist: cada variável possui um vetor de correlações absolutas. Variáveis ​​com vetores mais semelhantes teriam distâncias euclidianas menores: en.wikipedia.org/wiki/Euclidean_distance
Jeromy Anglim
2

Ao agrupar correlações, é importante não calcular a distância duas vezes. Quando você pega a matriz de correlação, está essencialmente fazendo um cálculo de distância. Você deseja convertê-lo para uma distância verdadeira, tomando 1 - o valor absoluto.

1-abs(cor(x))

Quando você vai converter essa matriz em um objeto de distância, se você utilizar a função dist, estará percorrendo as distâncias entre suas correlações. Em vez disso, você deseja usar a as.dist()função que simplesmente transformará suas distâncias pré-calculadas em um "dist"objeto.

Aplicando este método ao exemplo Alglim

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

resulta em um dendrograma diferente Dendrograma de cluster

Justin Leiterman
fonte