Correlación en R: Matriz de correlación de Pearson y Spearman

Correlación bivariada en R

Una relación bivariada describe una relación -o correlación- entre dos variables en R. En este tutorial, discutiremos el concepto de correlación y mostraremos cómo se puede utilizar para medir la relación entre dos variables cualesquiera en R.

Correlación en programación R

Hay dos métodos principales para calcular la correlación entre dos variables en programación R:

  • Pearson: Correlación paramétrica
  • Lancero: Correlación no paramétrica

Matriz de correlación de Pearson en R

El método de correlación de Pearson se utiliza generalmente como verificación principal de la relación entre dos variables.

El coeficiente de correlación, , es una medida de la fuerza del lineal relación entre dos variables y . Se calcula de la siguiente manera:

Matriz de correlación de Pearson en R

  • Matriz de correlación de Pearson en R, es decir, desviación estándar de
  • Matriz de correlación de Pearson en R, es decir, desviación estándar de

La correlación oscila entre -1 y 1.

  • Un valor cercano o igual a 0 implica poca o ninguna relación lineal entre y.
  • Por el contrario, cuanto más se acerque a 1 o -1, más fuerte será la relación lineal.

Podemos calcular la prueba t de la siguiente manera y verificar la tabla de distribución con un grado de libertad igual a:

Matriz de correlación de Pearson en R

Correlación de rango de Spearman en R

Una correlación de rango ordena las observaciones por rango y calcula el nivel de similitud entre los rangos. Una correlación de rango tiene la ventaja de ser robusta frente a valores atípicos y no está vinculada a la distribución de los datos. Tenga en cuenta que una correlación de rango es adecuada para la variable ordinal.

La correlación de rango de Spearman, siempre está entre -1 y 1, y un valor cercano al extremo indica una relación fuerte. Se calcula de la siguiente manera:

Correlación de rango de Spearman en R

donde se establecen las covarianzas entre rango y . El denominador calcula las desviaciones estándar.

En R, podemos usar la función cor(). Se necesitan tres argumentos, y el método.

cor(x, y, method)

Argumentos:

  • x: Primer vector
  • y: Segundo vector
  • Método: La fórmula utilizada para calcular la correlación. Tres valores de cadena:
    • “pearson”
    • “kendall”
    • "lancero"

Se puede agregar un argumento opcional si los vectores contienen un valor faltante: use = “complete.obs”

Usaremos el conjunto de datos de BudgetUK. Este conjunto de datos informa la asignación presupuestaria de los hogares británicos entre 1980 y 1982. Hay 1519 observaciones con diez características, entre ellas:

  • comida: compartir comida compartir gastar
  • combustible: compartir el gasto en combustible
  • tela: proporción del presupuesto para gastos en ropa
  • Walc: compartir el gasto en alcohol
  • wtrans: compartir el gasto en transporte
  • padre: proporción del gasto en otros bienes
  • totexp: gasto total del hogar en libras
  • ingresos: ingreso neto total del hogar
  • edad : edad del hogar
  • niños: numero de niños

Ejemplo

library(dplyr)
PATH <-"https://raw.githubusercontent.com/guru99-edu/R-Programming/master/british_household.csv"
data <-read.csv(PATH)
  filter(income < 500)
  mutate(log_income = log(income),
         log_totexp = log(totexp),
         children_fac = factor(children, order = TRUE, labels = c("No", "Yes")))
  select(-c(X,X.1, children, totexp, income))
glimpse(data)

Explicación del código

  • Primero importamos los datos y echamos un vistazo con la función glimpse() de la biblioteca dplyr.
  • Tres puntos están por encima de 500K, por lo que decidimos excluirlos.
  • Es una práctica común convertir una variable monetaria en log. Ayuda a reducir el impacto de los valores atípicos y disminuye la asimetría en el conjunto de datos.

Salida:

## Observations: 1,516## Variables: 10
## $ wfood        <dbl> 0.4272, 0.3739, 0.1941, 0.4438, 0.3331, 0.3752, 0...
## $ wfuel        <dbl> 0.1342, 0.1686, 0.4056, 0.1258, 0.0824, 0.0481, 0...
## $ wcloth       <dbl> 0.0000, 0.0091, 0.0012, 0.0539, 0.0399, 0.1170, 0...
## $ walc         <dbl> 0.0106, 0.0825, 0.0513, 0.0397, 0.1571, 0.0210, 0...
## $ wtrans       <dbl> 0.1458, 0.1215, 0.2063, 0.0652, 0.2403, 0.0955, 0...
## $ wother       <dbl> 0.2822, 0.2444, 0.1415, 0.2716, 0.1473, 0.3431, 0...
## $ age          <int> 25, 39, 47, 33, 31, 24, 46, 25, 30, 41, 48, 24, 2...
## $ log_income   <dbl> 4.867534, 5.010635, 5.438079, 4.605170, 4.605170,...
## $ log_totexp   <dbl> 3.912023, 4.499810, 5.192957, 4.382027, 4.499810,...
## $ children_fac <ord> Yes, Yes, Yes, Yes, No, No, No, No, No, No, Yes, ...

Podemos calcular el coeficiente de correlación entre las variables ingresos y alimentos con los métodos “pearson” y “searman”.

cor(data$log_income, data$wfood, method = "pearson")

Salida:

## [1] -0.2466986
cor(data$log_income, data$wfood, method = "spearman")

Salida:

## [1] -0.2501252

Matriz de correlación en R

La correlación bivariada es un buen comienzo, pero podemos obtener una imagen más amplia con el análisis multivariado. Una correlación con muchas variables se representa dentro de un matriz de correlación. Una matriz de correlación es una matriz que representa la correlación de pares de todas las variables.

La función cor() devuelve una matriz de correlación. La única diferencia con la correlación bivariada es que no necesitamos especificar qué variables. De forma predeterminada, R calcula la correlación entre todas las variables.

Tenga en cuenta que no se puede calcular una correlación para la variable del factor. Necesitamos asegurarnos de eliminar la característica categórica antes de pasar el marco de datos dentro de cor().

Una matriz de correlación es simétrica, lo que significa que los valores por encima de la diagonal tienen los mismos valores que el de abajo. Es más visual mostrar la mitad de la matriz.

Excluimos Children_fac porque es una variable a nivel de factor. cor no realiza correlación en una variable categórica.

# the last column of data is a factor level. We don't include it in the code
mat_1 <-as.dist(round(cor(data[,1:9]),2))
mat_1

Explicación del código

  • cor(datos): Muestra la matriz de correlación
  • ronda(datos, 2): Redondea la matriz de correlación con dos decimales
  • como.dist(): Muestra solo la segunda mitad

Salida:

##            wfood wfuel wcloth  walc wtrans wother   age log_income
## wfuel       0.11                                                  
## wcloth     -0.33 -0.25                                            
## walc       -0.12 -0.13  -0.09                                     
## wtrans     -0.34 -0.16  -0.19 -0.22                               
## wother     -0.35 -0.14  -0.22 -0.12  -0.29                        
## age         0.02 -0.05   0.04 -0.14   0.03   0.02                 
## log_income -0.25 -0.12   0.10  0.04   0.06   0.13  0.23           
## log_totexp -0.50 -0.36   0.34  0.12   0.15   0.15  0.21       0.49

Nivel significativo

El nivel de significancia es útil en algunas situaciones cuando utilizamos el método de Pearson o Spearman. La función rcorr() de la biblioteca Hmisc calcula el valor p. Podemos descargar la biblioteca desde Conda y copia el código para pegarlo en la terminal:

conda install -c r r-hmisc

rcorr() requiere que un marco de datos se almacene como una matriz. Podemos convertir nuestros datos en una matriz antes de calcular la matriz de correlación con el valor p.

library("Hmisc")
data_rcorr <-as.matrix(data[, 1: 9])

mat_2 <-rcorr(data_rcorr)
# mat_2 <-rcorr(as.matrix(data)) returns the same output

El objeto de lista mat_2 contiene tres elementos:

  • r: Salida de la matriz de correlación
  • n: Número de observación
  • P: valor p

Nos interesa el tercer elemento, el valor p. Es común mostrar la matriz de correlación con el valor p en lugar del coeficiente de correlación.

p_value <-round(mat_2[["P"]], 3)
p_value

Explicación del código

  • mat_2[[“P”]]: Los valores p se almacenan en el elemento llamado P
  • ronda(mat_2[[“P”]], 3): Redondea los elementos con tres dígitos

Salida:

           wfood wfuel wcloth  walc wtrans wother   age log_income log_totexp
wfood         NA 0.000  0.000 0.000  0.000  0.000 0.365      0.000          0
wfuel      0.000    NA  0.000 0.000  0.000  0.000 0.076      0.000          0
wcloth     0.000 0.000     NA 0.001  0.000  0.000 0.160      0.000          0
walc       0.000 0.000  0.001    NA  0.000  0.000 0.000      0.105          0
wtrans     0.000 0.000  0.000 0.000     NA  0.000 0.259      0.020          0
wother     0.000 0.000  0.000 0.000  0.000     NA 0.355      0.000          0
age        0.365 0.076  0.160 0.000  0.259  0.355    NA      0.000          0
log_income 0.000 0.000  0.000 0.105  0.020  0.000 0.000         NA          0
log_totexp 0.000 0.000  0.000 0.000  0.000  0.000 0.000      0.000         NA

Visualización de la matriz de correlación en R

Un mapa de calor es otra forma de mostrar una matriz de correlación. La biblioteca GGally es una extensión de ggplot2. Actualmente, no está disponible en la biblioteca conda. Podemos instalar directamente en la consola.

install.packages("GGally")

Visualización de la matriz de correlación

La biblioteca incluye diferentes funciones para mostrar el resumen estadístico, como la correlación y distribución de todas las variables en un matriz.

La función ggcorr() tiene muchos argumentos. Introduciremos solo los argumentos que usaremos en el tutorial:

La función ggcorr

ggcorr(df, method = c("pairwise", "pearson"),
  nbreaks = NULL, digits = 2, low = "#3B9AB2",
  mid = "#EEEEEE", high = "#F21A00",
  geom = "tile", label = FALSE,
  label_alpha = FALSE)

Argumentos:

  • df: Conjunto de datos utilizado
  • Método: Fórmula para calcular la correlación. De forma predeterminada, se calculan por pares y Pearson.
  • n se rompe: Devuelve un rango categórico para la coloración de los coeficientes. De forma predeterminada, no hay interrupciones y el degradado de color es continuo.
  • dígitos: Redondea el coeficiente de correlación. Por defecto, establecido en 2
  • bajo: Controla el nivel inferior de la coloración.
  • medio: Controla el nivel medio de la coloración.
  • high: Controla el alto nivel de la coloración.
  • geom: controla la forma del argumento geométrico. Por defecto, "mosaico"
  • Label: Valor booleano. Mostrar o no la etiqueta. De forma predeterminada, establecido en "FALSO"

Mapa de calor básico

El gráfico más básico del paquete es un mapa de calor. La leyenda del gráfico muestra un color degradado de – 1 a 1, donde el color cálido indica una fuerte correlación positiva y el color frío, una correlación negativa.

library(GGally)
ggcorr(data)

Explicación del código

  • ggcorr(datos): Sólo se necesita un argumento, que es el nombre del marco de datos. Las variables a nivel de factor no se incluyen en el gráfico.

Salida:

Mapa de calor básico

Agregar control al mapa de calor

Podemos agregar más controles al gráfico:

ggcorr(data,
    nbreaks = 6,
    low = "steelblue",
    mid = "white",
    high = "darkred",
    geom = "circle")

Explicación del código

  • n descansos = 6: rompe la leyenda con 6 rangos.
  • bajo = “azul acero”: Utilice colores más claros para una correlación negativa
  • medio = “blanco”: Utilice colores blancos para la correlación de rangos medios
  • alto = “rojo oscuro”: Utilice colores oscuros para una correlación positiva
  • geom = “círculo”: Utilice un círculo como forma de las ventanas en el mapa de calor. El tamaño del círculo es proporcional al valor absoluto de la correlación.

Salida:

Agregar control al mapa de calor

Agregar etiqueta al mapa de calor

GGally nos permite agregar una etiqueta dentro de las ventanas:

ggcorr(data,
    nbreaks = 6,
    label = TRUE,
    label_size = 3,
    color = "grey50")

Explicación del código

  • etiqueta = VERDADERO: Suma los valores de los coeficientes de correlación dentro del mapa de calor.
  • color = “gris50”: Elige el color, es decir, gris.
  • tamaño_etiqueta = 3: Establece el tamaño de la etiqueta en 3

Salida:

Agregar etiqueta al mapa de calor

La función ggpairs

Finalmente, presentamos otra función de la biblioteca GGaly. Par. Produce un gráfico en formato matricial. Podemos mostrar tres tipos de cálculo dentro de un gráfico. La matriz es una dimensión, igual al número de observaciones. La parte superior/inferior muestra ventanas y en diagonal. Podemos controlar qué información queremos mostrar en cada parte de la matriz. La fórmula para ggpair es:

ggpair(df, columns = 1: ncol(df), title = NULL,
    upper = list(continuous = "cor"),
    lower = list(continuous = "smooth"),
    mapping = NULL)		

Argumentos:

  • df: Conjunto de datos utilizado
  • columnas: Seleccione las columnas para dibujar el gráfico.
  • título: Incluir un título
  • superior: Controlar el boxestá por encima de la diagonal de la parcela. Es necesario proporcionar el tipo de cálculos o gráfico que se devolverá. Si continuo = “cor”, le pedimos a R que calcule la correlación. Tenga en cuenta que el argumento debe ser una lista. Se pueden utilizar otros argumentos; consulte la [viñeta](“http://ggobi.github.io/ggally/#custom_functions”) para obtener más información.
  • Más Bajo: Controlar el boxestá debajo de la diagonal.
  • Mapeo: Indica la estética del gráfico. Por ejemplo, podemos calcular la gráfica para diferentes grupos.

Análisis bivariado con ggpair con agrupación.

El siguiente gráfico muestra tres informaciones:

  • La matriz de correlación entre las variables log_totexp, log_ Income, age y wtrans agrupadas según si el hogar tiene un hijo o no.
  • Trazar la distribución de cada variable por grupo.
  • Mostrar el diagrama de dispersión con la tendencia por grupo
library(ggplot2)
ggpairs(data, columns = c("log_totexp", "log_income", "age", "wtrans"), title = "Bivariate analysis of revenue expenditure by the British household", upper = list(continuous = wrap("cor",
        size = 3)),
    lower = list(continuous = wrap("smooth",
        alpha = 0.3,
        size = 0.1)),
    mapping = aes(color = children_fac))

Explicación del código

  • columnas = c(“log_totexp”, “log_ingresos”, “edad”, “wtrans”): Elige las variables a mostrar en el gráfico.
  • título = “Análisis bivariado del gasto en ingresos del hogar británico”: Añade un titulo
  • superior = lista(): controla la parte superior del gráfico. Es decir. Por encima de la diagonal
  • continuo = envoltura(“cor”, tamaño = 3)): Calcule el coeficiente de correlación. Envolvemos el argumento continuo dentro de la función wrap() para controlar la estética del gráfico (es decir, tamaño = 3) -lower = list(): controla la parte inferior del gráfico. Es decir. Debajo de la diagonal.
  • continuo = envoltura (“liso”, alfa = 0.3, tamaño = 0.1): agregue un diagrama de dispersión con una tendencia lineal. Envolvemos el argumento de forma continua dentro de la función wrap() para controlar la estética del gráfico (es decir, tamaño=0.1, alfa=0.3).
  • mapeo = aes (color = niños_fac): Queremos que cada parte del gráfico esté apilada por la variable niños_fac, que es una variable categórica que toma el valor de 1 si el hogar no tiene hijos y 2 en caso contrario.

Salida:

Análisis bivariado con ggpair con Agrupación

Análisis bivariado con ggpair con agrupación parcial

El siguiente gráfico es un poco diferente. Cambiamos la posición del mapeo dentro del argumento superior.

ggpairs(data, columns = c("log_totexp", "log_income", "age", "wtrans"),
    title = "Bivariate analysis of revenue expenditure by the British household",
    upper = list(continuous = wrap("cor",
            size = 3),
        mapping = aes(color = children_fac)),
    lower = list(
        continuous = wrap("smooth",
            alpha = 0.3,
            size = 0.1))
)

Explicación del código

  • Exactamente el mismo código que el ejemplo anterior excepto por:
  • mapeo = aes (color = niños_fac): mueve la lista en la parte superior = lista (). Solo queremos que el cálculo se acumule por grupo en la parte superior del gráfico.

Salida:

Análisis bivariado con ggpair con Agrupación Parcial

Resumen

  • Una relación bivariada describe una relación -o correlación- entre dos variables en R.
  • Hay dos métodos principales para calcular la correlación entre dos variables en Programación R: Pearson y Spearman.
  • El método de correlación de Pearson se utiliza generalmente como verificación principal de la relación entre dos variables.
  • Una correlación de rango ordena las observaciones por rango y calcula el nivel de similitud entre los rangos.
  • La correlación de rango de Spearman, siempre está entre -1 y 1, y un valor cercano al extremo indica una relación fuerte.
  • Una matriz de correlación es una matriz que representa la correlación de pares de todas las variables.
  • El nivel de significancia es útil en algunas situaciones cuando utilizamos el método de Pearson o Spearman.

Podemos resumir todas las funciones de correlación en R en la siguiente tabla:

de Recursos Objetivo Método Código
El pareo de bases correlación bivariada Pearson
cor(dfx2, method = "pearson")
El pareo de bases correlación bivariada Lancero
cor(dfx2, method = "spearman")
El pareo de bases Correlación multivariada Pearson
cor(df, method = "pearson")
El pareo de bases Correlación multivariada Lancero
cor(df, method = "spearman")
hmisc Valor de p
rcorr(as.matrix(data[,1:9]))[["P"]]
Ggally mapa de calor
ggcorr(df)
Gráficos multivariados
cf code below