--- format: pdf fontsize: 11pt bibliography: ../MV_Referenzen_Seminar.bib include-in-header: ../MV_Header_Seminar.tex lang: de --- # (7) Kanonische Korrelationsanalyse Ziel dieser Sitzung ist es, die Durchführung einer kanonischen Korrelationsanalyse an einem Anwendungsbeispiel zu demonstrieren. In der kanonischen Korrelationsanalyse werden multivariate (d.h. mehrdimensionale) unabhängige und abhängige Variablen miteinander in Beziehung gesetzt, indem die am besten korrelierten Linearkombinationen dieser zwei Gruppen von Zufallsvariablen ermittelt werden. ### Datensatz generieren Wir beginnen damit, den im Folgenden verwendeten Datensatz im Rahmen einer Simulation zu erzeugen, um das der kanonischen Korrelationsanalyse zugrunde liegende generative Modell zu verstehen. Dafür werden zunächst unabhängige Variablen ("Prädiktoren") aus uniformen Verteilungen gezogen und zu einer Designmatrix zusammengefasst. Im Anschluss werden Regressionskoeffiezienten festgelegt, die von den Spalten der Designmatrix auf die Spalten der Datenmatrix abbilden. Schließlich wird mithilfe der multivariaten Normalverteilung eine Datenmatrix mit abhängigen Variablen ("Kriterien") im Sinne des multivariaten Allgemeinen Linearen Modells $Y = X B + E, \; \varepsilon_i^\mathrm{T} \sim N(0_{m_y}, I_{m_y})$ generiert, wobei $Y \in \mathbb{R}^{n \times m_y}$, $X \in \mathbb{R}^{n \times m_x}$, $B \in \mathbb{R}^{m_x \times m_y}$ und $\varepsilon_i \in \mathbb{R}^{1 \times m_y}$. \small ```{r, echo = T, warning = F} # R-Pakete library(MixMatrix) set.seed(0) # Datensimulation n = 20 m_x = 2 m_y = 2 x_1 = runif(n,10,30) x_2 = runif(n, 0,10) X = matrix(c(x_1,x_2), nrow = n) B = matrix(c(1, 0.1, 1, 0.2), nrow = m_x, byrow = T) Y = rmatrixnorm(n = 1, mean = X %*% B) D = data.frame(DUR = X[,1], EXP = X[,2], dBDI = Y[,1], dGLU = Y[,2]) # Datenspeicherung fname = "Kanonische_Korrelationsanalyse.csv" write.csv(D, file = fname, row.names = FALSE) ``` \newpage \normalsize Die resultierende Datenmatrix wird in einer CSV-Datei abgespeichert und kann beispielsweise in Tabellenform angezeigt werden. \small ```{r, echo = T} D = read.csv("Kanonische_Korrelationsanalyse.csv") knitr::kable(D, digits = 1, "pipe") ``` \newpage ### Univariate Korrelation \normalsize Im Anschluss erinnern wir zunächst an die Bestimmung eines Korrelationskoeffizienten bei univariaten (d.h. eindimensionalen) unabhängigen und abhängigen Variablen. \small ```{r, echo = T} # Laden des Beispieldatensatzes D = read.csv("Kanonische_Korrelationsanalyse.csv") x_i = D$DUR y_i = D$dBDI n = length(x_i) # "manuelle" Berechnung der Stichprobenkorrelation x_bar = (1/n)*sum(x_i) y_bar = (1/n)*sum(y_i) s_x = sqrt(1/(n-1)*sum((x_i - x_bar)^2)) s_y = sqrt(1/(n-1)*sum((y_i - y_bar)^2)) c_xy = 1/(n-1) * sum((x_i - x_bar) * (y_i - y_bar)) r_xy = c_xy/(s_x * s_y) print(r_xy) ``` \normalsize Die gleiche Analyse können wir auch im Sinne eines Black-Box-Verfahrens mit der **R**-Funktion `cor()` durchführen. \small ```{r, echo = T} # Automatische Berechnung mit cor() r_xy = cor(x_i, y_i) print(r_xy) ``` \newpage ### Multivariate Korrelation \normalsize Wir führen schließlich eine kanonische Korrelationsanalyse zu dem in der Vorlesung betrachtetem Anwendungsbeispiel durch. \footnotesize ```{r, echo = T, warning = F, message = F} # R-Paket library(expm) # Datenpräprozessierung D = read.csv("Kanonische_Korrelationsanalyse.csv") x = as.matrix(cbind(D$DUR , D$EXP)) y = as.matrix(cbind(D$dBDI, D$dGLU)) n = nrow(x) m_x = ncol(x) m_y = ncol(y) Y = t(cbind(x,y)) # Stichprobenkovarianzmatrixpartition I_n = diag(n) J_n = matrix(rep(1,n^2), nrow = n) C = (1/(n-1))*(Y %*% (I_n-(1/n)*J_n) %*% t(Y)) C_xx = C[1:m_x,1:m_x] C_xy = C[1:m_x,(m_x+1):(m_x+m_y)] C_yx = C[(m_x+1):(m_x+m_y),1:m_x] C_yy = C[(m_x+1):(m_x+m_y),(m_x+1):(m_x+m_y)] # Kanonische Korrelationsanalyse K_hat = sqrtm(solve(C_xx)) %*% C_xy %*% sqrtm(solve(C_yy)) ALB_hat = svd(K_hat) A_hat = ALB_hat$u Lambda_hat = ALB_hat$d B_hat = ALB_hat$v a_hat = sqrtm(solve(C_xx)) %*% A_hat b_hat = sqrtm(solve(C_yy)) %*% B_hat rho_hat = as.matrix(Lambda_hat) # Ausgabe cat( "rho_hat_1 : ", rho_hat[1], "\na_hat_1 : ", a_hat[,1], "\nb_hat_1 : ", b_hat[,1], "\nrho_hat_2 : ", rho_hat[2], "\na_hat_2 : ", a_hat[,2], "\nb_hat_2 : ", b_hat[,2], "\n") ``` \newpage \normalsize Die gleiche Analyse können wir auch im Sinne eines Black-Box-Verfahrens mit der **R**-Funktion `cancor()` durchführen. \footnotesize ```{r, echo = T, warning = F, message = F} # Datenpräprozessierung D = read.csv("Kanonische_Korrelationsanalyse.csv") x = as.matrix(cbind(D$DUR , D$EXP)) y = as.matrix(cbind(D$dBDI, D$dGLU)) cca = cancor(x,y) # Ausgabe cat( "rho_hat_1 : ", cca$cor[1], "\nrho_hat_2 : ", cca$cor[2], "\n") ``` \normalsize Im vorliegen Fall würden also die Linearkombination $\xi = 0.16 \mbox{ DUR } + 0.17 \mbox{ EXP }$ als "bester Prädiktor" und die Linearkombination $\upsilon = 0.15 \mbox{ dBDI} + 0.05 \mbox{ dGLU }$ als "am besten prädizierbares Kriterium" die kanonische Korrelation maximieren und der kanonische Korrelationskoeffizient von 0.99 signalisiert eine hochgradige multivariate Korrelation.