Câu hỏi hỏi về "xác định mối quan hệ [tuyến tính] cơ bản" giữa các biến.
Cách nhanh chóng và dễ dàng để phát hiện các mối quan hệ là hồi quy bất kỳ biến nào khác (sử dụng hằng số, chẵn) đối với các biến đó bằng phần mềm yêu thích của bạn: mọi quy trình hồi quy tốt sẽ phát hiện và chẩn đoán cộng tuyến. (Bạn thậm chí sẽ không bận tâm đến kết quả hồi quy: chúng tôi chỉ dựa vào tác dụng phụ hữu ích của việc thiết lập và phân tích ma trận hồi quy.)
Giả sử cộng sự được phát hiện, mặc dù, điều gì tiếp theo? Phân tích thành phần chính (PCA) chính xác là những gì cần thiết: các thành phần nhỏ nhất của nó tương ứng với các mối quan hệ gần tuyến tính. Các mối quan hệ này có thể được đọc trực tiếp từ "tải", là sự kết hợp tuyến tính của các biến ban đầu. Tải trọng nhỏ (nghĩa là, những tải trọng liên quan đến giá trị riêng nhỏ) tương ứng với các cộng tuyến gần. Giá trị riêng bằng sẽ tương ứng với mối quan hệ tuyến tính hoàn hảo. Các giá trị riêng lớn hơn một chút mà vẫn nhỏ hơn nhiều so với giá trị lớn nhất sẽ tương ứng với các quan hệ tuyến tính gần đúng.0
(Có một nghệ thuật và khá nhiều tài liệu liên quan đến việc xác định tải "nhỏ" là gì. Để mô hình hóa một biến phụ thuộc, tôi sẽ đề xuất đưa nó vào trong các biến độc lập trong PCA để xác định các thành phần - bất kể kích thước của chúng - trong đó biến phụ thuộc đóng vai trò quan trọng. Từ quan điểm này, "nhỏ" có nghĩa là nhỏ hơn nhiều so với bất kỳ thành phần nào như vậy.)
Hãy xem xét một số ví dụ. (Chúng được sử dụng R
để tính toán và vẽ đồ thị.) Bắt đầu với một chức năng để thực hiện PCA, tìm kiếm các thành phần nhỏ, vẽ đồ thị và trả về các mối quan hệ tuyến tính giữa chúng.
pca <- function(x, threshold, ...) {
fit <- princomp(x)
#
# Compute the relations among "small" components.
#
if(missing(threshold)) threshold <- max(fit$sdev) / ncol(x)
i <- which(fit$sdev < threshold)
relations <- fit$loadings[, i, drop=FALSE]
relations <- round(t(t(relations) / apply(relations, 2, max)), digits=2)
#
# Plot the loadings, highlighting those for the small components.
#
matplot(x, pch=1, cex=.8, col="Gray", xlab="Observation", ylab="Value", ...)
suppressWarnings(matplot(x %*% relations, pch=19, col="#e0404080", add=TRUE))
return(t(relations))
}
Hãy áp dụng điều này cho một số dữ liệu ngẫu nhiên. Những được xây dựng trên bốn biến (các và E của câu hỏi). Đây là một hàm nhỏ để tính AB,C,D,EA là một tổ hợp tuyến tính nhất định của các hàm khác. Sau đó, nó thêm iid Các giá trị được phân phối thông thường vào tất cả năm biến (để xem quy trình thực hiện tốt như thế nào khi tính đa hình chỉ gần đúng và không chính xác).
process <- function(z, beta, sd, ...) {
x <- z %*% beta; colnames(x) <- "A"
pca(cbind(x, z + rnorm(length(x), sd=sd)), ...)
}
B,…,EA=B+C+D+EA=B+(C+D)/2+Esweep
n.obs <- 80 # Number of cases
n.vars <- 4 # Number of independent variables
set.seed(17)
z <- matrix(rnorm(n.obs*(n.vars)), ncol=n.vars)
z.mean <- apply(z, 2, mean)
z <- sweep(z, 2, z.mean)
colnames(z) <- c("B","C","D","E") # Optional; modify to match `n.vars` in length
B,…,EA
Đầu ra được liên kết với bảng trên bên trái là
A B C D E
Comp.5 1 -1 -1 -1 -1
00≈A−B−C−D−E
Đầu ra cho bảng giữa trên là
A B C D E
Comp.5 1 -0.95 -1.03 -0.98 -1.02
(A,B,C,D,E)
A B C D E
Comp.5 1 -1.33 -0.77 -0.74 -1.07
A′=B′+C′+D′+E′ nơi số nguyên tố biểu thị các giá trị với các lỗi (không rõ) gỡ bỏ.
1,1/2,1/2,1 .
Trong thực tế, thường không phải là một biến được gọi là một sự kết hợp rõ ràng của các biến khác: tất cả các hệ số có thể có kích thước tương đương và các dấu hiệu khác nhau. Hơn nữa, khi có nhiều hơn một chiều quan hệ, không có cách duy nhất để xác định chúng: cần phân tích thêm (như giảm hàng) để xác định cơ sở hữu ích cho các quan hệ đó. Đó là cách thế giới hoạt động: tất cả những gì bạn có thể nói là những kết hợp cụ thể được xuất ra bởi PCA tương ứng với hầu như không có biến thể trong dữ liệu. Để đối phó với điều này, một số người sử dụng các thành phần lớn nhất ("chính") trực tiếp làm các biến độc lập trong hồi quy hoặc phân tích tiếp theo, dưới bất kỳ hình thức nào. Nếu bạn làm điều này, trước tiên đừng quên loại bỏ biến phụ thuộc khỏi bộ biến và làm lại PCA!
Đây là mã để tái tạo con số này:
par(mfrow=c(2,3))
beta <- c(1,1,1,1) # Also can be a matrix with `n.obs` rows: try it!
process(z, beta, sd=0, main="A=B+C+D+E; No error")
process(z, beta, sd=1/10, main="A=B+C+D+E; Small error")
process(z, beta, sd=1/3, threshold=2/3, main="A=B+C+D+E; Large error")
beta <- c(1,1/2,1/2,1)
process(z, beta, sd=0, main="A=B+(C+D)/2+E; No error")
process(z, beta, sd=1/10, main="A=B+(C+D)/2+E; Small error")
process(z, beta, sd=1/3, threshold=2/3, main="A=B+(C+D)/2+E; Large error")
(Tôi đã phải sử dụng ngưỡng trong các trường hợp lỗi lớn để chỉ hiển thị một thành phần duy nhất: đó là lý do cung cấp giá trị này làm tham số process
.)
Người dùng ttnphns đã vui lòng hướng sự chú ý của chúng tôi đến một chủ đề liên quan chặt chẽ. Một trong những câu trả lời của nó (bởi JM) cho thấy cách tiếp cận được mô tả ở đây.