R

R

Tutorial R: Correlación en R

Aprende a calcular e interpretar coeficientes de correlación en R con Pearson, Spearman y Kendall para análisis estadístico riguroso.

Aprende R y certifícate

Coeficientes de Pearson, Spearman y Kendall

La correlación es una medida estadística que nos permite cuantificar la relación entre dos variables numéricas. En R disponemos de diferentes coeficientes de correlación, cada uno con sus propias características y supuestos. Estos coeficientes nos ayudan a determinar si existe una relación entre variables y cuál es su fuerza y dirección.

Coeficiente de correlación de Pearson

El coeficiente de correlación de Pearson (r) mide la fuerza y dirección de la relación lineal entre dos variables continuas. Sus valores oscilan entre -1 y 1:

  • r = 1: correlación positiva perfecta
  • r = 0: no existe correlación lineal
  • r = -1: correlación negativa perfecta

En R, podemos calcular este coeficiente utilizando la función cor():

# Creamos dos vectores de datos
altura <- c(165, 170, 168, 182, 175, 173, 165, 190, 188, 172)
peso <- c(60, 65, 63, 80, 73, 72, 61, 83, 82, 70)

# Calculamos la correlación de Pearson
cor(altura, peso, method = "pearson")

Este código nos devolverá un valor cercano a 0.97, indicando una correlación positiva fuerte entre altura y peso.

El coeficiente de Pearson asume que:

  • Las variables tienen una relación lineal
  • Los datos siguen una distribución normal
  • No hay valores atípicos significativos

Para verificar si la correlación es estadísticamente significativa, podemos usar la función cor.test():

# Test de significancia para la correlación de Pearson
resultado <- cor.test(altura, peso, method = "pearson")
resultado

Este test nos proporciona el valor p, el intervalo de confianza y el coeficiente de correlación.

Coeficiente de correlación de Spearman

Cuando nuestros datos no cumplen los supuestos de normalidad o la relación entre variables no es lineal, podemos utilizar el coeficiente de Spearman (rho). Este coeficiente:

  • Mide relaciones monótonas (no necesariamente lineales)
  • Se basa en los rangos de los datos, no en sus valores exactos
  • Es más robusto frente a valores atípicos

Para calcularlo en R:

# Datos con relación no lineal
x <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
y <- c(1, 4, 9, 16, 25, 36, 49, 64, 81, 100)  # Relación cuadrática

# Correlación de Pearson (detectará relación pero no perfecta)
cor(x, y, method = "pearson")

# Correlación de Spearman (detectará relación perfecta)
cor(x, y, method = "spearman")

En este ejemplo, Spearman dará un valor de 1, indicando una correlación perfecta, mientras que Pearson dará un valor menor porque la relación no es lineal.

Para probar la significancia estadística:

# Test de significancia para la correlación de Spearman
cor.test(x, y, method = "spearman")

Coeficiente de correlación de Kendall

El coeficiente tau de Kendall es otra alternativa no paramétrica que:

  • Se basa en la concordancia de pares de observaciones
  • Es más robusto que Spearman para muestras pequeñas
  • Es menos sensible a errores y discrepancias en los datos

Para calcularlo:

# Datos ordinales (por ejemplo, calificaciones)
calificacion_profesor1 <- c(5, 4, 3, 2, 1, 3, 4, 5, 2, 3)
calificacion_profesor2 <- c(4, 5, 3, 1, 2, 3, 5, 4, 2, 2)

# Correlación de Kendall
cor(calificacion_profesor1, calificacion_profesor2, method = "kendall")

El test de significancia se realiza de manera similar:

# Test de significancia para la correlación de Kendall
cor.test(calificacion_profesor1, calificacion_profesor2, method = "kendall")

Comparación de los tres coeficientes

Podemos comparar los tres coeficientes utilizando un mismo conjunto de datos:

# Creamos un conjunto de datos
set.seed(123)  # Para reproducibilidad
x <- rnorm(30)
y <- x + rnorm(30, sd = 0.5)  # y está relacionado con x más algo de ruido

# Calculamos los tres coeficientes
pearson <- cor(x, y, method = "pearson")
spearman <- cor(x, y, method = "spearman")
kendall <- cor(x, y, method = "kendall")

# Creamos un data frame para mostrar los resultados
resultados <- data.frame(
  Coeficiente = c("Pearson", "Spearman", "Kendall"),
  Valor = c(pearson, spearman, kendall)
)

print(resultados)

¿Cuál elegir?

La elección del coeficiente depende de las características de nuestros datos:

  • Pearson: cuando tenemos variables continuas con relación lineal y distribución normal.
  • Spearman: cuando los datos no siguen una distribución normal o la relación es monótona pero no necesariamente lineal.
  • Kendall: para muestras pequeñas, datos ordinales o cuando hay valores atípicos.

Un enfoque práctico es calcular los tres coeficientes y observar si hay diferencias significativas entre ellos:

# Función para calcular los tres coeficientes
calcular_correlaciones <- function(x, y) {
  pearson <- cor(x, y, method = "pearson")
  spearman <- cor(x, y, method = "spearman")
  kendall <- cor(x, y, method = "kendall")
  
  return(c(Pearson = pearson, Spearman = spearman, Kendall = kendall))
}

# Ejemplo con datos normales
x1 <- rnorm(50)
y1 <- 2*x1 + rnorm(50, sd = 0.5)
calcular_correlaciones(x1, y1)

# Ejemplo con datos no normales (exponenciales)
x2 <- rexp(50)
y2 <- 2*x2 + rexp(50)
calcular_correlaciones(x2, y2)

Si los tres coeficientes son similares, generalmente indica que los datos cumplen con los supuestos de Pearson. Si hay diferencias importantes, es recomendable utilizar Spearman o Kendall.

Ejemplo práctico con datos reales

Veamos un ejemplo utilizando el conjunto de datos mtcars incluido en R:

# Exploramos la correlación entre el peso del coche y el consumo de combustible
data(mtcars)

# Visualizamos la relación
plot(mtcars$wt, mtcars$mpg, 
     main = "Relación entre peso y consumo",
     xlab = "Peso (1000 lbs)", 
     ylab = "Millas por galón",
     pch = 19)

# Calculamos los tres coeficientes
cor_pearson <- cor(mtcars$wt, mtcars$mpg, method = "pearson")
cor_spearman <- cor(mtcars$wt, mtcars$mpg, method = "spearman")
cor_kendall <- cor(mtcars$wt, mtcars$mpg, method = "kendall")

# Mostramos los resultados
cat("Correlación de Pearson:", round(cor_pearson, 3), "\n")
cat("Correlación de Spearman:", round(cor_spearman, 3), "\n")
cat("Correlación de Kendall:", round(cor_kendall, 3), "\n")

En este ejemplo, observaremos una correlación negativa entre el peso del coche y su eficiencia de combustible (millas por galón), lo que tiene sentido: coches más pesados tienden a consumir más combustible.

Matrices de correlación y visualización

Cuando trabajamos con múltiples variables en un análisis estadístico, calcular correlaciones por pares puede volverse tedioso. Las matrices de correlación nos permiten visualizar y analizar las relaciones entre todas las variables numéricas de un conjunto de datos de forma simultánea.

Creación de matrices de correlación

En R, podemos generar matrices de correlación fácilmente utilizando la función cor() aplicada a un data frame o matriz que contenga variables numéricas:

# Cargamos un conjunto de datos de ejemplo
data(mtcars)

# Creamos una matriz de correlación con todas las variables numéricas
matriz_correlacion <- cor(mtcars)

# Visualizamos las primeras filas y columnas
head(matriz_correlacion[, 1:5])

Esta matriz muestra los coeficientes de correlación entre cada par de variables. Por defecto, R utiliza el método de Pearson, pero podemos especificar otros métodos:

# Matriz de correlación usando Spearman
matriz_spearman <- cor(mtcars, method = "spearman")

# Matriz de correlación usando Kendall
matriz_kendall <- cor(mtcars, method = "kendall")

Visualización básica de matrices de correlación

Una matriz de correlación puede ser difícil de interpretar en formato numérico. R ofrece varias opciones para visualizarla:

# Visualización básica con la función image()
image(matriz_correlacion, 
      main = "Matriz de correlación",
      axes = FALSE)
axis(1, at = seq(0, 1, length.out = ncol(mtcars)), labels = colnames(mtcars), las = 2)
axis(2, at = seq(0, 1, length.out = ncol(mtcars)), labels = colnames(mtcars), las = 2)

Sin embargo, esta visualización básica tiene limitaciones. Para representaciones más informativas, podemos utilizar paquetes especializados.

Visualización avanzada con corrplot

El paquete corrplot ofrece opciones más sofisticadas para visualizar matrices de correlación:

# Instalamos el paquete si no está disponible
if (!require(corrplot)) install.packages("corrplot")
library(corrplot)

# Visualización básica con corrplot
corrplot(matriz_correlacion)

Este paquete ofrece múltiples métodos de visualización:

# Diferentes métodos de visualización
corrplot(matriz_correlacion, method = "circle")  # Círculos (predeterminado)
corrplot(matriz_correlacion, method = "color")   # Cuadrados coloreados
corrplot(matriz_correlacion, method = "pie")     # Gráficos de sectores
corrplot(matriz_correlacion, method = "number")  # Valores numéricos

También podemos personalizar los colores y ordenar las variables según su similitud:

# Personalización de colores y ordenamiento
corrplot(matriz_correlacion, 
         method = "color", 
         type = "upper",            # Solo muestra la mitad superior
         order = "hclust",          # Ordena variables por similitud
         addCoef.col = "black",     # Añade coeficientes numéricos
         tl.col = "black",          # Color del texto de las etiquetas
         tl.srt = 45,               # Rotación del texto
         diag = FALSE)              # No muestra la diagonal

Visualización con ggplot2 y GGally

Para quienes prefieren el sistema ggplot2, el paquete GGally proporciona funciones útiles:

# Instalamos los paquetes si no están disponibles
if (!require(ggplot2)) install.packages("ggplot2")
if (!require(GGally)) install.packages("GGally")
library(ggplot2)
library(GGally)

# Creamos una matriz de correlación visual
ggcorr(mtcars, 
       method = c("everything", "pearson"), 
       label = TRUE,
       label_size = 3,
       color = "grey50")

La función ggpairs() va más allá y crea una matriz de gráficos que incluye:

  • Histogramas de cada variable en la diagonal
  • Gráficos de dispersión entre pares de variables
  • Coeficientes de correlación
# Seleccionamos algunas variables para mayor claridad
mtcars_subset <- mtcars[, c("mpg", "disp", "hp", "wt", "qsec")]

# Creamos una matriz de gráficos
ggpairs(mtcars_subset)

Matrices de correlación con significancia estadística

Podemos combinar la visualización con pruebas de significancia estadística:

# Función para calcular p-valores de correlaciones
cor_pmat <- function(x) {
  mat <- matrix(NA, ncol(x), ncol(x))
  colnames(mat) <- rownames(mat) <- colnames(x)
  
  for(i in 1:(ncol(x)-1)) {
    for(j in (i+1):ncol(x)) {
      test <- cor.test(x[,i], x[,j])
      mat[i,j] <- mat[j,i] <- test$p.value
    }
  }
  return(mat)
}

# Calculamos la matriz de p-valores
p_valores <- cor_pmat(mtcars)

# Visualizamos correlaciones con significancia
corrplot(matriz_correlacion, 
         p.mat = p_valores,        # Matriz de p-valores
         sig.level = 0.05,         # Nivel de significancia
         insig = "blank")          # Oculta correlaciones no significativas

Mapas de calor (heatmaps)

Los mapas de calor son otra forma efectiva de visualizar matrices de correlación:

# Usando la función heatmap base de R
heatmap(matriz_correlacion, 
        Rowv = NA, Colv = NA,      # Sin reordenar filas/columnas
        col = colorRampPalette(c("blue", "white", "red"))(100),
        scale = "none",
        margins = c(10, 10))

Para una visualización más refinada, podemos usar el paquete pheatmap:

# Instalamos el paquete si no está disponible
if (!require(pheatmap)) install.packages("pheatmap")
library(pheatmap)

# Creamos un mapa de calor mejorado
pheatmap(matriz_correlacion,
         color = colorRampPalette(c("#6D9EC1", "white", "#E46726"))(100),
         display_numbers = TRUE,    # Muestra los valores numéricos
         number_color = "black",
         fontsize_number = 7,
         angle_col = 45)

Filtrado de matrices de correlación

En conjuntos de datos con muchas variables, puede ser útil filtrar las correlaciones para centrarnos en las más relevantes:

# Función para filtrar correlaciones por umbral
filtrar_correlacion <- function(matriz_cor, umbral = 0.7) {
  # Convertimos a data frame para facilitar el filtrado
  cor_df <- as.data.frame(as.table(matriz_cor))
  names(cor_df) <- c("Variable1", "Variable2", "Correlacion")
  
  # Filtramos correlaciones por encima del umbral (en valor absoluto)
  # y eliminamos la diagonal (correlación de una variable consigo misma)
  cor_df_filtrada <- subset(cor_df, 
                           abs(Correlacion) > umbral & 
                           Variable1 != Variable2)
  
  # Ordenamos por valor absoluto de correlación
  cor_df_filtrada <- cor_df_filtrada[order(-abs(cor_df_filtrada$Correlacion)),]
  
  return(cor_df_filtrada)
}

# Aplicamos el filtro
correlaciones_altas <- filtrar_correlacion(matriz_correlacion, 0.8)
print(correlaciones_altas)

Visualización interactiva

Para análisis exploratorios, las visualizaciones interactivas pueden ser muy útiles:

# Instalamos el paquete si no está disponible
if (!require(plotly)) install.packages("plotly")
library(plotly)

# Convertimos la matriz de correlación a formato largo
cor_long <- as.data.frame(as.table(matriz_correlacion))
names(cor_long) <- c("Var1", "Var2", "Correlacion")

# Creamos un mapa de calor interactivo
plot_ly(x = cor_long$Var1, 
        y = cor_long$Var2, 
        z = cor_long$Correlacion, 
        type = "heatmap",
        colorscale = list(c(0, "blue"), c(0.5, "white"), c(1, "red"))) %>%
  layout(title = "Matriz de correlación interactiva")

Matrices de correlación para subconjuntos de datos

A menudo es útil examinar cómo varían las correlaciones entre diferentes grupos de datos:

# Dividimos los datos por número de cilindros
mtcars_4cyl <- subset(mtcars, cyl == 4)
mtcars_6cyl <- subset(mtcars, cyl == 6)
mtcars_8cyl <- subset(mtcars, cyl == 8)

# Calculamos matrices de correlación para cada grupo
cor_4cyl <- cor(mtcars_4cyl[, c("mpg", "disp", "hp", "wt")])
cor_8cyl <- cor(mtcars_8cyl[, c("mpg", "disp", "hp", "wt")])

# Visualizamos las diferencias
par(mfrow = c(1, 2))
corrplot(cor_4cyl, method = "color", title = "Coches de 4 cilindros")
corrplot(cor_8cyl, method = "color", title = "Coches de 8 cilindros")

Las matrices de correlación son herramientas poderosas para el análisis exploratorio de datos, permitiéndonos identificar rápidamente patrones y relaciones entre múltiples variables. La visualización adecuada de estas matrices facilita enormemente la interpretación de resultados y la comunicación de hallazgos estadísticos.

Interpretación y significancia estadística

La correlación nos proporciona información valiosa sobre la relación entre variables, pero saber cómo interpretar correctamente estos valores y determinar su significancia estadística es fundamental para extraer conclusiones válidas de nuestros análisis.

Interpretación de los coeficientes de correlación

Los coeficientes de correlación (Pearson, Spearman o Kendall) oscilan entre -1 y 1, donde:

  • Valores positivos indican que las variables aumentan o disminuyen conjuntamente
  • Valores negativos indican que cuando una variable aumenta, la otra disminuye
  • Valores cercanos a 0 indican poca o ninguna relación lineal

Una guía general para interpretar la fuerza de la correlación es:

  • 0.00 - 0.19: correlación muy débil
  • 0.20 - 0.39: correlación débil
  • 0.40 - 0.59: correlación moderada
  • 0.60 - 0.79: correlación fuerte
  • 0.80 - 1.00: correlación muy fuerte

Veamos un ejemplo práctico:

# Creamos datos con diferentes niveles de correlación
set.seed(123)
x <- rnorm(100)

# Correlaciones de diferentes intensidades
y_fuerte <- 0.8*x + rnorm(100, sd=0.4)  # Correlación fuerte
y_moderada <- 0.5*x + rnorm(100, sd=0.7)  # Correlación moderada
y_debil <- 0.2*x + rnorm(100, sd=0.9)  # Correlación débil

# Calculamos las correlaciones
cor_fuerte <- cor(x, y_fuerte)
cor_moderada <- cor(x, y_moderada)
cor_debil <- cor(x, y_debil)

# Mostramos los resultados
resultados <- data.frame(
  Intensidad = c("Fuerte", "Moderada", "Débil"),
  Correlación = round(c(cor_fuerte, cor_moderada, cor_debil), 2)
)
print(resultados)

Significancia estadística de la correlación

La significancia estadística nos ayuda a determinar si la correlación observada refleja una relación real o podría ser resultado del azar. En R, utilizamos la función cor.test() para evaluar esta significancia:

# Evaluamos la significancia de una correlación
resultado_test <- cor.test(x, y_moderada)
print(resultado_test)

Los elementos clave a interpretar en el resultado son:

  • Valor p (p-value): indica la probabilidad de observar una correlación igual o más extrema si no existiera relación real entre las variables.
  • Intervalo de confianza: rango donde se encuentra el verdadero valor de correlación con cierta probabilidad (generalmente 95%).
  • Estadístico t: valor que se utiliza para calcular el valor p.

Si el valor p es menor que el nivel de significancia (típicamente 0.05), rechazamos la hipótesis nula de que no hay correlación.

Interpretación visual de correlaciones

Las visualizaciones nos ayudan a interpretar mejor las correlaciones:

# Creamos un gráfico para visualizar diferentes correlaciones
par(mfrow=c(1,3))  # Dividimos el área de gráfico en 3 columnas

# Correlación fuerte
plot(x, y_fuerte, main=paste("Correlación fuerte:", round(cor_fuerte, 2)),
     xlab="Variable X", ylab="Variable Y", pch=19)
abline(lm(y_fuerte ~ x), col="red", lwd=2)

# Correlación moderada
plot(x, y_moderada, main=paste("Correlación moderada:", round(cor_moderada, 2)),
     xlab="Variable X", ylab="Variable Y", pch=19)
abline(lm(y_moderada ~ x), col="red", lwd=2)

# Correlación débil
plot(x, y_debil, main=paste("Correlación débil:", round(cor_debil, 2)),
     xlab="Variable X", ylab="Variable Y", pch=19)
abline(lm(y_debil ~ x), col="red", lwd=2)

par(mfrow=c(1,1))  # Restauramos la configuración original

Tamaño de la muestra y significancia

El tamaño de la muestra afecta directamente la significancia estadística. Con muestras grandes, incluso correlaciones pequeñas pueden ser estadísticamente significativas:

# Comparamos la significancia con diferentes tamaños de muestra
set.seed(123)

# Función para crear datos con correlación específica
generar_datos_cor <- function(n, cor_objetivo) {
  x <- rnorm(n)
  # Calculamos el factor para lograr la correlación deseada
  factor <- cor_objetivo / sqrt(1 - cor_objetivo^2)
  y <- factor * x + rnorm(n)
  return(list(x=x, y=y))
}

# Generamos datos con la misma correlación pero diferentes tamaños
datos_pequenos <- generar_datos_cor(20, 0.3)
datos_medianos <- generar_datos_cor(100, 0.3)
datos_grandes <- generar_datos_cor(500, 0.3)

# Realizamos pruebas de correlación
test_pequeno <- cor.test(datos_pequenos$x, datos_pequenos$y)
test_mediano <- cor.test(datos_medianos$x, datos_medianos$y)
test_grande <- cor.test(datos_grandes$x, datos_grandes$y)

# Mostramos los resultados
resultados_tamano <- data.frame(
  Muestra = c("Pequeña (n=20)", "Mediana (n=100)", "Grande (n=500)"),
  Correlación = c(cor(datos_pequenos$x, datos_pequenos$y),
                  cor(datos_medianos$x, datos_medianos$y),
                  cor(datos_grandes$x, datos_grandes$y)),
  Valor_p = c(test_pequeno$p.value, test_mediano$p.value, test_grande$p.value),
  Significativo = c(test_pequeno$p.value < 0.05, 
                    test_mediano$p.value < 0.05,
                    test_grande$p.value < 0.05)
)

print(round(resultados_tamano, 4))

Correlación no implica causalidad

Un aspecto crucial al interpretar correlaciones es recordar que la correlación no implica causalidad. Dos variables pueden estar correlacionadas por diversas razones:

  1. Relación causal directa: A causa B
  2. Relación causal inversa: B causa A
  3. Causa común: C causa tanto A como B
  4. Relación indirecta: A causa C que causa B
  5. Coincidencia: correlación espuria sin relación real

Veamos un ejemplo clásico de correlación espuria:

# Ejemplo de correlación espuria
# Consumo de helados y ahogamientos (ambos aumentan en verano)
meses <- 1:12
temperatura <- c(5, 7, 10, 15, 20, 25, 28, 27, 22, 15, 10, 6)  # Temperatura media
ventas_helado <- temperatura*2 + rnorm(12, sd=3)  # Ventas de helado
ahogamientos <- temperatura*0.8 + rnorm(12, sd=2)  # Casos de ahogamiento

# Calculamos la correlación
cor_helados_ahogamientos <- cor(ventas_helado, ahogamientos)

# Visualizamos
plot(ventas_helado, ahogamientos, 
     main=paste("Correlación:", round(cor_helados_ahogamientos, 2)),
     xlab="Ventas de helado", ylab="Casos de ahogamiento", pch=19)
abline(lm(ahogamientos ~ ventas_helado), col="red", lwd=2)

# Añadimos la temperatura como variable de control
modelo <- lm(ahogamientos ~ ventas_helado + temperatura)
summary(modelo)

Correlación parcial

La correlación parcial nos permite examinar la relación entre dos variables mientras controlamos el efecto de una o más variables adicionales:

# Instalamos el paquete si no está disponible
if (!require(ppcor)) install.packages("ppcor")
library(ppcor)

# Creamos un data frame con nuestros datos
datos_helados <- data.frame(
  Temperatura = temperatura,
  Ventas_helado = ventas_helado,
  Ahogamientos = ahogamientos
)

# Calculamos correlaciones parciales
cor_parcial <- pcor(datos_helados)
print(cor_parcial)

Interpretación de correlaciones en datos reales

Apliquemos estos conceptos a un conjunto de datos real:

# Cargamos datos de iris
data(iris)

# Seleccionamos solo variables numéricas
iris_num <- iris[, 1:4]

# Calculamos la matriz de correlación
cor_iris <- cor(iris_num)
print(round(cor_iris, 2))

# Evaluamos la significancia de cada correlación
cor_tests <- function(df) {
  n <- ncol(df)
  p_matrix <- matrix(NA, n, n)
  
  for(i in 1:(n-1)) {
    for(j in (i+1):n) {
      test <- cor.test(df[,i], df[,j])
      # Guardamos el valor p en ambas posiciones de la matriz
      p_matrix[i,j] <- p_matrix[j,i] <- test$p.value
    }
  }
  
  colnames(p_matrix) <- rownames(p_matrix) <- colnames(df)
  return(p_matrix)
}

p_valores_iris <- cor_tests(iris_num)
print(round(p_valores_iris, 4))

# Visualizamos correlaciones significativas
library(corrplot)
corrplot(cor_iris, 
         p.mat = p_valores_iris, 
         sig.level = 0.05,
         insig = "blank",
         method = "circle",
         type = "upper",
         addCoef.col = "black",
         number.cex = 0.7,
         tl.col = "black",
         tl.srt = 45,
         diag = FALSE)

Interpretación por especies

Las correlaciones pueden variar entre diferentes grupos. Veamos cómo difieren las correlaciones entre especies de iris:

# Dividimos por especie
setosa <- subset(iris, Species == "setosa")[, 1:4]
versicolor <- subset(iris, Species == "versicolor")[, 1:4]
virginica <- subset(iris, Species == "virginica")[, 1:4]

# Calculamos correlaciones por especie
cor_setosa <- cor(setosa)
cor_versicolor <- cor(versicolor)
cor_virginica <- cor(virginica)

# Visualizamos las diferencias
par(mfrow=c(1,3))
corrplot(cor_setosa, method="color", title="Setosa")
corrplot(cor_versicolor, method="color", title="Versicolor")
corrplot(cor_virginica, method="color", title="Virginica")
par(mfrow=c(1,1))

Consideraciones prácticas para la interpretación

Al interpretar correlaciones, debemos considerar:

  • Linealidad: Los coeficientes de Pearson solo miden relaciones lineales
  • Valores atípicos: Pueden distorsionar significativamente los resultados
  • Restricción de rango: Limitar el rango de valores puede afectar la correlación
  • Fiabilidad de las medidas: Errores de medición reducen la correlación observada
# Ejemplo de cómo los valores atípicos afectan la correlación
set.seed(123)
x_normal <- rnorm(30)
y_normal <- 0.7*x_normal + rnorm(30, sd=0.5)

# Añadimos un valor atípico
x_outlier <- c(x_normal, 5)
y_outlier <- c(y_normal, -5)

# Calculamos correlaciones
cor_normal <- cor(x_normal, y_normal)
cor_outlier <- cor(x_outlier, y_outlier)

# Visualizamos
par(mfrow=c(1,2))
plot(x_normal, y_normal, 
     main=paste("Sin atípicos\nCorrelación:", round(cor_normal, 2)),
     xlab="X", ylab="Y", pch=19)
abline(lm(y_normal ~ x_normal), col="red", lwd=2)

plot(x_outlier, y_outlier, 
     main=paste("Con atípico\nCorrelación:", round(cor_outlier, 2)),
     xlab="X", ylab="Y", pch=19)
abline(lm(y_outlier ~ x_outlier), col="red", lwd=2)
points(5, -5, col="red", pch=19, cex=2)  # Destacamos el valor atípico
par(mfrow=c(1,1))

Corrección para comparaciones múltiples

Cuando realizamos múltiples pruebas de correlación, aumenta la probabilidad de encontrar correlaciones significativas por azar. Para controlar esto, podemos aplicar correcciones:

# Generamos 20 variables aleatorias (sin correlación real)
set.seed(123)
datos_aleatorios <- matrix(rnorm(100*20), ncol=20)
colnames(datos_aleatorios) <- paste0("Var", 1:20)

# Calculamos todas las correlaciones posibles
p_valores <- c()
pares <- c()

for(i in 1:19) {
  for(j in (i+1):20) {
    test <- cor.test(datos_aleatorios[,i], datos_aleatorios[,j])
    p_valores <- c(p_valores, test$p.value)
    pares <- c(pares, paste("Var", i, "-", "Var", j))
  }
}

# Aplicamos corrección de Bonferroni
p_ajustados <- p.adjust(p_valores, method="bonferroni")

# Comparamos resultados
resultados_multiples <- data.frame(
  Pares = pares,
  P_original = p_valores,
  P_ajustado = p_ajustados,
  Significativo_original = p_valores < 0.05,
  Significativo_ajustado = p_ajustados < 0.05
)

# Contamos cuántas correlaciones son significativas antes y después
sum(resultados_multiples$Significativo_original)  # Esperamos ~5% por azar
sum(resultados_multiples$Significativo_ajustado)  # Debería ser cercano a 0

La interpretación adecuada de las correlaciones y su significancia estadística es fundamental para extraer conclusiones válidas de nuestros análisis. Recordar siempre que la correlación es solo una medida de asociación y no implica causalidad nos ayudará a evitar interpretaciones erróneas de nuestros resultados.

Aprende R online

Otros ejercicios de programación de R

Evalúa tus conocimientos de esta lección Correlación en R con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.

Todas las lecciones de R

Accede a todas las lecciones de R y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Instalación De R Y Rstudio

R

Introducción Y Entorno

Introducción A R

R

Introducción Y Entorno

Operadores

R

Sintaxis

Estructuras De Datos

R

Sintaxis

Funciones

R

Sintaxis

Estructuras De Control Iterativo

R

Sintaxis

Scopes Y Closures

R

Sintaxis

Estructuras De Control Condicional

R

Sintaxis

Funciones Anónimas

R

Sintaxis

Tipos De Datos Y Variables

R

Sintaxis

Sistema R6: Clases Referenciales Y Encapsulamiento

R

Programación Orientada A Objetos

Sistema S4: Clases Formales Y Validación

R

Programación Orientada A Objetos

Herencia Y Polimorfismo En R

R

Programación Orientada A Objetos

Sistemas De Oop En R

R

Programación Orientada A Objetos

Sistema S3: Clases Implícitas Y Métodos Genéricos

R

Programación Orientada A Objetos

Tidyverse Para Transformación De Datos

R

Manipulación De Datos

Lubridate Para Fechas Y Tiempo

R

Manipulación De Datos

Group_by Y Summarize Para Agrupación Y Resumen

R

Manipulación De Datos

Stringr Para Expresiones Regulares

R

Manipulación De Datos

Tidyr Para Limpieza De Valores Faltantes

R

Manipulación De Datos

Joins En R Para Combinación Y Relaciones De Tablas

R

Manipulación De Datos

Pivot_longer Y Pivot_wider Para Reestructuración

R

Manipulación De Datos

Mutate Y Transmute Para Transformación

R

Manipulación De Datos

Dplyr Para Filtrado Y Selección

R

Manipulación De Datos

Readr Y Read.csv Para Importar Datos

R

Manipulación De Datos

Gráficos Bivariantes En R

R

Visualización De Datos

Gráficos Univariantes En R

R

Visualización De Datos

Facetas En Ggplot2

R

Visualización De Datos

Personalización Y Temas

R

Visualización De Datos

Ggplot2 Para Visualización De Datos

R

Visualización De Datos

Gráficos Multivariantes En R

R

Visualización De Datos

Correlación En R

R

Estadística

Regresión Lineal En R

R

Estadística

Pruebas De Hipótesis En R

R

Estadística

Anova En R

R

Estadística

Estadística Descriptiva En R

R

Estadística

Accede GRATIS a R y certifícate

En esta lección

Objetivos de aprendizaje de esta lección

  • Comprender los conceptos y diferencias entre los coeficientes de correlación de Pearson, Spearman y Kendall.
  • Aprender a calcular y probar la significancia estadística de correlaciones en R.
  • Crear y visualizar matrices de correlación para múltiples variables usando diferentes métodos y paquetes.
  • Interpretar correctamente los coeficientes de correlación y su relevancia estadística, considerando aspectos prácticos como tamaño de muestra y valores atípicos.
  • Reconocer la importancia de la correlación parcial y las limitaciones de la correlación, especialmente la no implicación de causalidad.