Como posso criar uma matriz de correlação em R?


86

Tenho 92 conjuntos de dados do mesmo tipo.

Quero fazer uma matriz de correlação para quaisquer duas combinações possíveis.

ou seja, eu quero uma matriz de 92 x92.

tal que o elemento (ci, cj) deve ser a correlação entre ci e cj.

Como faço isso?


5
Veja a corfunção, ou a rcorrfunção no Hmiscpacote
Manuel Ramón

Consigo encontrar o cor entre dois parâmetros. O problema é como organizá-los em matriz?
Swapnil 'Tux' Takle

6
Como na Terra isso conseguiu tantos votos positivos?
Processo de Fundo Monica

Respostas:


104

Um exemplo,

 d <- data.frame(x1=rnorm(10),
                 x2=rnorm(10),
                 x3=rnorm(10))
cor(d) # get correlations (returns matrix)

72

Você pode usar o pacote 'corrplot'.

d <- data.frame(x1=rnorm(10),
                 x2=rnorm(10),
                 x3=rnorm(10))
M <- cor(d) # get correlations

library('corrplot') #package corrplot
corrplot(M, method = "circle") #plot matrix

insira a descrição da imagem aqui

Mais informações aqui: http://cran.r-project.org/web/packages/corrplot/vignettes/corrplot-intro.html


É possível obter um gráfico semelhante a estes cran.r-project.org/web/packages/corrplot/vignettes/… , ou uma matriz simples, mas com o R-quadrado em vez de Pearson, Kendall ou correlação de spearman?
FraNut

R2 é igual ao quadrado do coeficiente de correlação de Pearson. Portanto, tudo que você precisa é multiplicar M por M (multiplicar a matriz de correlação por si mesma), antes de criar o gráfico.
Jot eN

17

A função cor usará as colunas da matriz no cálculo da correlação. Portanto, o número de linhas deve ser o mesmo entre sua matriz xe matriz y . Ex.:

set.seed(1)
x <- matrix(rnorm(20), nrow=5, ncol=4)
y <- matrix(rnorm(15), nrow=5, ncol=3)
COR <- cor(x,y)
COR
image(x=seq(dim(x)[2]), y=seq(dim(y)[2]), z=COR, xlab="x column", ylab="y column")
text(expand.grid(x=seq(dim(x)[2]), y=seq(dim(y)[2])), labels=round(c(COR),2))

insira a descrição da imagem aqui

Editar:

Aqui está um exemplo de rótulos de linha e coluna personalizados em uma matriz de correlação calculada com uma única matriz:

png("corplot.png", width=5, height=5, units="in", res=200)
op <- par(mar=c(6,6,1,1), ps=10)
COR <- cor(iris[,1:4])
image(x=seq(nrow(COR)), y=seq(ncol(COR)), z=cor(iris[,1:4]), axes=F, xlab="", ylab="")
text(expand.grid(x=seq(dim(COR)[1]), y=seq(dim(COR)[2])), labels=round(c(COR),2))
box()
axis(1, at=seq(nrow(COR)), labels = rownames(COR), las=2)
axis(2, at=seq(ncol(COR)), labels = colnames(COR), las=1)
par(op)
dev.off()

insira a descrição da imagem aqui


O exemplo de @Manuel Ramón é provavelmente o melhor para o seu caso (uma única matriz) - organize seus conjuntos de dados como colunas.
Marc na caixa

na imagem acima, como se pode 'inverter' as cores, a correlação é vermelha próxima a -1 ou 1 e branca quando próxima a 0?
tagoma

image(x=seq(dim(x)[2]), y=seq(dim(y)[2]), z=COR, col=rev(heat.colors(20)), xlab="x column", ylab="y column")
Marc na caixa

@Marcinthebox como você adicionaria rótulos de variáveis ​​aos eixos xey (em vez de números)? Obrigado
Agustín Indaco

@ AgustínIndaco - Eu atualizei minha resposta com mais um exemplo. A imagefunção não pega automaticamente os nomes das linhas e colunas, então eles devem ser adicionados.
Marc na caixa de

15

Dê uma olhada em qtlcharts . Ele permite que você crie matrizes de correlação interativas :

library(qtlcharts)
data(iris)
iris$Species <- NULL
iplotCorr(iris, reorder=TRUE)

insira a descrição da imagem aqui

É mais impressionante quando você correlaciona mais variáveis, como na vinheta do pacote: insira a descrição da imagem aqui


1

Existem outras maneiras de conseguir isso aqui: ( Plotar a matriz de correlação em um gráfico ), mas eu gosto da sua versão com as correlações nas caixas. Existe uma maneira de adicionar os nomes das variáveis ​​às colunas xey em vez de apenas esses números de índice? Para mim, isso seria uma solução perfeita. Obrigado!

editar: Eu estava tentando comentar a postagem de [Marc na caixa], mas claramente não sei o que estou fazendo. No entanto, consegui responder a essa pergunta por mim mesmo.

se d for a matriz (ou o quadro de dados original) e os nomes das colunas forem o que você deseja, o seguinte funciona:

axis(1, 1:dim(d)[2], colnames(d), las=2)
axis(2, 1:dim(d)[2], colnames(d), las=2)

las = 0 viraria os nomes de volta à sua posição normal, os meus eram longos, então usei las = 2 para torná-los perpendiculares ao eixo.

edit2: para suprimir os números de impressão da função image () na grade (caso contrário, eles se sobrepõem aos rótulos das variáveis), adicione xaxt = 'n', por exemplo:

image(x=seq(dim(x)[2]), y=seq(dim(y)[2]), z=COR, col=rev(heat.colors(20)), xlab="x column", ylab="y column", xaxt='n')
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.