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 sistema coeficiente de correlación, , es una medida de la fuerza del lineal relación entre dos variables y . Se calcula de la siguiente manera:
con
- , es decir, desviación estándar de
- , 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:
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 rangos 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:
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")
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 los 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
- low: 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"
- Etiqueta: 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 gradiente de color de -1 a 1, donde el color cálido indica una correlación positiva fuerte 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:
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 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:
La función ggpairs
Por último, presentamos otra función de la biblioteca GGaly, Ggpair. Produce un gráfico en formato matricial. Podemos mostrar tres tipos de cálculos dentro de un gráfico. La matriz es una dimensión, con 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: Controla los cuadros que se encuentran sobre la diagonal del gráfico. Es necesario proporcionar el tipo de cálculos o gráfico que se desea devolver. Si continuous = “cor”, le pedimos a R que calcule la correlación. Ten en cuenta que el argumento debe ser una lista. Se pueden usar otros argumentos; consulta la [viñeta](“http://ggobi.github.io/ggally/#custom_functions”) para obtener más información.
- Más Bajo:Controla los cuadros 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 children_fac, que es una variable categórica que toma el valor de 1 si el hogar no tiene niños y 2 en caso contrario.
Salida:
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:
Resum
- 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 rangos 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:
Biblioteca | 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 |