La correlación canónica es una técnica de análisis multivariado que se utiliza para evaluar la relación lineal entre dos conjuntos de variables. Supongamos que tenemos dos matrices de datos \(X\) y \(Y\), donde \(X\) tiene dimensiones \(n \times p\) y \(Y\) tiene dimensiones \(n \times q\). La correlación canónica busca encontrar los vectores de peso \(a\) y \(b\) que maximizan la correlación entre las combinaciones lineales de las variables en \(X\) y \(Y\):
\[\begin{equation} r_{c1} = \max_{a,b} \frac{\sum_{i=1}^{n} a_i X_i}{\sqrt{\sum_{i=1}^{n} a_i^2} \sqrt{\sum_{i=1}^{n} b_i^2 Y_i}} \end{equation}\]
Donde \(X_i\) y \(Y_i\) son las i-ésimas filas de las matrices \(X\) e \(Y\), respectivamente.
La solución para el primer par canónico de vectores de peso se puede encontrar resolviendo el problema de maximización anterior mediante técnicas de álgebra lineal, como descomposición en valores singulares o eigenanálisis. Este primer par canónico maximiza la correlación entre las dos combinaciones lineales y se llama coeficiente de correlación canónica de primer orden (\(r_{c1}\)).
Se pueden encontrar más pares canónicos de vectores de peso mediante un proceso iterativo similar, con la restricción de que los pares posteriores sean ortogonales a los pares anteriores. Los coeficientes de correlación canónica de orden superior (\(r_{c2}, r_{c3}, ..., r_{cp}\)) miden la correlación entre las combinaciones lineales restantes de las dos matrices.
En resumen, la correlación canónica es una técnica útil para analizar la relación entre dos conjuntos de variables y encontrar combinaciones lineales que maximizan la correlación entre ellos.
Para deducir las matrices asociadas a la correlación canónica, primero debemos calcular las matrices de covarianza y de intercovarianza entre las variables en \(X\) y \(Y\). Supongamos que las variables en \(X\) son \(x_1, x_2, ..., x_p\) y las variables en \(Y\) son \(y_1, y_2, ..., y_q\). Entonces, las matrices de covarianza entre las variables de \(X\) y \(Y\) son:
\[\begin{equation} S_{XX} = \frac{1}{n} \sum_{i=1}^{n} (X_i - \bar{X})(X_i - \bar{X})^T \end{equation}\]
\[\begin{equation} S_{YY} = \frac{1}{n} \sum_{i=1}^{n} (Y_i - \bar{Y})(Y_i - \bar{Y})^T \end{equation}\]
Y la matriz de intercovarianza es:
\[\begin{equation} S_{XY} = \frac{1}{n} \sum_{i=1}^{n} (X_i - \bar{X})(Y_i - \bar{Y})^T \end{equation}\]
donde \(\bar{X}\) y \(\bar{Y}\) son los vectores de medias de las variables en \(X\) y \(Y\), respectivamente.
Luego, podemos construir la matriz de correlación canónica \(R\) utilizando la matriz inversa de la raíz cuadrada de las matrices de covarianza y de intercovarianza. La matriz de correlación canónica se define como:
\[\begin{equation}
R = \begin{bmatrix}
r_{c1} & 0 & \cdots & 0 \
0 & r_{c2} & \cdots & 0 \
\vdots & \vdots & \ddots & \vdots \
0 & 0 & \cdots & r_{cp}
\end{bmatrix}
\end{equation}\]s & &
0 & 0 & & r_{cp} \end{bmatrix} \end{equation}
donde \(r_{c1}, r_{c2}, ..., r_{cp}\) son los coeficientes de correlación canónica de orden 1 a \(p\). Estos coeficientes se pueden obtener a partir de los valores propios de la matriz \(S_{XX}^{-1}S_{XY}S_{YY}^{-1}S_{YX}\).
Finalmente, podemos obtener las matrices de pesos canónicos \(A\) y \(B\) utilizando los vectores propios de la matriz \(S_{XX}^{-1}S_{XY}S_{YY}^{-1}S_{YX}\). Los vectores propios corresponden a los vectores de peso que maximizan la correlación canónica entre las combinaciones lineales de las variables en \(X\) y \(Y\). Los vectores propios se ordenan de acuerdo a sus correspondientes valores propios, que son iguales a los coeficientes de correlación canónica.
La matriz de pesos canónicos \(A\) se define como:
\[\begin{equation}
A = \begin{bmatrix}
a_{11} & a_{12} & \cdots & a_{1p} \
a_{21} & a_{22} & \cdots & a_{2p} \
\vdots & \vdots & \ddots & \vdots \
a_{p1} & a_{p2} & \cdots & a_{pp}
\end{bmatrix}
\end{equation}\]s & &
a_{p1} & a_{p2} & & a_{pp} \end{bmatrix} \end{equation}
y la matriz de pesos canónicos \(B\) se define como:
\[\begin{equation}
B = \begin{bmatrix}
b_{11} & b_{12} & \cdots & b_{1q} \
b_{21} & b_{22} & \cdots & b_{2q} \
\vdots & \vdots & \ddots & \vdots \
b_{q1} & b_{q2} & \cdots & b_{qq}
\end{bmatrix}
\end{equation}\]s & &
b_{q1} & b_{q2} & & b_{qq} \end{bmatrix} \end{equation}
Donde \(a_{ij}\) y \(b_{ij}\) son los elementos de las matrices de pesos canónicos \(A\) y \(B\), respectivamente. Cada columna de \(A\) y \(B\) contiene los pesos canónicos correspondientes a la combinación lineal de las variables en \(X\) y \(Y\), respectivamente.
Por último, las combinaciones lineales canónicas se pueden obtener mediante la multiplicación de las matrices de pesos canónicos y las matrices de datos originales \(X\) y \(Y\), respectivamente:
\[\begin{equation} U = XA \end{equation}\]
\[\begin{equation} V = YB \end{equation}\]
donde \(U\) y \(V\) son las combinaciones lineales canónicas para las variables en \(X\) y \(Y\), respectivamente.
El análisis en correlación canónica también se puede aplicar a datos funcionales. En este caso, las variables en \(X\) y \(Y\) son funciones en lugar de variables escalares.
Supongamos que tenemos \(n\) pares de funciones \((x_i(t), y_i(t)), i = 1, 2, ..., n\), donde \(x_i(t)\) es una función en un dominio común \(T_x\) y \(y_i(t)\) es una función en otro dominio común \(T_y\). Queremos encontrar la relación entre estas dos series de funciones y determinar si existe una correlación canónica significativa entre ellas.
En el análisis en correlación canónica para datos funcionales, las matrices de covarianza y de intercovarianza se definen como:
\[\begin{equation} S_{XX}(s, t) = \frac{1}{n} \sum_{i=1}^{n} \left(x_i(s) - \bar{x}(s)\right)\left(x_i(t) - \bar{x}(t)\right) \end{equation}\]
\[\begin{equation} S_{YY}(s, t) = \frac{1}{n} \sum_{i=1}^{n} \left(y_i(s) - \bar{y}(s)\right)\left(y_i(t) - \bar{y}(t)\right) \end{equation}\]
\[\begin{equation} S_{XY}(s, t) = \frac{1}{n} \sum_{i=1}^{n} \left(x_i(s) - \bar{x}(s)\right)\left(y_i(t) - \bar{y}(t)\right) \end{equation}\]
donde \(\bar{x}(s)\) y \(\bar{y}(t)\) son las medias de las funciones \(x_i(s)\) y \(y_i(t)\), respectivamente.
Luego, se puede calcular la matriz de correlación canónica \(R\) y los coeficientes de correlación canónica \(r_{c1}, r_{c2}, ..., r_{cp}\) de manera similar a como se hace en el caso de variables escalares.
Además, se pueden obtener las funciones de peso canónicas \(a_i(s)\) y \(b_i(t)\) utilizando los vectores propios correspondientes a los valores propios de la matriz \(S_{XX}^{-1}S_{XY}S_{YY}^{-1}S_{YX}\).
Por último, se pueden obtener las combinaciones lineales canónicas \(U(t)\) y \(V(t)\) para las funciones en \(X\) y \(Y\), respectivamente, mediante la siguiente ecuación:
\[\begin{equation} U(t) = \sum_{i=1}^{p} a_i x_i(t) \end{equation}\]
\[\begin{equation} V(t) = \sum_{i=1}^{p} b_i y_i(t) \end{equation}\]
donde \(a_i\) y \(b_i\) son los vectores de peso canónico correspondientes a los coeficientes de correlación canónica \(r_{ci}\) y \(x_i(t)\) y \(y_i(t)\) son las funciones de la \(i\)-ésima combinación lineal canónica.
# Generar la distribución normal multivariada
library(MASS)
## Warning: package 'MASS' was built under R version 4.2.3
# Definir parámetros de la distribución multivariada
n <- 400
mu <- rep(0,10)
Sigma <- matrix(c(1,rep(0,4),0.8,rep(0,5),1,rep(0,4),0.7,rep(0,5),1,rep(0,4),0.6,rep(0,5),1,rep(0,4),0.5,rep(0,5),1,rep(0,4),0.4,0.8,rep(0,4),1,rep(0,5),0.7,rep(0,4),1,rep(0,5),0.6,rep(0,4),1,rep(0,5),0.5,rep(0,4),1,rep(0,5),0.4,rep(0,4),1),10,10)
Sigma
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
## [1,] 1.0 0.0 0.0 0.0 0.0 0.8 0.0 0.0 0.0 0.0
## [2,] 0.0 1.0 0.0 0.0 0.0 0.0 0.7 0.0 0.0 0.0
## [3,] 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.6 0.0 0.0
## [4,] 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.5 0.0
## [5,] 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 0.4
## [6,] 0.8 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0
## [7,] 0.0 0.7 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0
## [8,] 0.0 0.0 0.6 0.0 0.0 0.0 0.0 1.0 0.0 0.0
## [9,] 0.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 1.0 0.0
## [10,] 0.0 0.0 0.0 0.0 0.4 0.0 0.0 0.0 0.0 1.0
# Generar observaciones aleatorias
set.seed(123)
x <- mvrnorm(n, mu, Sigma)
# Ver los primeros 6 valores generados
head(x)
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 0.46416033 0.3940469 -0.17690971 0.7783734 -0.5220311 0.5992674
## [2,] 0.59716721 1.0379823 0.09583117 -0.3903496 0.6790547 -0.1604361
## [3,] -1.40541796 0.9329741 -1.40486018 1.0312844 -0.6764823 -1.5520231
## [4,] -0.22590256 -0.5132744 -0.18508463 -0.4418774 0.1709357 0.0921223
## [5,] 0.07671493 0.3446754 -0.06917142 0.1912109 -1.3356282 -0.3220212
## [6,] -1.32432945 1.3663082 -0.30644751 0.8215385 -0.5122335 -1.9297776
## [,7] [,8] [,9] [,10]
## [1,] -0.2584163 -0.46042932 0.2952384 0.03840268
## [2,] 1.1169045 1.08125328 -0.9216965 0.41950231
## [3,] 0.2374438 -0.12497203 0.4435996 -0.08320112
## [4,] 0.5664556 -1.87735039 -0.8535753 -1.16466123
## [5,] -1.5813777 -0.42504353 0.9003965 -1.52638444
## [6,] 1.6771493 0.04866525 1.0779352 0.16175921
sxx<-cov(x[,1:5])
sxx
## [,1] [,2] [,3] [,4] [,5]
## [1,] 0.92449798 -0.01538588 -0.04361834 0.01146751 -0.04067733
## [2,] -0.01538588 1.01181016 -0.04599016 -0.01464327 0.01821470
## [3,] -0.04361834 -0.04599016 1.10346267 -0.03365511 0.03152382
## [4,] 0.01146751 -0.01464327 -0.03365511 0.89432025 0.02374770
## [5,] -0.04067733 0.01821470 0.03152382 0.02374770 1.02612953
syy<-cov(x[,6:10])
syy
## [,1] [,2] [,3] [,4] [,5]
## [1,] 0.95648315 0.07237079 -0.05511833 0.05352623 -0.05442013
## [2,] 0.07237079 0.97659468 0.01500999 -0.02401045 0.05428417
## [3,] -0.05511833 0.01500999 1.00117432 -0.15793122 0.04593600
## [4,] 0.05352623 -0.02401045 -0.15793122 0.95737484 -0.01193717
## [5,] -0.05442013 0.05428417 0.04593600 -0.01193717 1.05803532
sxy<-cov(x[,1:5],x[,6:10])
sxy
## [,1] [,2] [,3] [,4] [,5]
## [1,] 0.74969316 0.02146637 -0.049414878 0.05100922 -0.07483016
## [2,] 0.01388136 0.68642479 -0.051431266 -0.02297126 0.00875701
## [3,] -0.04939044 0.05948518 0.633685367 -0.13167097 0.07613306
## [4,] 0.06003284 0.01219354 -0.121490822 0.43817753 0.01292235
## [5,] -0.03966805 0.01745546 0.007911435 -0.04419421 0.52952964
syx<-cov(x[,6:10],x[,1:5])
syx
## [,1] [,2] [,3] [,4] [,5]
## [1,] 0.74969316 0.01388136 -0.04939044 0.06003284 -0.039668048
## [2,] 0.02146637 0.68642479 0.05948518 0.01219354 0.017455459
## [3,] -0.04941488 -0.05143127 0.63368537 -0.12149082 0.007911435
## [4,] 0.05100922 -0.02297126 -0.13167097 0.43817753 -0.044194208
## [5,] -0.07483016 0.00875701 0.07613306 0.01292235 0.529529643
Estas se sacan hallando los valores y vectores propios de las siguientes matrices
P1<- solve(sxx)%*%sxy%*%solve(syy)%*%syx
v1<-eigen(P1)
v1
## eigen() decomposition
## $values
## [1] 0.6473800 0.4877893 0.3948441 0.2538959 0.1868344
##
## $vectors
## [,1] [,2] [,3] [,4] [,5]
## [1,] -0.98510715 0.05226007 0.2086064 0.088196077 0.07116587
## [2,] 0.01742339 0.98457495 -0.1164073 0.033637724 0.04614485
## [3,] 0.08951401 0.16101313 0.8701459 -0.146136114 -0.37017552
## [4,] -0.13205571 0.02319851 -0.4118113 0.002415654 -0.92467248
## [5,] 0.06171590 -0.03765173 0.1272412 0.984747864 -0.02751289
Como las correlaciones están elevadas al cuadrado para exponer las reales se debe sacar raiz cuadrada
r<-sqrt(v1$values);r
## [1] 0.8045993 0.6984191 0.6283662 0.5038809 0.4322434
P2<- solve(syy)%*%syx%*%solve(sxx)%*%sxy
v2<-eigen(P2)
v2
## eigen() decomposition
## $values
## [1] 0.6473800 0.4877893 0.3948441 0.2538959 0.1868344
##
## $vectors
## [,1] [,2] [,3] [,4] [,5]
## [1,] -0.98788321 -0.004495537 -0.22125259 0.117598751 0.06251813
## [2,] 0.05983252 0.997021826 0.08923896 0.007799002 -0.01524766
## [3,] 0.07990783 0.050380794 -0.89898181 -0.230649142 -0.41949461
## [4,] -0.09193373 -0.010501357 0.33952531 -0.072948403 -0.89827542
## [5,] 0.07529780 -0.057260508 -0.14013555 0.963114330 -0.11394967
Evaluar si los valores propios son iguales
round(v1$values,3)==round(v2$values,3)
## [1] TRUE TRUE TRUE TRUE TRUE