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


Tengo 92 conjuntos de datos del mismo tipo.

Quiero hacer posible una matriz de correlación para cualquier combinación de dos.

Es decir, quiero una matriz de 92 x 92.

Tal que el elemento (ci,cj) debe ser correlación entre ci y cj.

¿Cómo hago eso?

Author: James K, 2012-05-21

5 answers

Un ejemplo,

 d &lt- data.frame(x1=rnorm(10),
                 x2=rnorm(10),
                 x3=rnorm(10))
cor(d) # get correlations (returns matrix)
 91
Author: Manuel Ramón,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-09 04:28:23

Puedes 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

introduzca la descripción de la imagen aquí

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

 68
Author: Jot eN,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-31 18:48:56

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

introduzca la descripción de la imagen aquí

Editar:

Aquí hay un ejemplo de etiquetas personalizadas de fila y columna 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()

introduzca la descripción de la imagen aquí

 15
Author: Marc in the box,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-11 16:34:47

Echa un vistazo a qtlcharts. Permite crear matrices de correlación interactivas :

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

introduzca la descripción de la imagen aquí

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

 13
Author: epo3,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-22 20:52:47

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

Editar: Estaba tratando de comentar el post de [Marc en la caja], pero claramente no sé lo que estoy haciendo. Sin embargo, me las arreglé para responder a esta pregunta para yo mismo.

Si d es la matriz (o el marco de datos original) y los nombres de las columnas son lo 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')
 1
Author: TSeymour,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:10:11