¿Cómo simular un análisis en correlación canónica funcional?

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.

Matrices para sacar los valores y vectores propios

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.

En datos funcionales

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.

Caso de simulación.

# 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

Sacar las direcciones que maximizan la correlación

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