Gráfico de correlación en R
Los gráficos de correlación, también conocidos como correlogramas para más de dos variables, nos ayudan a visualizar la correlación entre variables continuas. En este tutorial mostraremos cómo crear un gráfico de correlación en R con diferentes funciones y paquetes.
¿Cómo crear gráficos de correlación en R?
Hay dos formas de dibujar la correlación en R. Por un lado, puedes dibujar la correlación entre dos variables en R con un diagrama de dispersión, tal como se muestra a continuación. Ten en cuenta que la última línea del siguiente bloque de código permite agregar el coeficiente de correlación al gráfico.
# Generación de datos
set.seed(1)
x <- 1:100
y <- x + rnorm(100, mean = 0, sd = 15)
# Creamos el gráfico
plot(x, y, pch = 19, col = "lightblue")
# Línea de regresión
abline(lm(y ~ x), col = "red", lwd = 3)
# Correlación de Pearson
text(paste("Correlación:", round(cor(x, y), 2)), x = 25, y = 95)
También puedes calcular la correlación de Kendall y Spearman con la función cor
, estableciendo el argumento method
como "kendall"
o "spearman"
. E.g. cor(x, y, method = "kendall")
.
Por otro lado, si tienes más de dos variables, existen varias funciones para visualizar matrices de correlación en R, que repasaremos en las siguientes secciones.
Dibujar matrices de correlación en R: las funciones pairs y cpairs
La función más común para crear una matriz de diagramas de dispersión es la función pairs
. Con fines ilustrativos, usaremos el conocido conjunto de datos iris
.
data <- iris[, 1:4] # Variables numéricas
grupos <- iris[, 5] # Variable factor (grupos)
Con la función pairs
puedes crear un diagrama de correlación a partir de un data frame. Ten en cuenta que también puedes especificar una fórmula si lo prefieres.
# Dibujamos la matriz de correlación
pairs(data)
# Equivalente con una fórmula
pairs(~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width, data = iris)
# Equivalente usando la función plot
plot(data)
La función se puede personalizar con varios argumentos. En el siguiente ejemplo mostramos cómo personalizar completamente el gráfico de la matriz de correlación, coloreando las observaciones por grupo.
pairs(data, # Data frame de variables
labels = colnames(data), # Nombres de las variables
pch = 21, # Símbolo pch
bg = rainbow(3)[grupos], # Color de fondo del símbolo (pch 21 a 25)
col = rainbow(3)[grupos], # Color de borde del símbolo
main = "Iris", # Título del gráfico
row1attop = TRUE, # Si FALSE, cambia la dirección de la diagonal
gap = 1, # Distancia entre subplots
cex.labels = NULL, # Tamaño del texto de la diagonal
font.labels = 1) # Estilo de fuente del texto de la diagonal
La función pairs
también permite especificar funciones personalizadas en los argumentos upper.panel
, lower.panel
y diag.panel
. Ten en cuenta que si quieres eliminar algún panel establece el argumento correspondiente como NULL
.
Por un lado, puedes agregar histogramas y líneas de densidad a la diagonal con el siguiente código:
# Función para agregar histogramas
panel.hist <- function(x, ...) {
usr <- par("usr")
on.exit(par(usr))
par(usr = c(usr[1:2], 0, 1.5))
his <- hist(x, plot = FALSE)
breaks <- his$breaks
nB <- length(breaks)
y <- his$counts
y <- y/max(y)
rect(breaks[-nB], 0, breaks[-1], y, col = rgb(0, 1, 1, alpha = 0.5), ...)
# lines(density(x), col = 2, lwd = 2) # Descomenta para añadir curvas de densidad
}
# Creando el gráfico de correlación por pares
pairs(data,
upper.panel = NULL, # Deshabilitamos el panel superior
diag.panel = panel.hist) # Añadimos los histogramas
Por otro lado, puedes agregar los coeficientes de correlación en términos absolutos, con el tamaño de fuente escalada por el nivel de correlación, con el código del siguiente bloque. Ten en cuenta que puedes agregar líneas de regresión suavizadas pasando la función panel.smooth
al argumento lower.panel
.
# Función para agregar coeficientes de correlación
panel.cor <- function(x, y, digits = 2, prefix = "", cex.cor, ...) {
usr <- par("usr")
on.exit(par(usr))
par(usr = c(0, 1, 0, 1))
Cor <- abs(cor(x, y)) # Elimina la función abs si lo prefieres
txt <- paste0(prefix, format(c(Cor, 0.123456789), digits = digits)[1])
if(missing(cex.cor)) {
cex.cor <- 0.4 / strwidth(txt)
}
text(0.5, 0.5, txt,
cex = 1 + cex.cor * Cor) # Escala el texto al nivel de correlación
}
# Dibujamos la matriz de correlación
pairs(data,
upper.panel = panel.cor, # Panel de correlación
lower.panel = panel.smooth) # Curvas de regresión suavizadas
La función cpairs del paquete gclus
El paquete gclus
proporciona una función muy similar a la anterior llamada cpairs
. La principal diferencia es que la función cpairs
mejora la anterior permitiendo ordenar las variables y colorear los subplots por correlación.
# install.packages("gclus")
library(gclus)
# Correlación en términos absolutos
corr <- abs(cor(data))
colors <- dmat.color(corr)
order <- order.single(corr)
cpairs(data, # Data frame
order, # Orden de las variables
panel.colors = colors, # Matriz de colores
border.color = "grey70", # Color de los bordes
gap = 0.45, # Distancia entre subplots
main = "Variables ordenadas coloreadas por correlación", # Título principal
show.points = TRUE, # Si FALSE, elimina todos los puntos
pch = 21, # Símbolo pch
bg = rainbow(3)[iris$Species]) # Colores por grupo
Esta función permite especificar todos los argumentos disponibles en la función pairs.default
.
La función chart.Correlation
El paquete PerformanceAnalytics
incorpora la función chart.Correlation
que es un atajo para crear un gráfico de correlación en R con histogramas, funciones de densidad, líneas de regresión suavizadas y coeficientes de correlación con los niveles de significación (si no hay estrellas, la variable no es estadísticamente significativa, mientras que una, dos y tres estrellas significan que la correspondiente variable es estadísticamente significativa para los niveles 10%, 5% y 1%, respectivamente) con una sola línea de código:
# install.packages("PerformanceAnalytics")
library(PerformanceAnalytics)
chart.Correlation(data, histogram = TRUE, method = "pearson")
La función también permite especificar los argumentos de la función pairs
.
Gráficos de correlación en R con el paquete psych
El paquete pysch
proporciona dos funciones interesantes para crear gráficos de correlación en R. La función pairs.panel
es una extensión de la función pairs
que permite agregar fácilmente líneas de regresión, histogramas, intervalos de confianza, etc, así como personalizar varios argumentos adicionales.
# install.packages("psych")
library(psych)
pairs.panels(data,
smooth = TRUE, # Si TRUE, dibuja ajuste suavizados de tipo loess
scale = FALSE, # Si TRUE, escala la fuente al grado de correlación
density = TRUE, # Si TRUE, añade histogramas y curvas de densidad
ellipses = TRUE, # Si TRUE, dibuja elipses
method = "pearson", # Método de correlación (también "spearman" o "kendall")
pch = 21, # Símbolo pch
lm = FALSE, # Si TRUE, dibuja un ajuste lineal en lugar de un ajuste LOESS
cor = TRUE, # Si TRUE, agrega correlaciones
jiggle = FALSE, # Si TRUE, se añade ruido a los datos
factor = 2, # Nivel de ruido añadido a los datos
hist.col = 4, # Color de los histogramas
stars = TRUE, # Si TRUE, agrega el nivel de significación con estrellas
ci = TRUE) # Si TRUE, añade intervalos de confianza a los ajustes
La función corPlot
crea un gráfico de una matriz de correlación, coloreando las regiones según el nivel de correlación.
library(psych)
corPlot(data, cex = 1.2, main = "Matriz de correlación")
Recuerda escribir ?corPlot
para consultar argumentos y detalles adicionales.
Correlogramas con los paquetes corrgram y corrplot
La función corrgram
Por un lado, el paquete corrgram
calcula la correlación de los datos y dibuja correlogramas. La función del mismo nombre permite la personalización a través de funciones de panel. Como ejemplo, con el siguiente código se puede crear un correlograma en R donde el panel superior muestra gráficos circulares y el panel inferior muestra cuadros sombreados:
# install.packages("corrgram")
library(corrgram)
corrgram(data,
order = TRUE, # Si TRUE, reordena los datos en base a un ACP
upper.panel = panel.pie, # Función del panel sobre la diagonal
lower.panel = panel.shade, # Función del panel bajo la diagonal
text.panel = panel.txt, # Función del panel de la diagonal
main = "Correlograma") # Título principal
Hay varias funciones de panel que puedes utilizar. Con la función apropos
puedes enumerarlas todas:
apropos("panel.")
"panel.bar" "panel.conf" "panel.cor" "panel.density"
"panel.ellipse" "panel.fill" "panel.minmax" "panel.pie"
"panel.pts" "panel.shade" "panel.smooth" "panel.txt"
No puedes utilizar todos los tipos de panel en todos los argumentos para paneles. Recuerda escribir ?corrgram
o help(corrgram)
para obtener detalles y argumentos adicionales.
Las funciones corrplot y corrplot.mixed
Por otro lado, el paquete corrplot
es un paquete muy flexible, que permite crear una amplia variedad de correlogramas con una sola función. Los argumentos más comunes de la función principal se describen a continuación, pero recomendamos ejecutar ?corrplot
para obtener detalles adicionales. Ten en cuenta que en esta función se debe pasar la matriz de correlación, en lugar de las variables.
# install.packages("corrplot")
library(corrplot)
corrplot(cor(data), # Matriz de correlación
method = "shade", # Método para el gráfico de correlación
type = "full", # Estilo del gráfico (también "upper" y "lower")
diag = TRUE, # Si TRUE (por defecto), añade la diagonal
tl.col = "black", # Color de las etiquetas
bg = "white", # Color de fondo
title = "", # Título
col = NULL) # Paleta de colores
Puedes usar la función colorRampPalette
para generar espectros de color.
El argumento method
permite seleccionar entre "circle"
(por defecto), "square"
, "ellipse"
, "number"
, "shade"
, "pie"
, y "color"
. Como antes usamos el método "shade"
, mostramos el resto de opciones en la siguiente gráfica:
par(mfrow = c(2, 3))
# Círculos
corrplot(cor(data), method = "circle",
title = "method = 'circle'",
tl.pos = "n", mar = c(2, 1, 3, 1))
# Cuadrados
corrplot(cor(data), method = "square",
title = "method = 'square'",
tl.pos = "n", mar = c(2, 1, 3, 1))
# Elipses
corrplot(cor(data), method = "ellipse",
title = "method = 'ellipse'",
tl.pos = "n", mar = c(2, 1, 3, 1))
# Correlaciones
corrplot(cor(data), method = "number",
title = "method = 'number'",
tl.pos = "n", mar = c(2, 1, 3, 1))
# Gráficos de sectores
corrplot(cor(data), method = "pie",
title = "method = 'pie'",
tl.pos = "n", mar = c(2, 1, 3, 1))
# Colores
corrplot(cor(data), method = "color",
title = "method = 'color'",
tl.pos = "n", mar = c(2, 1, 3, 1))
par(mfrow = c(1, 1))
Esta función también permite agrupar los datos. Los métodos de agrupamiento según la documentación son: "original"
(orden predeterminado), "AOE"
(orden angular de los autovectores), "FPC"
(primer orden de componentes principales), "hclust"
(orden de agrupamiento jerárquico) y "alphabet"
(orden alfabético).
Si elegiste el método de agrupamiento jerárquico, puedes seleccionar uno de los siguientes métodos: "ward"
, "ward.D"
, "ward.D2"
, "single"
, "complete"
, "average"
, "mcquitty"
, "median"
y "centroid"
. En este caso, también puedes crear agrupaciones con rectángulos. Se muestra un ejemplo en el siguiente bloque de código:
corrplot(cor(data),
method = "circle",
order = "hclust", # Método de ordenación de la matriz
hclust.method = "ward.D", # Si order = "hclust", es el método de agrupación usado
addrect = 2, # Si order = "hclust", es el número de clusters
rect.col = 3, # Color de los rectángulos
rect.lwd = 3) # Ancho de línea de los rectángulos
Finalmente, la función corrplot.mixed
del paquete permite dibujar correlogramas con métodos mixtos. En este caso, puedes mezclar los métodos del gráfico de correlación en R configurando los argumentos deseados en los argumentos lower
(debajo de la diagonal) y upper
(encima de la diagonal).
# install.packages("corrplot")
library(corrplot)
corrplot.mixed(cor(data),
lower = "number",
upper = "circle",
tl.col = "black")
Como las posibilidades de personalización de las funciones del paquete corrplot
son enormes, recomendamos que ejecutar vignette("corrplot-intro")
para obtener más detalles.