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?

Swapnil 'Tux' Takle
fonte
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)
Manuel Ramón
fonte
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

Jot eN
fonte
É 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

Marc na caixa
fonte
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

epo3
fonte
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')
TSeymour
fonte