Correlación entre dos variables: cor()
La correlación pregunta: cuando una variable sube, ¿la otra tiende a subir también (positiva), a bajar (negativa) o va a lo suyo (cerca de cero)? En R eso es una llamada:
La respuesta es aproximadamente −0.87: los coches más pesados consumen más, y la relación es fuerte. Ese único número es el coeficiente de correlación de Pearson, escrito universalmente como r.
Cómo leer r
El coeficiente siempre cae entre −1 y +1. El signo da la dirección; la magnitud da la fuerza:
| |r| | Lectura típica | | --- | --- | | 0.0 – 0.2 | insignificante | | 0.2 – 0.4 | débil | | 0.4 – 0.6 | moderada | | 0.6 – 0.8 | fuerte | | 0.8 – 1.0 | muy fuerte |
Trata estas bandas como puntos de partida para la conversación, no como ley - en física un r de 0.6 es decepcionante, en psicología es el hito de una carrera. Dos propiedades que vale la pena interiorizar: r no tiene unidades (correlacionar el peso en toneladas con las mpg da el mismo r que el peso en kilogramos con las mpg, porque r se calcula sobre valores estandarizados), y r solo mide asociación lineal - una relación perfecta en forma de U puede tener r ≈ 0.
Y la frase que hay que decir: correlación no es causalidad. Las ventas de helado y las muertes por ahogamiento correlacionan fuertemente a lo largo de los meses del año - no porque el helado ahogue a la gente, sino porque el verano impulsa ambas cosas. Una correlación te dice que dos variables se mueven juntas; guarda silencio sobre el porqué. Quizá x impulsa a y, quizá y impulsa a x, quizá una tercera cosa (la estación, en este caso) impulsa a ambas. Decidir entre esas opciones requiere experimentos o un razonamiento causal cuidadoso, no un r más grande.
Spearman y Kendall: cuando Pearson es la herramienta equivocada
Pearson trabaja sobre los valores en bruto, lo que lo hace sensible a los valores atípicos y ciego a las relaciones curvas. El argumento method cambia a las alternativas basadas en rangos:
Spearman sustituye cada valor por su rango y después calcula Pearson sobre los rangos. Como y siempre crece cuando x crece, todos los rangos se alinean y Spearman reporta exactamente 1 - el tamaño del valor atípico deja de importar, solo su posición. Recurre a Spearman cuando los datos son ordinales (escalas de encuesta), están muy sesgados, o cuando la relación es monótona pero no recta. Kendall responde a una pregunta similar a partir de pares concordantes/discordantes; es más robusto en muestras pequeñas pero más lento, y Spearman es el estándar habitual.
La matriz de correlación
Para escanear las relaciones entre muchas variables a la vez, pásale a cor() varias columnas numéricas:
Cada variable contra todas las demás, con unos en la diagonal (todo correlaciona perfectamente consigo mismo) y una imagen especular a través de ella. Redondear a dos decimales importa más de lo que parece - la matriz sin redondear es un muro de dígitos, y el sentido de una matriz es poder escanearla. Aquí el escaneo muestra que mpg correlaciona negativamente con las tres (los coches más pesados, más potentes y con motores más grandes queman más combustible), mientras que wt, hp y disp son todas fuertemente positivas entre sí - un clúster de variables de "coche grande" que importará cuando llegues a la regresión lineal y sus dolores de cabeza por multicolinealidad.
Valores faltantes: el argumento use
Con datos faltantes, el comportamiento por defecto de cor() es devolver NA en vez de adivinar:
use = "complete.obs"descarta todas las filas que contengan cualquierNAy después calcula toda la matriz con las supervivientes. Consistente, pero derrochador - unwtfaltante también elimina esa fila del parmpg–hp.use = "pairwise.complete.obs"calcula cada celda a partir de todas las filas en las que ese par está presente. Conserva más datos, pero cada celda descansa sobre subconjuntos distintos, lo que muy ocasionalmente puede producir una matriz que no es internamente consistente.
Para un par de NAs sueltos cualquiera de las dos vale; simplemente indica cuál usaste.
¿Es significativa? cor.test()
cor() da un número pero ninguna idea de si podría ser ruido. cor.test() ejecuta el contraste de hipótesis:
Recorre la salida bloque a bloque:
- t = −9.56, df = 30 - el estadístico del contraste. La hipótesis nula es que la correlación verdadera es cero; el r observado se convierte en un estadístico t con n − 2 grados de libertad (32 coches − 2).
- p-value = 1.29e-10 - si la correlación verdadera fuera cero, la probabilidad de ver un r tan lejos de cero en una muestra de 32 es de aproximadamente 0.0000000001. Es una evidencia abrumadora de que la asociación es real - aunque recuerda que el valor p habla de si r difiere de cero, no de si la relación es grande o causal.
- 95 percent confidence interval: −0.93 a −0.74 - el rango plausible para la correlación verdadera. A menudo más útil que el valor p: incluso el extremo optimista de este intervalo es una correlación negativa fuerte.
- sample estimates: cor = −0.87 - el mismo número que te dio
cor().
Las muestras pequeñas merecen aquí un respeto extra: con n = 10, correlaciones de ±0.5 aparecen por pura suerte con una frecuencia alarmante, y el intervalo de confianza ancho te lo dirá. Reporta el intervalo, no solo el valor p.
Verlo: grafica siempre
Un coeficiente de correlación comprime toda una relación en un solo número, y la compresión puede ocultar curvatura, clústeres o un único punto haciendo todo el trabajo. Antes de fiarte de cualquier r, mira el diagrama de dispersión:
plot(mtcars$wt, mtcars$mpg) # one pair
pairs(mtcars[, c("mpg", "wt", "hp", "disp")]) # every pair in the matrix
pairs() dibuja una cuadrícula de diagramas de dispersión que corresponde a tu matriz de correlación - la forma más rápida de comprobar que los números significan lo que crees. Para gráficos de matriz pulidos al estilo de un mapa de calor, el paquete corrplot (install.packages("corrplot") y luego corrplot(cor(m))) es la herramienta estándar.
Lo que te llevas
cor(x, y)da el r de Pearson: el signo es la dirección, la magnitud es la fuerza, siempre en [−1, 1], sin unidades.- La correlación mide el co-movimiento lineal y no dice nada sobre causalidad - una tercera variable oculta siempre es candidata.
method = "spearman"para rangos: datos ordinales, valores atípicos, relaciones monótonas pero curvas.cor(df)sobre columnas numéricas da la matriz; aplícaleround(, 2)y presta atención al argumentouse =cuando falten datos.cor.test(x, y)añade el valor p y un intervalo de confianza - reporta el intervalo.- Mira siempre el diagrama de dispersión antes de creerte el número.
A continuación: cuando la pregunta se afina de "¿se mueven juntas?" a "¿es la media de este grupo distinta de la de aquel?" - el test t.
Preguntas frecuentes
¿Cómo se calcula la correlación en R?
cor(x, y) devuelve el coeficiente de correlación de Pearson entre dos vectores numéricos. Pasa en su lugar un data frame de columnas numéricas - cor(df) - para obtener la matriz de correlación completa. Para un valor p y un intervalo de confianza, usa cor.test(x, y).
¿Cómo se obtiene el valor p de una correlación en R?
cor() por sí sola no lo da - usa cor.test(x, y). Su salida incluye el estadístico t, los grados de libertad, el valor p para la hipótesis nula de que la correlación verdadera es cero, un intervalo de confianza del 95% y el coeficiente estimado.
¿Cuál es la diferencia entre la correlación de Pearson y la de Spearman?
Pearson (la opción por defecto) mide la asociación lineal sobre los valores en bruto. Spearman primero convierte los valores en rangos, así que mide si la relación es consistentemente creciente o decreciente (monótona), y es mucho menos sensible a los valores atípicos. Usa cor(x, y, method = "spearman") para datos ordinales, datos sesgados o relaciones curvas pero monótonas.
¿Cómo se manejan los valores NA en cor()?
Por defecto cor() devuelve NA si falta algún valor. Pasa use = "complete.obs" para descartar primero las filas con algún valor faltante, o use = "pairwise.complete.obs" en una matriz para usar, en cada par de variables, todas las filas donde ambas están presentes.