¿Cómo puedo crear una matriz de correlación en R?

86

Tengo 92 conjuntos de datos del mismo tipo.

Quiero hacer una matriz de correlación para dos combinaciones posibles.

es decir, quiero una matriz de 92 x92.

tal que el elemento (ci, cj) debería ser una correlación entre ci y cj.

¿Cómo puedo hacer eso?

Swapnil 'Tux' Takle
fuente
5
Eche un vistazo a la corfunción, o la rcorrfunción en el Hmiscpaquete
Manuel Ramón
Puedo encontrar el cor entre dos parámetros. ¿La cosa es cómo ordenarlos en matriz?
Swapnil 'Tux' Takle
6
¿Cómo diablos consiguió esto tantos votos a favor?
Financia la demanda de Monica

Respuestas:

104

Un ejemplo,

 d <- data.frame(x1=rnorm(10),
                 x2=rnorm(10),
                 x3=rnorm(10))
cor(d) # get correlations (returns matrix)
Manuel Ramón
fuente
72

Puede usar el paquete '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

ingrese la descripción de la imagen aquí

Más información aquí: http://cran.r-project.org/web/packages/corrplot/vignettes/corrplot-intro.html

Jot eN
fuente
¿Es posible obtener un gráfico similar a estos cran.r-project.org/web/packages/corrplot/vignettes/… , o una matriz simple, pero con la correlación R-cuadrado en lugar de pearson, kendall o spearman?
FraNut
R2 es igual al cuadrado del coeficiente de correlación de Pearson. Entonces, todo lo que necesita es multiplicar M por M (multiplicar la matriz de correlación por sí misma), antes de crear la gráfica.
Jot eN
17

La función cor utilizará las columnas de la matriz en el cálculo de la correlación. Entonces, el número de filas debe ser el mismo entre su matriz x y su 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))

ingrese la descripción de la imagen aquí

Editar:

A continuación, se muestra un ejemplo de etiquetas personalizadas de filas y columnas en una matriz de correlación calculada con una sola 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()

ingrese la descripción de la imagen aquí

Marc en la caja
fuente
El ejemplo de @Manuel Ramón es probablemente el mejor para su caso (una sola matriz): organice sus conjuntos de datos como columnas.
Marc en el palco
En la imagen de arriba, ¿cómo se pueden 'invertir' los colores, si la correlación del rojo es cercana a -1 o 1 y la del blanco cuando está cerca de 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 en el palco
@Marcinthebox ¿cómo agregaría etiquetas de variable a los ejes xey (en lugar de números)? Gracias
Agustín Indaco
@ AgustínIndaco - He actualizado mi respuesta con un ejemplo adicional. La imagefunción no toma automáticamente los nombres de filas y columnas, por lo que debe agregarse.
Marc en el palco
15

Eche un vistazo a qtlcharts . Le permite crear matrices de correlación interactivas :

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

ingrese la descripción de la imagen aquí

Es más impresionante cuando correlaciona más variables, como en la viñeta del paquete: ingrese la descripción de la imagen aquí

epo3
fuente
1

Hay otras formas de lograr esto aquí: ( Trace la matriz de correlación en un gráfico ), pero me gusta su versión con las correlaciones en los cuadros. ¿Hay alguna forma de agregar los nombres de las variables a la columna xey en lugar de solo esos números de índice? Para mí, eso haría de esta una solución perfecta. ¡Gracias!

editar: Estaba tratando de comentar la publicación de [Marc en el cuadro], pero claramente no sé lo que estoy haciendo. Sin embargo, logré responder esta pregunta por mí mismo.

si d es la matriz (o el marco de datos original) y los nombres de las columnas son los que desea, entonces funciona lo siguiente:

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

las = 0 voltearía los nombres a su posición normal, los míos eran largos, así que usé las = 2 para hacerlos perpendiculares al eje.

edit2: para suprimir la función image () que imprime números en la cuadrícula (de lo contrario, se superponen con las etiquetas de las variables), agregue xaxt = 'n', por ejemplo:

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
fuente