El análisis de correlación es una técnica estadística que se utiliza para medir y describir la relación lineal entre dos variables numéricas continuas. A diferencia de otras pruebas estadísticas donde una variable es categórica (como en la prueba t o ANOVA), en la correlación ambas variables son de medición continua.
La correlación puede clasificarse según su dirección y su fuerza:
Es fundamental entender que dos variables pueden estar correlacionadas sin que una cause la otra. Por ejemplo:
El coeficiente de correlación de Pearson (denotado como \(r\)) es la medida más común de la fuerza y dirección de la relación lineal entre dos variables.
El coeficiente de correlación de Pearson se calcula de la siguiente manera:
\[r = \frac{\sum (X_i - \bar{X})(Y_i - \bar{Y})}{\sqrt{\sum (X_i - \bar{X})^2 \sum (Y_i - \bar{Y})^2}}\]
Donde:
Para que el análisis de correlación de Pearson sea válido, deben cumplirse los siguientes supuestos:
Vamos a analizar la relación entre la masa (en gramos) y la longitud (en milímetros) de semillas de Thespesia populnea, un árbol tropical costero.
Pregunta de investigación: Según la teoría alométrica, ¿existirá una relación lineal entre el tamaño (longitud) de las semillas y su masa?
Utilizaremos el conjunto de datos
semilla_thepol-masa-long.csv, que contiene mediciones de
masa y longitud de semillas, realizadas en el laboratorio de Ecología
Poblacional en la UPRH.
# Cargar los datos
thespe <- read.csv("semilla_thepol-masa-long.csv")
# Ver las primeras filas
head(thespe)## Tamaño de la muestra (n): 487
A continuación se presentan las estadísticas descriptivas básicas de
las variables masa_g y long_mm.
library(gt)
# tabla gt
tabla_desc <- gt(data.frame(
Estadístico = c("Media", "Desviación Estándar"),
Masa_g = c(round(mean(thespe$masa_g), 4), round(sd(thespe$masa_g), 4)),
Long_mm = c(round(mean(thespe$long_mm), 4), round(sd(thespe$long_mm), 4))
)) %>%
tab_header(
title = "Estadísticas Descriptivas",
subtitle = "Masa y Longitud de Semillas de Thespesia populnea"
) %>%
tab_style(
style = cell_text(weight = "bold"),
locations = cells_column_labels()
)
tabla_desc| Estadísticas Descriptivas | ||
| Masa y Longitud de Semillas de Thespesia populnea | ||
| Estadístico | Masa_g | Long_mm |
|---|---|---|
| Media | 0.2244 | 10.1476 |
| Desviación Estándar | 0.0522 | 1.5966 |
Antes de calcular cualquier estadístico, es fundamental visualizar los datos con un diagrama de dispersión (scatter plot). Además, incluiremos una elipse de confianza al 95% que nos ayuda a:
library(ggplot2)
# Calcular r para anotación
r_value <- cor(thespe$masa_g, thespe$long_mm)
ggplot(thespe, aes(x = masa_g, y = long_mm)) +
# Elipse de confianza al 95%
stat_ellipse(level = 0.95,
geom = "polygon",
alpha = 0.15,
fill = "steelblue",
color = "steelblue",
linewidth = 1.2) +
# Puntos de datos
geom_point(alpha = 0.6, color = "steelblue", size = 2.5) +
# Anotación con el valor de r
annotate("text",
x = max(thespe$masa_g) * 0.9,
y = min(thespe$long_mm) * 1.1,
label = paste("r =", round(r_value, 3)),
size = 5,
fontface = "bold",
color = "darkred") +
labs(
x = "Masa (g)",
y = "Longitud (mm)"
) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
plot.subtitle = element_text(hjust = 0.5, size = 10, color = "gray40"),
plot.caption = element_text(size = 8, color = "gray50", hjust = 0)
)FIGURA 1. Diagrama de dispersión de masa vs. longitud de semillas con elipse de confianza al 95%.
Interpretación visual:
Para entender mejor cómo funciona el coeficiente de Pearson, vamos a calcularlo manualmente paso a paso:
# Paso 1: Calcular las medias de ambas variables
mean_masa <- mean(thespe$masa_g)
mean_long <- mean(thespe$long_mm)
cat("Media de masa:", round(mean_masa, 4), "g\n")## Media de masa: 0.2244 g
## Media de longitud: 10.1476 mm
# Paso 2: Calcular el numerador (covarianza)
numerador <- sum((thespe$masa_g - mean_masa) * (thespe$long_mm - mean_long))
cat("Numerador (covarianza):", round(numerador, 4), "\n\n")## Numerador (covarianza): 17.1597
# Paso 3: Calcular el denominador
sum_sq_masa <- sum((thespe$masa_g - mean_masa)^2)
sum_sq_long <- sum((thespe$long_mm - mean_long)^2)
denominador <- sqrt(sum_sq_masa * sum_sq_long)
cat("Denominador:", round(denominador, 4), "\n\n")## Denominador: 40.4768
# Paso 4: Calcular r
r_manual <- numerador / denominador
cat("Coeficiente de correlación de Pearson (r):", round(r_manual, 4), "\n")## Coeficiente de correlación de Pearson (r): 0.4239
tabla1 <- gt(data.frame(
Estadístico = "Coeficiente de Correlación (r)",
Valor = round(r_manual, 4)
)) %>%
tab_header(
title = "Coeficiente de Correlación de Pearson",
subtitle = "Masa vs. Longitud de Semillas"
) %>%
tab_style(
style = cell_text(weight = "bold"),
locations = cells_column_labels()
)
tabla1| Coeficiente de Correlación de Pearson | |
| Masa vs. Longitud de Semillas | |
| Estadístico | Valor |
|---|---|
| Coeficiente de Correlación (r) | 0.4239 |
Interpretación: El coeficiente \(r = 0.424\) indica una correlación positiva moderada entre la masa y la longitud de las semillas. Esto significa que, en general, las semillas más largas tienden a ser más pesadas.
cor() de RR proporciona funciones integradas que simplifican el cálculo:
# Calcular r con la función cor()
r_R <- cor(thespe$masa_g, thespe$long_mm)
cat("Coeficiente de Pearson con cor():", round(r_R, 4), "\n")## Coeficiente de Pearson con cor(): 0.4239
# Verificar que ambos métodos dan el mismo resultado
cat("¿Los resultados coinciden?", all.equal(r_manual, r_R), "\n")## ¿Los resultados coinciden? TRUE
Calcular el coeficiente de correlación es solo el primer paso. Ahora debemos determinar si este valor es estadísticamente significativo. Es decir, ¿es probable que este valor de \(r\) haya ocurrido por azar si en realidad no existe correlación en la población?
Usaremos \(\alpha = 0.05\) como nivel de significancia estándar.
Una forma de evaluar la significancia es comparar nuestro \(r\) calculado con un valor crítico de \(r\). Si \(|r_{calculado}| > r_{crítico}\), rechazamos la hipótesis nula.
El valor crítico de \(r\) se deriva de la distribución t de Student. La relación es:
\[ t = \frac{r\sqrt{n-2}}{\sqrt{1-r^2}}\]
Y podemos invertir esta fórmula para obtener el valor crítico de \(r\):
\[ r\_{crítico} = \sqrt{\frac{t_{crítico}^2}{t_{crítico}^2 + (n-2)}} \]
# Función para calcular el valor crítico de r
critical_r <- function(n, alpha = 0.05, tails = 2) {
# Grados de libertad
df <- n - 2
# Valor crítico de t
prob <- 1 - (alpha / tails)
critical_t <- qt(prob, df)
# Convertir t crítico a r crítico
critical_r_value <- sqrt(critical_t^2 / (critical_t^2 + df))
return(critical_r_value)
}
# Calcular el valor crítico para nuestros datos
r_critico <- critical_r(n = n, alpha = 0.05, tails = 2)
cat("Tamaño de muestra (n):", n, "\n")## Tamaño de muestra (n): 487
## Grados de libertad (n-2): 485
## Nivel de significancia (α): 0.05
## Valor crítico de r: 0.0889
## r calculado: 0.4239
## |r calculado| > r crítico: TRUE
if (abs(r_manual) > r_critico) {
cat("CONCLUSIÓN: Rechazamos H₀. La correlación es estadísticamente significativa.\n")
} else {
cat("CONCLUSIÓN: No rechazamos H₀. La correlación no es estadísticamente significativa.\n")
}## CONCLUSIÓN: Rechazamos H₀. La correlación es estadísticamente significativa.
tabla_critica <- gt(data.frame(
Parámetro = c("Tamaño de muestra (n)",
"Grados de libertad (df)",
"Nivel α",
"Valor crítico de r",
"r calculado",
"|r| > r crítico"),
Valor = c(n,
n - 2,
0.05,
round(r_critico, 4),
round(r_manual, 4),
ifelse(abs(r_manual) > r_critico, "SÍ ✓", "NO ✗"))
)) %>%
tab_header(
title = "Evaluación de Significancia",
subtitle = "Comparación con Valor Crítico"
) %>%
tab_style(
style = cell_text(weight = "bold"),
locations = cells_body(rows = 6)
)
tabla_critica| Evaluación de Significancia | |
| Comparación con Valor Crítico | |
| Parámetro | Valor |
|---|---|
| Tamaño de muestra (n) | 487 |
| Grados de libertad (df) | 485 |
| Nivel α | 0.05 |
| Valor crítico de r | 0.0889 |
| r calculado | 0.4239 |
| |r| > r crítico | SÍ ✓ |
cor.test()R proporciona la función cor.test() que realiza
automáticamente la prueba de hipótesis y calcula el valor p:
# Realizar la prueba de correlación
test_resultado <- cor.test(thespe$masa_g, thespe$long_mm)
# Mostrar resultados completos
print(test_resultado)##
## Pearson's product-moment correlation
##
## data: thespe$masa_g and thespe$long_mm
## t = 10.308, df = 485, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.3482011 0.4941783
## sample estimates:
## cor
## 0.4239391
# Extraer información clave
r_valor <- test_resultado$estimate
p_valor <- test_resultado$p.value
ic_inferior <- test_resultado$conf.int[1]
ic_superior <- test_resultado$conf.int[2]
estadistico_t <- test_resultado$statistic
cat("\n=== RESUMEN DE RESULTADOS ===\n\n")##
## === RESUMEN DE RESULTADOS ===
## Coeficiente de correlación (r): 0.4239
## Estadístico t: 10.3085
## Valor p: 1.156e-22
## Intervalo de confianza 95%: [ 0.3482 , 0.4942 ]
if (p_valor < 0.05) {
cat("DECISIÓN: Como p < 0.05, rechazamos H₀.\n")
cat("CONCLUSIÓN: Existe evidencia estadística significativa de una correlación\n")
cat(" positiva entre la masa y la longitud de las semillas.\n")
} else {
cat("DECISIÓN: Como p ≥ 0.05, no rechazamos H₀.\n")
cat("CONCLUSIÓN: No hay evidencia suficiente de correlación significativa.\n")
}## DECISIÓN: Como p < 0.05, rechazamos H₀.
## CONCLUSIÓN: Existe evidencia estadística significativa de una correlación
## positiva entre la masa y la longitud de las semillas.
tabla_final <- gt(data.frame(
Estadístico = c("Coeficiente de Correlación (r)",
"Estadístico t",
"Grados de libertad",
"Valor p",
"IC 95% - Límite inferior",
"IC 95% - Límite superior"),
Valor = c(round(r_valor, 4),
round(estadistico_t, 4),
n - 2,
format(p_valor, scientific = TRUE, digits = 4),
round(ic_inferior, 4),
round(ic_superior, 4))
)) %>%
tab_header(
title = "Resultados de la Prueba de Correlación de Pearson",
subtitle = "Masa vs. Longitud de Semillas de Thespesia populnea"
) %>%
tab_style(
style = cell_text(weight = "bold"),
locations = cells_column_labels()
) %>%
tab_style(
style = cell_fill(color = "lightblue"),
locations = cells_body(rows = c(1, 4))
)
tabla_final| Resultados de la Prueba de Correlación de Pearson | |
| Masa vs. Longitud de Semillas de Thespesia populnea | |
| Estadístico | Valor |
|---|---|
| Coeficiente de Correlación (r) | 0.4239 |
| Estadístico t | 10.3085 |
| Grados de libertad | 485 |
| Valor p | 1.156e-22 |
| IC 95% - Límite inferior | 0.3482 |
| IC 95% - Límite superior | 0.4942 |
El coeficiente de correlación de Spearman (\(\rho_s\) o \(r_s\)) es una alternativa no paramétrica que se utiliza cuando:
Spearman funciona convirtiendo los valores de cada variable en rangos y luego calculando la correlación de Pearson sobre esos rangos.
# Correlación de Spearman
cor_spearman <- cor(thespe$masa_g, thespe$long_mm, method = "spearman")
cat("Correlación de Spearman:", round(cor_spearman, 4), "\n")## Correlación de Spearman: 0.4285
## Correlación de Pearson: 0.4239
# Prueba de significancia
test_spearman <- cor.test(thespe$masa_g, thespe$long_mm, method = "spearman")
print(test_spearman)##
## Spearman's rank correlation rho
##
## data: thespe$masa_g and thespe$long_mm
## S = 11000535, p-value < 2.2e-16
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
## rho
## 0.4285477
comparacion <- data.frame(
Método = c("Pearson", "Spearman"),
Coeficiente = c(round(r_manual, 4), round(cor_spearman, 4)),
Valor_p = c(format(test_resultado$p.value, scientific = TRUE, digits = 3),
format(test_spearman$p.value, scientific = TRUE, digits = 3)),
Tipo = c("Paramétrico", "No paramétrico"),
Supuestos = c("Normalidad, linealidad", "Relación monotónica")
)
gt(comparacion) %>%
tab_header(
title = "Comparación de Métodos de Correlación",
subtitle = "Datos de Semillas de Thespesia populnea"
) %>%
tab_style(
style = cell_text(weight = "bold"),
locations = cells_column_labels()
)| Comparación de Métodos de Correlación | ||||
| Datos de Semillas de Thespesia populnea | ||||
| Método | Coeficiente | Valor_p | Tipo | Supuestos |
|---|---|---|---|---|
| Pearson | 0.4239 | 1.16e-22 | Paramétrico | Normalidad, linealidad |
| Spearman | 0.4285 | 3.57e-23 | No paramétrico | Relación monotónica |
El análisis de correlación múltiple es una técnica estadística que se utiliza para medir y describir la relación entre más de dos variables. En el análisis de correlación múltiple, se calculan los coeficientes de correlación entre cada par de variables y se analiza la fuerza y dirección de las relaciones.
Utilizaremos los datos de mortalidad y variables relacionadas a la salud en ciudades pequeñas de Estados Unidos. Los datos contienen información sobre:
death1k: Tasa de mortalidad por 1000 habitantes.doctor100k: Número de médicos por 100000
habitantes.hospital100k: Número de camas de hospitales por 100000
habitantes.income1k: Ingreso per cápita en miles de dólares.density: Densidad de población por milla cuadrada.Tabla 4. Matriz de Correlación entre las variables de mortalidad y salud en ciudades pequeñas de Estados Unidos.
## death1K doctor100K hosp100K income1K density
## death1K 1.0000000 0.11576504 0.11059019 -0.17199239 -0.27760696
## doctor100K 0.1157650 1.00000000 0.29562836 0.43328796 -0.01993791
## hosp100K 0.1105902 0.29562836 1.00000000 0.02750354 0.18661628
## income1K -0.1719924 0.43328796 0.02750354 1.00000000 0.12874370
## density -0.2776070 -0.01993791 0.18661628 0.12874370 1.00000000
Significancia (valor p) de la correlación entre las variables:
library(Hmisc)
# Calculate correlation matrix and p-values
corr_results <- rcorr(as.matrix(mortalidad))
p_values <- corr_results$P
p_values[is.na(p_values)] <- 0
corr_matrix <- corr_results$rTabla 5. Valores p de la correlación entre las variables de mortalidad y salud en ciudades pequeñas de Estados Unidos.
## death1K doctor100K hosp100K income1K density
## death1K 0.0000000 0.409106839 0.43050181 0.218148006 0.0441603
## doctor100K 0.4091068 0.000000000 0.03162022 0.001191857 0.8873146
## hosp100K 0.4305018 0.031620223 0.00000000 0.845008435 0.1809032
## income1K 0.2181480 0.001191857 0.84500843 0.000000000 0.3582262
## density 0.0441603 0.887314572 0.18090320 0.358226239 0.0000000
# using corrplot package
library(corrplot)
# Plot the correlation matrix with significance levels
corrplot(corr_matrix, method = "color", type = "upper", tl.col = "black",
tl.srt = 45, p.mat = p_values, sig.level = 0.05, cl.pos = "r", na.label = "NS")FIGURA 2. Matriz de Correlación entre las variables de mortalidad y salud en ciudades pequeñas de Estados Unidos. Los colores indican el valor y signo del coeficiente de correlación de Pearson. La X indica que la correlación no es significativa, para un nivel de significancia de 0.05.
La correlación mide asociación, no causalidad: Dos variables pueden estar correlacionadas sin que una cause la otra.
Visualizar siempre primero: Un diagrama de dispersión es esencial para identificar patrones, valores atípicos y verificar la linealidad.
Verificar supuestos: El coeficiente de Pearson requiere normalidad bivariada y relación lineal. Si no se cumplen, usar Spearman.
Significancia estadística: Un valor de \(r\) puede ser grande pero no significativo si la muestra es pequeña, o pequeño pero significativo si la muestra es grande.
Interpretación contextual: Siempre interpretar los resultados en el contexto del problema y considerar variables de confusión.
| Guía para Elegir el Método de Correlación Apropiado | |
| Situación | Método_Recomendado |
|---|---|
| Ambas variables continuas, relación lineal, datos normales | Pearson |
| Relación monotónica pero no lineal | Spearman |
| Presencia de valores atípicos extremos | Spearman |
| Variables ordinales (rangos) | Spearman |
| Datos no cumplen normalidad | Spearman |
Ejercicio 1: Utilizando el conjunto de datos
death_small_cities.xlsx, analiza la correlación entre:
income1K) y disponibilidad de
hospitales (hosp100K)Ejercicio 2: Carga un conjunto de datos de tu elección que contenga al menos dos variables numéricas continuas. Realiza un análisis completo de correlación entre estas variables, incluyendo:
Ejercicio 3: Calcula el valor crítico de \(r\) para una muestra de \(n = 15\) con \(\alpha = 0.01\) (dos colas). ¿Qué valor de \(r\) calculado sería necesario para rechazar \(H_0\)?
Ejercicio 4: Compara las correlaciones de
Pearson y Spearman para las variables income1K y
density del conjunto de datos de ciudades. ¿Hay diferencias
notables?