Estadística bivariada en R: Covarianza y Correlación

Fecha de publicación

18 de abril de 2026

Librerías

library(ltm)
library(psych)

Covarianza

x <- c(17.269, 17.18, 15.252, 15.01, 13.679, 13.766, 13.546, 
       15.035, 15.432, 16.501, 15.2, 17.355, 15.548, 18.708, 
       15.474, 16.392, 16.06, 13.424, 11.721, 16.414)

y <- c(10.361, 8.934, 8.541, 8.105, 8.207, 7.434, 7.315, 8.72, 
       8.025, 8.911, 8.816, 8.678, 8.085, 9.728, 9.284, 9.507, 
       8.351, 8.054, 6.798, 8.207)

cov(x, y)
[1] 1.120312

Correlación de Pearson

¿Son normales mis datos?

x <- c(17.269, 17.18, 15.252, 15.01, 13.679, 13.766, 13.546, 
       15.035, 15.432, 16.501, 15.2, 17.355, 15.548, 18.708, 
       15.474, 16.392, 16.06, 13.424, 11.721, 16.414)

y <- c(10.361, 8.934, 8.541, 8.105, 8.207, 7.434, 7.315, 8.72, 
       8.025, 8.911, 8.816, 8.678, 8.085, 9.728, 9.284, 9.507, 
       8.351, 8.054, 6.798, 8.207)

Observemos esto mediante un histograma

hist(x, breaks = 4, 
     main = "Variable x")

hist(y, breaks = 5, 
     main = "Variable y")

Dado que parece seguir la forma acampanada, podemos continuar.

Gráfico de dispersión

plot(x, y)
mod <- lm(y~x)
abline(mod) # linea de tendencia

Cálculo de la correlación de Pearson

cor(x, y, method = "pearson")
[1] 0.8032937

Correlación de Spearman

Continuaremos con el ejemplo anterior, pues lo que buscamos es ejemplificar su uso en R

cor(x, y, method = "spearman")
[1] 0.7423844

Dato curioso: Notará, si lo compara con el ejercicio resuelto en Excel, que los resultados son ligeramente diferentes. Esto es normal, en R la función programada para el método de Spearman sigue los siguientes pasos. Dado que puede haber empates, se dice que hacerlo de esta manera es más robusto.

# Obtener rangos de las variables numéricas

rx <- rank(x)
ry <- rank(y)

rx; ry
 [1] 18 17  9  6  4  5  3  7 10 16  8 19 12 20 11 14 13  2  1 15
 [1] 20.0 16.0 11.0  7.0  8.5  3.0  2.0 13.0  4.0 15.0 14.0 12.0  6.0 19.0 17.0
[16] 18.0 10.0  5.0  1.0  8.5
# se calcula la correlación de Pearson con los rangos de X y Y

cor(rx, ry) # note como da el mismo resultado
[1] 0.7423844

Correlación de Kendall

cor(x, y, method = "kendall")
[1] 0.5751999

Correlación punto biserial

Aquí vamos a cambiar de conjunto de datos, la cantidad de tiempo de secado y la relación entre piezas buenas y malas.

cont <- c(2, 3, 16, 17, 5, 6, 14, 7, 15, 8, 9, 
          10, 11, 12, 13, 18, 19, 20, 21, 22)

dicot <- factor(c(0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1), 
                levels = c(1, 0))

ltm::biserial.cor(cont, dicot)
[1] 0.3133537

Correlación biserial

La variable dicotómica se desprende de la variable continua “Notas”. Se quiere estudiar la relación entre las horas de estudio mensuales y el resultado en el curso (aprobado:1 o reprobado:0)

horas <- c(26.277, 24.612, 20.112, 30.408, 24.796, 31.698, 31.45, 
           27.132, 23.164, 25.31, 26.362, 26.32, 19.574, 29.382, 
           33.806, 29.202, 26.518, 30.387, 31.962, 30.255, 17.852, 
           21.119, 34.357, 25.554, 20.482, 27.247, 25.133, 18.208, 
           25.189, 24.843)

resultado <- c(1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 
               1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1)

psych::biserial(horas, resultado)
          [,1]
[1,] 0.9780837

Coeficiente \(\phi\)

Aquí ambas variables deben ser dicotómicas

x <- c(1, 0, 1, 1, 0, 1, 0, 0, 1, 0)
y <- c(0, 1, 1, 1, 0, 1, 0, 0, 1, 0)

Con esto, ya podemos calcular el coeficiente

psych::phi(table(x, y))
[1] 0.6

Correlación tetracórica

Para el ejemplo, usemos el conjunto de datos anterior.

psych::tetrachoric(table(x, y))
Call: psych::tetrachoric(x = table(x, y))
tetrachoric correlation 
[1] 0.81

 with tau of 
0 0 
0 0 

Correlación policórica

Son las respuestas a dos preguntas en escala 1-5

p1 <- c(5, 4, 1, 3, 3, 2, 4, 5, 2, 2, 2, 5, 5, 4, 4, 
        5, 3, 3, 3, 5, 2, 5, 4, 5, 1, 2, 2, 1, 1, 2)

p2 <- c(4, 3, 2, 2, 2, 1, 4, 5, 2, 2, 1, 5, 4, 4, 3, 
        5, 4, 3, 3, 4, 5, 5, 4, 5, 1, 3, 3, 1, 2, 3)

psych::polychoric(data.frame(p1, p2)) # el valor es 0.84
Call: psych::polychoric(x = data.frame(p1, p2))
Polychoric correlations 
   p1   p2  
p1 1.00     
p2 0.84 1.00

 with tau of 
      1     2    3    4
p1 -1.1 -0.25 0.17 0.62
p2 -1.1 -0.43 0.17 0.84