logo

Introducción

El Análisis de Correlación Canónica (CCA, por sus siglas en inglés) es una técnica estadística multivariada diseñada para explorar las relaciones entre dos conjuntos de variables. A diferencia de métodos como la regresión simple o múltiple, que examinan la relación entre variables dependientes e independientes, el CCA analiza simultáneamente múltiples variables de ambos conjuntos para identificar combinaciones lineales (variables canónicas) que maximicen la correlación entre los grupos. Este enfoque permite comprender relaciones complejas y multidimensionales entre conjuntos de variables, proporcionando una visión más integrada de los datos.

En diferentes campos del conocimiento, surge la necesidad de analizar estas relaciones. Por ejemplo, en Economía, se busca establecer vínculos entre variables como el consumo agregado, el producto interno bruto y la inversión bruta con otras como el gasto público, la oferta monetaria y las tasas de interés a corto plazo. En Medicina, el interés puede centrarse en cómo los estilos de vida y hábitos alimenticios influyen en la salud, medida a través de variables como hipertensión, peso, ansiedad y niveles de estrés. En Mercadeo, es común explorar la relación entre características como tamaño, precio por marca y punto de venta con el volumen de ventas y la frecuencia de compra. Estos ejemplos destacan el amplio rango de aplicaciones del CCA en la comprensión de relaciones complejas entre variables en diversos contextos.

¿Cómo funciona el DA?

No entraremos en la explicación matemática de sus fundamentos, que puede ser algo compleja. Sin embargo, comprender los cinco pasos siguientes puede dar una mejor idea de cómo funciona DA.

Paso 1. Preparación de los datos:

Antes de comenzar, es importante evaluar si los datos son adecuados para un CCA. Es decir, comprobar si existen dos conjuntos de variables multivariadas y que el objetivo de la investigación sea corroborar su relación. Estas variables deben ser relevantes para el contexto del problema que se está analizando:

  • Conjunto X: Variables del primer grupo (independientes o predictoras).
  • Conjunto Y: Variables del segundo grupo (dependientes o resultados).

Es fundamental asegurarse de que los conjuntos tengan un tamaño suficiente para obtener resultados estadísticamente significativos. Además, los nombres de las variables deben ser claros y estar relacionados con el contexto.

Paso 2. Validación de los supuestos iniciales:

Debemos verificar que haya correlaciones significativas entre los dos conjuntos de variables. Si no existe ninguna relación entre \(X\) e \(Y\), el CCA no será útil.

Si las correlaciones son débiles (cercanas a 0), es poco probable que el CCA sea útil. Además, la matriz de correlación no debe mostrar valores extremadamente altos dentro de cada conjunto, ya que esto podría indicar problemas de multicolinealidad. Las matrices de correlación, se pueden calcular por medio de la función matcor(), de la librería CCA.

Por otra parte, las variables deberían tener una distribución cercana a la normalidad multivariada en cada grupo (aunque el CCA es robusto a pequeños desvíos).

Paso 3. Construcción del método:

En este paso se desarrolla el modelo matemático que maximiza la correlación entre los conjuntos \(X\) e \(Y\).

Variables canónicas:

  • Para \(X:\) \(\quad U=a_1X_1+a_2X2+\dots+a_pX_p\)
  • Para \(Y:\) \(\quad V=b_1Y_1+b_2Y_2+\dots+b_qY_q\)

Este paso es fundamental porque traduce los datos originales en combinaciones lineales óptimas, facilitando la interpretación de relaciones complejas. Con ayuda de la función cc(), también de la librería CCA, podemos desarrollar el CCA.

Paso 4. Correlaciones significativas:

Evaluamos cuáles de las correlaciones canónicas identificadas son estadísticamente significativas y relevantes para el análisis. Esto nos ayuda a determinar cuántos pares de variables canónicas debemos interpretar y considerar.

Para identificar cuales son significativas, se pueden seguir varios procesos:

  1. Evaluación mediante p-value: El paquete CCP ofrece una función llamada p.asym(), que evalúa la significancia de cada correlación canónica utilizando una prueba basada en distribuciones asintóticas.

  2. Evaluación mediante valores propios: Los valores propios están relacionados con las correlaciones canónicas y reflejan la proporción de la relación explicada por cada par. Se puede definir un umbral de relevancia para decidir qué pares interpretar.

Paso 5. Interpretación de resultados:

En este paso, interpretamos los resultados y visualizamos la relación entre las variables canónicas:

  • Correlaciones canónicas: Indican la fuerza de la relación entre cada par de variables canónicas. Valores cercanos a 1 representan relaciones fuertes.
  • Coeficientes canónicos: Identifican las variables originales que contribuyen más a las combinaciones lineales.
  • Visualización: Graficar cada par \((U_i, V_i)\) es útil para observar patrones o relaciones entre los conjuntos. Con ayuda de la función plot.cc(), podemos hacer la gráfica donde se puede explorar estas relaciones.

Ejemplo 1

Trabajaremos con la base de datos Gimnasio, la cual pueden descargar de la plataforma de Moodle. Esta base de datos tiene un total de 20 personas que practican deporte en un gimnasio, sobre las cuales se han medido 6 variables que se pueden agrupar en dos grupos claramente diferenciados. Se miden tres variables fisiológicas (peso, altura y pulso) y tres variables relacionadas con el deporte (flexiones, sentadillas y saltos). Se desea determinar si las variables fisiológicas tienen alguna relación con las variables deportivas.

Solución paso a paso:

Paso 1

Preparación de los datos:

# Cargamos los datos
data1 <- read.csv("Gimnasio.csv")
head(data1)
Observaciones Peso Cintura Pulso Flexiones Sentadillas Saltos
1 191 36 50 5 162 60
2 189 37 52 2 110 60
3 193 38 58 12 101 101
4 162 35 62 12 105 37
5 189 35 46 13 155 58
6 182 36 56 4 101 42
# Definir conjuntos X e Y
X   <- data1[,(2:4)]
Y   <- data1[,(5:7)]

# Escalar los datos para dar igual importancia a todas las variables
X <- scale(X)
Y <- scale(Y)

Paso 2

Validación de los supuestos iniciales:

library(CCA)
matcor(X,Y)$XYcor
Peso Cintura Pulso Flexiones Sentadillas Saltos
Peso 1.0000000 0.8702435 -0.3657620 -0.3896937 -0.4930836 -0.2262956
Cintura 0.8702435 1.0000000 -0.3528921 -0.5522321 -0.6455980 -0.1914994
Pulso -0.3657620 -0.3528921 1.0000000 0.1506480 0.2250381 0.0349331
Flexiones -0.3896937 -0.5522321 0.1506480 1.0000000 0.6957274 0.4957602
Sentadillas -0.4930836 -0.6455980 0.2250381 0.6957274 1.0000000 0.6692061
Saltos -0.2262956 -0.1914994 0.0349331 0.4957602 0.6692061 1.0000000

También es importante revisar la normalidad multivariada para cada grupo.

library(MVN)

# Normalidad multivariada para X
mvn(data = as.data.frame(X), univariateTest = "SW")$univariateNormality
Test Variable Statistic p value Normality
Shapiro-Wilk Peso 0.9394 0.2339 YES
Shapiro-Wilk Cintura 0.8386 0.0035 NO
Shapiro-Wilk Pulso 0.9424 0.2660 YES
mvn(data = as.data.frame(X), mvnTest = "hz")$multivariateNormality
Test HZ p value MVN
Henze-Zirkler 0.9469159 0.0142206 NO
# Normalidad multivariada para Y
mvn(data = as.data.frame(Y), univariateTest = "SW")$univariateNormality
Test Variable Statistic p value Normality
Shapiro-Wilk Flexiones 0.9192 0.0955 YES
Shapiro-Wilk Sentadillas 0.9193 0.0959 YES
Shapiro-Wilk Saltos 0.7262 0.0001 NO
mvn(data = as.data.frame(Y), mvnTest = "hz")$multivariateNormality
Test HZ p value MVN
Henze-Zirkler 0.796552 0.0697807 YES

Paso 3

Construcción del método:

cca1 <- cc(X,Y)

Los vectores canónicos son:

cca1[3:4]
## $xcoef
##                [,1]       [,2]       [,3]
## Peso     0.77539761  1.8843672 -0.1909822
## Cintura -1.57934657 -1.1806411  0.5060195
## Pulso    0.05912012  0.2311068  1.0507838
## 
## $ycoef
##                   [,1]       [,2]       [,3]
## Flexiones    0.3494969  0.3755436 -1.2965937
## Sentadillas  1.0540110 -0.1234905  1.2367934
## Saltos      -0.7164267 -1.0621670 -0.4188073

Estos coeficientes canónicos se interpretan de manera análoga a la interpretación de los coeficientes de regresión. Por ejemplo, el aumento de una unidad de la variable peso, conduce a un aumento de 0.7754 en el primera variable canónica, cuando todas las demás permanecen constantes. El aumento de una unidad de la variable saltos, conduce en una disminución de 1.0622 en la segunda variable canónica, cuando todas las demás permanecen constantes.

Paso 4

Correlaciones significativas:

Evaluamos qué correlaciones canónicas son estadísticamente significativas por los dos métodos vistos:

  • Prueba de significancia:
library(CCP)

p.asym(cca1$cor, nrow(X), ncol(X), ncol(Y))
## Wilks' Lambda, using F-approximation (Rao's F):
##               stat     approx df1      df2    p.value
## 1 to 3:  0.3503905 2.04823353   9 34.22293 0.06353094
## 2 to 3:  0.9547227 0.17578229   4 30.00000 0.94912025
## 3 to 3:  0.9947336 0.08470926   1 16.00000 0.77475327
  • Correlaciones canónicas:
cca1$cor
## [1] 0.79560815 0.20055604 0.07257029

Paso 5

Interpretación de resultados:

De los valores obtenidos podríamos concluir lo siguiente:

  • Significancia estadística \((p-value)\): la tabla de Wilks’ Lambda muestra la prueba de significancia para los pares de variables canónicas:
    • 1 to 3 \((p-value=0.0635)\): no es significativo a un nivel de \(0.05\).
    • 2 to 3 \((p-value=0.9491)\): no es significativo.
    • 3 to 3 \((p-value=0.7748)\): no es significativo.
  • Correlaciones canónicas: indican la fuerza de la relación entre las combinaciones lineales de \(X\) e \(Y\):
    • \((U_1,V_1)\): correlación fuerte (0.796).
    • \((U_2,V_2)\): correlación débil (0.201).
    • \((U_3,V_3)\): correlación muy débil (0.073).

El análisis sugiere que el primer par de variables canónicas \((U_1,V_1)\) tiene una correlación fuerte (0.796), aunque no alcanza significancia estadística \((p-value=0.0635)\). Los otros pares muestran correlaciones débiles y no son significativos. La falta de significancia limita el respaldo formal del modelo, pero el primer par podría ser relevante para investigaciones adicionales.

  • Visualización: podemos visualizar el primer par de variables canónicas \((U_1,V_1)\).
# Graficamos solo la primera pareja
plt.cc(cca1, var.label = TRUE, type = "b")

Existe una relación fuerte entre combinaciones lineales que involucran Cintura, Peso, y Sentadillas, lo que podría ser relevante para explicar patrones entre las características fisiológicas y el rendimiento.

Ejemplo 2:

En una empresa dedicada a la gestión del talento humano, se busca analizar la relación entre las características del entorno laboral y los indicadores de desempeño de los empleados. El objetivo es entender qué aspectos del entorno tienen mayor impacto en el desempeño, utilizando el Análisis de Correlación Canónica (CCA). La base de datos se denomina Talento y la puedes descargar de la plataforma de Moodle.

  • Factores del entorno laboral:
    1. Carga laboral \((X_1)\): número promedio de tareas asignadas por empleado.
    2. Horas de capacitación \((X_2)\): horas mensuales dedicadas a formación.
    3. Satisfacción laboral \((X_3)\): índice basado en encuestas internas (escala 1-10).
    4. Salario \((X_4)\): salario mensual en dólares.
    5. Relación con el supervisor \((X_5)\): índice de relación empleado-supervisor (escala 1-10).
  • Indicadores de desempeño: 1. Productividad \((Y_1)\): tareas completadas al mes (promedio por empleado). 2. Eficiencia \((Y_2)\): porcentaje de tareas completadas dentro del plazo. 3. Retención \((Y_3)\): probabilidad estimada de que un empleado permanezca en la empresa durante el próximo trimestre (escala 0-100).

Solución paso a paso:

Paso 1

Preparación de los datos:

# Cargar datos 
data2 <- read.csv("Talento.csv")

# Exploramos los datos
head(data2)
Carga_laboral Horas_capacitacion Satisfaccion_laboral Salario Relacion_supervisor Productividad Eficiencia Retencion
54.96714 12.92315 5.897663 2585.502 5.608358 40.62585 11.022167 18.036202
48.61736 17.89677 6.135940 2719.909 7.100937 41.85397 5.153533 63.438219
56.47689 18.28643 6.748972 3373.647 8.007866 30.34312 14.503337 23.578039
65.23030 15.98861 6.714639 3305.185 8.070471 45.38531 15.764052 5.962369
47.65847 19.19357 3.860598 2989.549 7.324902 27.31527 12.560825 0.000000
47.65863 22.02025 4.376884 3058.664 8.934275 28.39686 21.311705 55.331637

Separamos los conjuntos \(X\) e \(Y\) y reescalemos.

# Separar conjuntos X e Y
X <- data2[, c("Carga_laboral", "Horas_capacitacion", "Satisfaccion_laboral", "Salario", "Relacion_supervisor")]
Y <- data2[, c("Productividad", "Eficiencia", "Retencion")]

# Escalar X e Y
X <- scale(X)
head(X)
Carga_laboral Horas_capacitacion Satisfaccion_laboral Salario Relacion_supervisor
0.6612878 -1.5075203 0.2701243 -1.0585156 -1.4462530
-0.0378980 -0.4644692 0.4573422 -0.7544623 -0.5108161
0.8275283 -0.3827524 0.9390123 0.7244118 0.0575787
1.7913818 -0.8646416 0.9120367 0.5695389 0.0968150
-0.1434831 -0.1925095 -1.3304329 -0.1444876 -0.3704520
-0.1434651 0.4002922 -0.9247783 0.0118621 0.6381828
Y <- scale(Y)
head(Y)
Productividad Eficiencia Retencion
1.3516305 -0.0116238 -0.8444997
1.5363483 -0.9848868 0.9972464
-0.1949579 0.5656987 -0.6196935
2.0674847 0.7747774 -1.3342783
-0.6503677 0.2435495 -1.5761435
-0.4876893 1.6948085 0.6684005

Paso 2

Validación de los supuestos iniciales:

Revisamos la normalidad multivariada.

library(MVN)

# Normalidad multivariada para X
mvn(data = X, mvnTest = "mardia")$multivariateNormality
Test Statistic p value Result
Mardia Skewness 45.602580133211 0.108233875282905 YES
Mardia Kurtosis 0.747498618400891 0.454762636470143 YES
MVN NA NA YES
# Normalidad multivariada para Y
mvn(data = Y, mvnTest = "mardia")$multivariateNormality
Test Statistic p value Result
Mardia Skewness 6.01665141190651 0.8138623290072 YES
Mardia Kurtosis -0.0299708510260917 0.976090300234653 YES
MVN NA NA YES

Calculamos las correlaciones existentes entre los grupos de variables.

library(CCA)
matcor(X,Y)$XYcor
Carga_laboral Horas_capacitacion Satisfaccion_laboral Salario Relacion_supervisor Productividad Eficiencia Retencion
Carga_laboral 1.0000000 -0.1364222 0.1908399 -0.1702269 -0.1361873 0.7323423 -0.0232638 -0.1354543
Horas_capacitacion -0.1364222 1.0000000 -0.0366317 -0.0176128 0.1907743 -0.2055248 0.4693281 0.1377638
Satisfaccion_laboral 0.1908399 -0.0366317 1.0000000 -0.0002591 -0.1060813 0.1486645 -0.1148682 0.0527361
Salario -0.1702269 -0.0176128 -0.0002591 1.0000000 0.2142535 -0.0891251 0.0508948 -0.0381611
Relacion_supervisor -0.1361873 0.1907743 -0.1060813 0.2142535 1.0000000 -0.1838349 0.1813588 0.2020524
Productividad 0.7323423 -0.2055248 0.1486645 -0.0891251 -0.1838349 1.0000000 -0.1161155 -0.0647054
Eficiencia -0.0232638 0.4693281 -0.1148682 0.0508948 0.1813588 -0.1161155 1.0000000 -0.0355016
Retencion -0.1354543 0.1377638 0.0527361 -0.0381611 0.2020524 -0.0647054 -0.0355016 1.0000000

Paso 3

Construcción del método:

cca2 <- cancor(X,Y)

Vectores canónicos:

cca2[2:3]
## $xcoef
##                              [,1]         [,2]          [,3]         [,4]
## Carga_laboral         0.094309155  0.041995241 -0.0004284441 -0.006324642
## Horas_capacitacion   -0.017584955  0.090510244 -0.0221933316  0.008114306
## Satisfaccion_laboral -0.001682261 -0.015348490  0.0624161534 -0.033805318
## Salario               0.008260422  0.007900578 -0.0516270451 -0.090036714
## Relacion_supervisor  -0.015748100  0.022384394  0.0808704401 -0.017954236
##                              [,5]
## Carga_laboral         0.018859924
## Horas_capacitacion   -0.040334906
## Satisfaccion_laboral -0.072836062
## Salario               0.003220402
## Relacion_supervisor   0.059763349
## 
## $ycoef
##                       [,1]       [,2]        [,3]
## Productividad  0.096657913 0.02312729  0.02027080
## Eficiencia    -0.006217358 0.09853481 -0.02259688
## Retencion     -0.018794758 0.02527253  0.09576364

Paso 4

Correlaciones significativas:

library(CCP)
# Correlaciones canónicas:
cca2$cor
## [1] 0.7565165 0.5026404 0.1952920
# Evaluar significancia de las correlaciones canónicas
p.asym(cca2$cor, nrow(X), ncol(X), ncol(Y))
## Wilks' Lambda, using F-approximation (Rao's F):
##               stat   approx df1      df2      p.value
## 1 to 3:  0.3074395 9.039587  15 254.3729 1.110223e-16
## 2 to 3:  0.7188494 4.172308   8 186.0000 1.301977e-04
## 3 to 3:  0.9618610 1.242405   3  94.0000 2.988238e-01

Paso 5

Interpretación de resultados:

De los valores obtenidos podríamos concluir lo siguiente:

  • Significancia estadística \((p-value)\): la tabla de Wilks’ Lambda muestra la prueba de significancia para los pares de variables canónicas:
    • 1 to 3 \((p-value \approx 0)\): altamente significativo.
    • 2 to 3 \((p-value = 0.00013)\): significativo.
    • 3 to 3 \((p-value=0.299)\): no es significativo.
  • Correlaciones canónicas: indican la fuerza de la relación entre las combinaciones lineales de \(X\) e \(Y\):
    • \((U_1,V_1)\): correlación fuerte (0.7565).
    • \((U_2,V_2)\): correlación moderada (0.5026).
    • \((U_3,V_3)\): correlación débil (0.1953).

El Análisis de Correlación Canónica muestra que las dos primeras correlaciones canónicas \((r_1=0.7565 \text{ y } r_2=0.5026)\) son estadísticamente significativas. El tercer par no es significativo y puede ser descartado para la interpretación. En particular, el primer par representa la conexión más fuerte, justificando un enfoque en estas variables clave para comprender las dinámicas laborales y de desempeño.

  • Visualización: podemos visualizar las correlaciones canónicas también con ayuda de la función candisc de la librería con el mismo nombre.
data <- cbind(X, Y)
mod <- lm(cbind(Productividad, Eficiencia, Retencion) ~ 
          Carga_laboral + Horas_capacitacion + Satisfaccion_laboral + Salario + Relacion_supervisor, data = as.data.frame(data))

library(candisc)

# Aplicar candisc al modelo
candisc_result <- candisc(mod)

# Generar biplot
plot(candisc_result, which = 1)  # Primer par canónico

Los puntos parecen estar alineados en una dirección diagonal, lo que indica una relación positiva fuerte entre \((U_1,V_1)\). Esto es consistente con la alta correlación canónica \((r=0.7565)\).

La variable Productividad es la que más contribuye a la combinación canónica \(V_1\), mientras que las variables Eficiencia y Retención también contribuyen pero en menor medida y de forma negativa.

\[ \]