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.
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.
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:
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.
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).
En este paso se desarrolla el modelo matemático que maximiza la correlación entre los conjuntos \(X\) e \(Y\).
Variables canónicas:
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.
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:
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.
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.
En este paso, interpretamos los resultados y visualizamos la relación entre las variables canónicas:
plot.cc()
,
podemos hacer la gráfica donde se puede explorar estas relaciones.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.
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)
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 |
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.
Correlaciones significativas:
Evaluamos qué correlaciones canónicas son estadísticamente significativas por los dos métodos vistos:
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
cca1$cor
## [1] 0.79560815 0.20055604 0.07257029
Interpretación de resultados:
De los valores obtenidos podríamos concluir lo siguiente:
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.
# 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.
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.
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 |
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 |
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
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
Interpretación de resultados:
De los valores obtenidos podríamos concluir lo siguiente:
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.
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.
\[ \]