TÓM TẮT
Mở Đầu
Canonical Correlation Analysis (CCA) – hay Phân tích tương quan chuẩn – là một kỹ thuật thống kê đa biến mạnh mẽ, cho phép chúng ta khám phá mối quan hệ giữa hai tập hợp biến (hay còn gọi là hai không gian biến). Thay vì chỉ xem xét mối quan hệ giữa các biến đơn lẻ, CCA giúp tìm ra các tổ hợp tuyến tính của các biến trong mỗi tập hợp sao cho hệ số tương quan giữa hai tổ hợp này đạt mức tối đa. Kết quả cuối cùng là một loạt các cặp biến “canonical variables” (biến chuẩn) và các hệ số tương quan “canonical correlations” (tương quan chuẩn) tương ứng.
Trong môi trường R, việc thực hiện CCA đã trở nên rất thuận tiện nhờ vào các gói (packages) như stats, vegan, cancor, CCA, yacca, và psych. Bài viết dưới đây sẽ hướng dẫn chi tiết cách cài đặt, chuẩn bị dữ liệu, thực hiện CCA, và quan trọng hơn – cách vẽ các kết quả CCA để trực quan hoá mối quan hệ giữa các biến. Chúng ta sẽ đi từ các bước cơ bản dành cho người mới bắt đầu, tới các kỹ thuật nâng cao cho người dùng có kinh nghiệm.
Lưu ý: Bài viết này hướng tới độc giả có kiến thức nền tảng về R và thống kê đa biến. Nếu bạn chưa quen với R, hãy xem qua các tài liệu cơ bản về nhập liệu, xử lý dữ liệu và vẽ đồ thị trong R trước khi đọc tiếp.
1. Tổng Quan Về CCA
1.1. Khái Niệm Cơ Bản
Giả sử chúng ta có hai ma trận dữ liệu:
- X (n × p): n quan sát, p biến trong nhóm 1.
- Y (n × q): n quan sát, q biến trong nhóm 2.
Mục tiêu của CCA là tìm các vector a (p × 1) và b (q × 1) sao cho:
\rho = \text{corr}(X a, Y b)
đạt giá trị tối đa. Các vector a và b tạo ra các canonical variates (biến chuẩn) (U = X a) và (V = Y b). Sau khi tìm được cặp đầu tiên, chúng ta tiếp tục tìm các cặp tiếp theo sao cho các biến chuẩn mới không tương quan với các cặp đã tìm trước (điều kiện orthogonal).

Có thể bạn quan tâm: Cách Vẽ Cây Kim Minecraft: Hướng Dẫn Chi Tiết Từ Cơ Bản Đến Nâng Cao
1.2. Ứng Dụng Thực Tiễn
- Kinh tế học: Phân tích mối quan hệ giữa các chỉ số kinh tế vĩ mô (GDP, lạm phát…) và các chỉ số tài chính (lãi suất, chỉ số chứng khoán…).
- Sinh học: Khảo sát mối liên hệ giữa biểu hiện gene (RNA-Seq) và các đặc tính sinh lý (cân nặng, huyết áp…).
- Kỹ thuật: Liên kết các cảm biến môi trường (nhiệt độ, độ ẩm) với các chỉ số hiệu suất thiết bị.
2. Chuẩn Bị Môi Trường R
2.1. Cài Đặt Các Gói Cần Thiết
# Cài đặt nếu chưa có
install.packages(c("stats", "vegan", "CCA", "yacca", "psych", "ggplot2", "gridExtra")) # Nạp các gói
library(stats) # hàm cancor()
library(vegan) # hàm cca() cho dữ liệu sinh thái, nhưng cũng dùng cho CCA
library(CCA) # hàm cc() và plot.cc()
library(yacca) # hàm yacca() và plot.yacca()
library(psych) # hàm canonical()
library(ggplot2) # vẽ đồ thị tùy chỉnh
library(gridExtra) # sắp xếp nhiều plot
2.2. Đọc Dữ Liệu
Giả sử dữ liệu của bạn lưu trong file CSV với hai sheet: X.csv và Y.csv.
X <- read.csv("X.csv", header = TRUE, row.names = 1)
Y <- read.csv("Y.csv", header = TRUE, row.names = 1) # Kiểm tra kích thước
dim(X) # ví dụ: 120 x 5
dim(Y) # ví dụ: 120 x 4
2.3. Kiểm Tra và Xử Lý Thiếu Giá Trị
# Kiểm tra missing
sum(is.na(X))
sum(is.na(Y)) # Nếu có missing, có thể loại bỏ hoặc thay thế
X <- na.omit(X)
Y <- na.omit(Y) # giữ lại các quan sát không có missing trong cả 2 bảng
2.4. Chuẩn Hóa Dữ Liệu

Có thể bạn quan tâm: Cách Vẽ Cây Hoa Đào: Hướng Dẫn Chi Tiết Từ Cơ Bản Đến Nâng Cao
CCA yêu cầu các biến có cùng thang đo. Thông thường, chúng ta chuẩn hóa (z-score) mỗi biến:
X_std <- scale(X) # trung bình 0, sd 1
Y_std <- scale(Y)
3. Thực Hiện CCA Trong R
3.1. Sử Dụng cancor() (gói stats)
cca_res <- cancor(X_std, Y_std)
cca_res
Kết quả trả về:
cor: vector các hệ số tương quan chuẩn.xcoefvàycoef: ma trận các hệ số tải (loadings) cho X và Y.
3.2. Kiểm Tra Độ Ý Nghĩa
Chúng ta có thể thực hiện kiểm định Wilks’ Lambda để đánh giá độ ý nghĩa của các cặp canonical variates.
library(psych) # Hàm canonical() cung cấp test chi-square
canon_test <- canonical(X_std, Y_std)
print(canon_test)
Kết quả bao gồm giá trị Wilks và p-value cho từng cặp.
3.3. Sử Dụng Gói CCA (hàm cc())
cc_res <- cc(X_std, Y_std)
summary(cc_res)
cc_res$cor chứa các hệ số tương quan chuẩn, còn cc_res$xcoef và cc_res$ycoef là loadings.
3.4. Sử Dụng Gói yacca (hàm yacca())

Có thể bạn quan tâm: Cách Vẽ Capture Trên Imindmap: Hướng Dẫn Chi Tiết Từ A Đến Z
yacca_res <- yacca(X_std, Y_std, nperm = 999) # kiểm định permutation
summary(yacca_res)
3.5. So Sánh Kết Quả
Bạn có thể so sánh các hệ số từ các hàm khác nhau để đảm bảo tính ổn định:
cancor_cor <- cca_res$cor
cc_cor <- cc_res$cor
yacca_cor <- yacca_res$cor all.equal(cancor_cor, cc_cor) # thường rất gần nhau
4. Vẽ Kết Quả CCA
Việc trực quan hoá là bước quan trọng để truyền tải thông tin. Dưới đây là các cách vẽ phổ biến.
4.1. Scatter Plot của Cặp Canonical Variates Đầu Tiên
# Tính canonical variates
U1 <- X_std %% cca_res$xcoef,1 # biến chuẩn X thứ nhất
V1 <- Y_std %% cca_res$ycoef,1 # biến chuẩn Y thứ nhất df_plot <- data.frame(U1 = U1, V1 = V1) ggplot(df_plot, aes(x = U1, y = V1)) + geom_point(alpha = 0.6, color = "steelblue") + geom_smooth(method = "lm", se = FALSE, color = "darkred") + labs(title = "Scatter Plot of First Pair of Canonical Variates", x = "Canonical Variable U1 (X)", y = "Canonical Variable V1 (Y)") + theme_minimal()
4.2. Biplot CCA
Biplot cho phép hiển thị cả các quan sát và tải (loadings) của các biến.
# Hàm plot.cc() trong gói CCA
plot(cc_res, what = "biplot", main = "CCA Biplot (First Pair)")
Nếu muốn tùy biến hơn, dùng ggplot2:
# Loadings
loadings_X <- data.frame(var = colnames(X_std), dim1 = cca_res$xcoef,1, dim2 = cca_res$xcoef,2, group = "X")
loadings_Y <- data.frame(var = colnames(Y_std), dim1 = cca_res$ycoef,1, dim2 = cca_res$ycoef,2, group = "Y")
loadings <- rbind(loadings_X, loadings_Y) # Observations (scores)
scores <- data.frame(U1 = U1, V1 = V1) ggplot() + geom_point(data = scores, aes(x = U1, y = V1), alpha = 0.5) + geom_segment(data = loadings, aes(x = 0, y = 0, xend = dim1 3, # nhân hệ số để hiển thị rõ yend = dim2 3, colour = group), arrow = arrow(length = unit(0.2, "cm")), size = 1) + geom_text(data = loadings, aes(x = dim1 3.2, y = dim2 3.2, label = var, colour = group), hjust = 0.5, vjust = -0.5, size = 4) + labs(title = "CCA Biplot (First Two Canonical Dimensions)", x = "Canonical Dimension 1", y = "Canonical Dimension 2") + theme_minimal() + scale_color_manual(values = c("X" = "forestgreen", "Y" = "purple"))
4.3. Heatmap của Loadings

Có thể bạn quan tâm: Cách Vẽ Capture Trong Imindmap: Hướng Dẫn Chi Tiết Từng Bước Để Tối Ưu Hóa Sự Sáng Tạo Và Hiệu Quả
Heatmap giúp nhận diện biến nào đóng góp mạnh vào từng canonical dimension.
library(reshape2) # Combine loadings
load_mat <- rbind(cca_res$xcoef, cca_res$ycoef)
rownames(load_mat) <- c(paste0("X_", colnames(X_std)), paste0("Y_", colnames(Y_std))) load_df <- melt(load_mat) ggplot(load_df, aes(x = Var2, y = Var1, fill = value)) + geom_tile() + scale_fill_gradient2(low = "blue", high = "red", mid = "white", midpoint = 0, limit = c(-1,1), name = "Loading") + labs(title = "Heatmap of CCA Loadings", x = "Canonical Dimension", y = "Variable") + theme_minimal() + theme(axis.text.x = element_text(angle = 45, hjust = 1))
4.4. Scree Plot của Canonical Correlations
canonical_corr <- cca_res$cor df_scree <- data.frame(Dimension = 1:length(canonical_corr), Correlation = canonical_corr) ggplot(df_scree, aes(x = Dimension, y = Correlation)) + geom_line(group = 1, colour = "steelblue") + geom_point(size = 3, colour = "darkred") + labs(title = "Scree Plot of Canonical Correlations", x = "Canonical Dimension", y = "Correlation") + ylim(0,1) + theme_minimal()
4.5. Confidence Ellipse Cho Các Nhóm
Nếu dữ liệu có nhãn nhóm (ví dụ: bệnh vs. khỏe), ta có thể vẽ ellipse để so sánh.
# Giả sử có vector nhóm
group <- factor(read.csv("group.csv")$Group) # "Control" hoặc "Treatment" df_plot$Group <- group ggplot(df_plot, aes(x = U1, y = V1, colour = Group)) + geom_point(alpha = 0.6) + stat_ellipse(level = 0.95) + labs(title = "Canonical Variates with Group Ellipses", x = "U1", y = "V1") + theme_minimal()
4.6. 3D Plot Khi Có Nhiều Dimension
Sử dụng plotly để vẽ 3D scatter của ba cặp canonical variates đầu tiên.
install.packages("plotly")
library(plotly) U2 <- X_std %% cca_res$xcoef,2
U3 <- X_std %% cca_res$xcoef,3
V2 <- Y_std %% cca_res$ycoef,2
V3 <- Y_std %% cca_res$ycoef,3 plot_ly(x = U1, y = V1, z = U2, type = "scatter3d", mode = "markers", marker = list(size = 3, color = as.numeric(group))) %>% layout(scene = list(xaxis = list(title = "U1"), yaxis = list(title = "V1"), zaxis = list(title = "U2")), title = "3D Scatter of First Two Canonical Variates")
5. Diễn Giải Kết Quả
5.1. Đánh Giá Mức Độ Tương Quan
- Hệ số tương quan chuẩn: Nếu giá trị lớn (>0.7) cho cặp đầu tiên, có mối quan hệ mạnh.
- Wilks’ Lambda & p-value: p < 0.05 cho thấy cặp canonical variates có ý nghĩa thống kê.
5.2. Phân Tích Loadings

- Loadings > |0.5| thường được xem là biến quan trọng.
- Kiểm tra dấu: biến có cùng dấu trong cùng một không gian cho thấy chúng di chuyển cùng hướng.
5.3. Ứng Dụng Thực Tiễn
- Dự báo: Sử dụng canonical variates làm biến dự báo trong mô hình hồi quy.
- Phân lớp: Áp dụng k-means hoặc discriminant analysis trên các canonical variates để phân lớp.
6. Các Vấn Đề Thường Gặp & Giải Pháp
| Vấn đề | Nguyên nhân | Giải pháp |
|---|---|---|
| Không hội tụ | Ma trận X hoặc Y không đầy đủ hạng (singular) | Loại bỏ biến đa cộng tuyến, dùng regularized CCA (gói PMA) |
| Hệ số tương quan > 1 | Chuẩn hóa chưa đúng, hoặc lỗi tính toán | Kiểm tra scale() và loại bỏ outlier |
| p‑value luôn > 0.05 | Số quan sát quá ít so với số biến | Giảm số biến (PCA trước), hoặc dùng permutation test (yacca) |
| Đồ thị không hiển thị | Thiếu gói gridExtra hoặc ggplot2 |
Cài đặt lại các gói, kiểm tra phiên bản R |
6.1. Regularized CCA (RCCA)
Khi số biến lớn hơn số quan sát, CCA truyền thống không ổn định. Gói PMA cung cấp RCCA.
install.packages("PMA")
library(PMA) # Tìm lambda tối ưu qua cross‑validation
set.seed(123)
out <- CCA(x = X_std, z = Y_std, typex = "standard", typez = "standard", K = 2, penaltyx = 0.2, penaltyz = 0.2) # Vẽ scatter của canonical variates RCCA
U_rca <- X_std %% out$u
V_rca <- Y_std %% out$v ggplot(data.frame(U = U_rca,1, V = V_rca,1), aes(U, V)) + geom_point() + labs(title = "RCCA First Pair")
7. Tổng Kết
- CCA là công cụ mạnh mẽ để khám phá mối quan hệ đa biến giữa hai tập hợp dữ liệu.
- Trong R, bạn có nhiều lựa chọn hàm:
cancor(),cc(),yacca(),canonical(), hoặc regularized CCA quaPMA. - Chuẩn hoá dữ liệu và kiểm tra đa cộng tuyến là bước không thể bỏ qua.
- Vẽ: scatter plot, biplot, heatmap, scree plot và confidence ellipse là những cách phổ biến để truyền tải kết quả.
- Đánh giá độ ý nghĩa qua Wilks’ Lambda, p‑value và permutation test giúp bạn quyết định có nên tiếp tục phân tích sâu hơn hay không.
Hy vọng bài viết này đã cung cấp cho bạn một hướng dẫn toàn diện, từ khâu chuẩn bị dữ liệu, thực hiện CCA, tới việc trực quan hoá và diễn giải kết quả trong R. Hãy áp dụng vào dự án thực tế của mình và khám phá những mối quan hệ tiềm ẩn mà CCA có thể hé lộ!
