¿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?
5 answers
Un ejemplo,
d <- data.frame(x1=rnorm(10),
x2=rnorm(10),
x3=rnorm(10))
cor(d) # get correlations (returns matrix)
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
Más información aquí: http://cran.r-project.org/web/packages/corrplot/vignettes/corrplot-intro.html
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))
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()
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)
Es más impresionante cuando correlaciona más variables, como en la viñeta del paquete:
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')
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