Correlación en R: Pearson & Spearman con ejemplo de matriz

Una relación bivariada describe una relación -o correlación- entre dos variables y. En este tutorial, discutimos el concepto de correlación y mostramos cómo se puede usar para medir la relación entre dos variables.

Hay dos métodos principales para calcular la correlación entre dos variables.

  • Pearson: correlación paramétrica
  • Spearman: correlación no paramétrica

En este tutorial, aprenderá

  • correlación de Pearson
  • Correlación de rango de Spearman
  • Matriz de correlación
  • Visualice la matriz de correlación

correlación de Pearson

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 de la relación lineal 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 varía 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

Una correlación de rango ordena las observaciones por rango y calcula el nivel de similitud entre el rango. Una correlación de rango tiene la ventaja de ser robusta 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, con un valor cercano a la extremidad indica una relación fuerte. Se calcula de la siguiente manera:

con indicaron 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:

  • wfood: compartir comida compartir gasto
  • wfuel: compartir el gasto de combustible
  • wcloth: presupuesto compartido para gasto en ropa
  • walc: compartir el gasto en alcohol
  • wtrans: compartir el gasto en transporte
  • wother: parte del gasto en otros bienes
  • totexp: gasto total del hogar en libras
  • ingreso total ingreso neto del hogar
  • edad: edad del hogar
  • niños: número 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 logaritmo. Ayuda a reducir el impacto de los valores atípicos y disminuye la asimetría en el conjunto de datos.

Producción:

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

Podemos calcular el coeficiente de correlación entre las variables de ingreso y wfood con los métodos "pearson" y "spearman".

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

producción:

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

Producción:

## [1] -0.2501252 

Matriz de correlación

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 una 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 factorial. 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 de 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 codemat_1 <-as.dist(round(cor(data[,1:9]),2))mat_1

Explicación del código

  • cor (datos): muestra la matriz de correlación
  • round (datos, 2): Redondea la matriz de correlación con dos decimales
  • as.dist (): muestra solo la segunda mitad

Producción:

## 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 usamos el método de pearson o spearman. La función rcorr () de la biblioteca Hmisc calcula para nosotros el valor p. Podemos descargar la librería de conda y copiar el código para pegarlo en la terminal:

conda install -c r r-hmisc 

El 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

Estamos interesados ​​en 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
  • round (mat_2 [["P"]], 3): Redondea los elementos con tres dígitos

Producción:

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

Visualice la matriz de correlación

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 instalarlo directamente en la consola.

install.packages("GGally")

La biblioteca incluye diferentes funciones para mostrar los estadísticos de resumen como la correlación y distribución de todas las variables en una 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
  • nbreaks : 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 más bajo de la coloración
  • mid : controla el nivel medio de la coloración
  • alto : controla el alto nivel de coloración
  • geom : controla la forma del argumento geométrico. De forma predeterminada, "mosaico"
  • etiqueta : valor booleano. Mostrar o no la etiqueta. De forma predeterminada, se establece en "FALSE"

Mapa de calor básico

La trama más básica del paquete es un mapa de calor. La leyenda del gráfico muestra un color degradado de - 1 a 1, donde el color caliente 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): solo se necesita un argumento, que es el nombre del marco de datos. Las variables a nivel de factor no se incluyen en la gráfica.

Producción:

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

  • nbreaks = 6: rompe la leyenda con 6 rangos.
  • low = "steelblue": utilice colores más claros para la correlación negativa
  • mid = "white": usa colores blancos para la correlación de rangos medios
  • high = "darkred": use colores oscuros para una correlación positiva
  • geom = "circle": utiliza el 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.

Producción:

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

  • label = TRUE: Suma los valores de los coeficientes de correlación dentro del mapa de calor.
  • color = "grey50": elija el color, es decir, gris
  • label_size = 3: establece el tamaño de la etiqueta en 3

Producción:

ggpairs

Finalmente, presentamos otra función de la biblioteca GGaly. Ggpair. 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, 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 de 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 la gráfica
  • título : incluye un título
  • superior : controla las casillas sobre la diagonal de la trama. Necesita proporcionar el tipo de cálculos o gráfico para 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.
  • Inferior : controla las casillas debajo de la diagonal.
  • Mapeo : indica la estética del gráfico. Por ejemplo, podemos calcular el gráfico para diferentes grupos.

Análisis bivariado con ggpair con agrupación

El siguiente gráfico muestra tres datos:

  • La matriz de correlación entre la variable log_totexp, log_income, age y wtrans agrupada por si el hogar tiene un hijo o no.
  • Trace 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_income", "edad", "wtrans"): elija las variables para mostrar en el gráfico
  • title = "Análisis bivariado de los gastos de ingresos de los hogares británicos": agregue un título
  • upper = list (): Controla la parte superior del gráfico. Es decir, por encima de la diagonal
  • continuo = envolver ("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, por debajo de la diagonal.
  • continuo = envolver ("suave", alfa = 0.3, tamaño = 0.1): agregue un diagrama de dispersión con una tendencia lineal. Envolvemos el argumento continuo dentro de la función wrap () para controlar la estética del gráfico (es decir, tamaño = 0.1, alfa = 0.3)
  • mapping = aes (color = children_fac): Queremos que cada parte del gráfico sea apilada por la variable children_fac, que es una variable categórica que toma el valor 1 si el hogar no tiene niños y 2 en caso contrario

Producción:

Análisis bivariado con ggpair con agrupamiento 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 en el ejemplo anterior excepto por:
  • mapping = aes (color = children_fac): Mueve la lista en upper = list (). Solo queremos el cálculo apilado por grupo en la parte superior del gráfico.

Producción:

Resumen

Podemos resumir la función en la siguiente tabla:

Biblioteca

Objetivo

método

código

Base

correlación bivariada

Pearson

cor(dfx2, method = "pearson")

Base

correlación bivariada

Lancero

cor(dfx2, method = "spearman")

Base

Correlación multivariante

pearson

cor(df, method = "pearson")

Base

Correlación multivariante

Lancero

cor(df, method = "spearman")

Hmisc

Valor p

rcorr(as.matrix(data[,1:9]))[["P"]]

Ggally

mapa de calor

ggcorr(df)

Gráficos multivariados

cf code below

Articulos interesantes...