Gráfico de correlación en R

Crea gráficos de correlación en R y correlogramas

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)

Gráfico de correlación de dos variables en R

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) 

Ejemplo de la función pairs en R

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

Función pairs con colores por grupos

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

Función pairs en R con histogramas en la diagonal

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

Función pairs con correlaciones y 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

Ejemplo de la función cpairs en R

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")

Ejemplo de uso de la función chart.Correlation del paquete PerformanceAnalytics

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

Gráfico de correlación con la función psych en R

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")

Función corPlot en R

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

Correlograma en R con la función corrgram

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

Gráfico de correlación en R con la función corrplot

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))

Métodos de la función corrplot en R

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

Método de agrupamiento jerárquico con la función corrplot

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")

Gráfico de correlación mixto en R con la función mixed.corrplot

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.