Kiểm tra sự phụ thuộc tuyến tính giữa các cột của ma trận


26

Tôi có một ma trận tương quan của lợi nhuận bảo mật có xác định bằng không. (Đây là một chút đáng ngạc nhiên vì ma trận tương quan mẫu và ma trận hiệp phương sai tương ứng nên về mặt lý thuyết là xác định dương.)

Giả thuyết của tôi là ít nhất một chứng khoán phụ thuộc tuyến tính vào các chứng khoán khác. Có một hàm nào trong R kiểm tra tuần tự mỗi cột một ma trận cho sự phụ thuộc tuyến tính không?

Ví dụ, một cách tiếp cận sẽ là xây dựng một ma trận tương quan một bảo mật tại một thời điểm và tính toán định thức ở mỗi bước. Khi xác định = 0 thì dừng lại vì bạn đã xác định được bảo mật là sự kết hợp tuyến tính của các chứng khoán khác.

Bất kỳ kỹ thuật nào khác để xác định sự phụ thuộc tuyến tính trong một ma trận như vậy đều được đánh giá cao.


Ma trận của bạn là bán xác định dương, mặc dù nó không phải là xác định dương, vì nó là số ít.
ttnphns

Các kích thước (số biến; số mẫu) là gì?
Karl

Số cột = 480. # hàng cho mỗi chuỗi thời gian = 502. Nói chung, bạn thấy rằng chuỗi thời gian càng lớn, ma trận hiệp phương sai mẫu có xu hướng xác định dương. Tuy nhiên, có nhiều trường hợp bạn muốn sử dụng giá trị T nhỏ hơn (hoặc trọng số theo cấp số nhân) để phản ánh các điều kiện thị trường gần đây.
Ram Ahluwalia

3
Câu hỏi không được đặt ra. Nếu ma trận dữ liệu của bạn là 480 x 502 thì nói rằng ma trận có thứ hạng (không gian cột của ma trận có thứ nguyên q < 480 ) tương đương về mặt toán học để nói rằng một số cột là kết hợp tuyến tính của các cột khác, nhưng bạn có thể Tôi không chọn ra một cột và nói rằng đây là cột phụ thuộc tuyến tính. Vì vậy, không có quy trình để thực hiện việc này và quy trình được đề xuất sẽ chọn một bảo mật khá tùy ý tùy thuộc vào thứ tự chúng được bao gồm. q<480q<480
NRH

Ma trận hiệp phương sai là đối xứng. Nó được tạo ra bởi transpose (A) * A. Ma trận A có kích thước 480x502. Tuy nhiên, ma trận hiệp phương sai là 480x480
Ram Ahluwalia

Câu trả lời:


6

Bạn dường như đặt ra một câu hỏi thực sự gây kích động: làm thế nào để phát hiện, đưa ra một ma trận tương quan số ít (hoặc hiệp phương sai hoặc tổng bình phương và sản phẩm chéo), cột nào phụ thuộc tuyến tính vào đó. Tôi dự kiến ​​rằng hoạt động quét có thể giúp đỡ. Đây là thăm dò của tôi trong SPSS (không phải R) để minh họa.

Hãy tạo một số dữ liệu:

        v1        v2        v3         v4          v5
    -1.64454    .35119   -.06384    -1.05188     .25192
    -1.78520   -.21598   1.20315      .40267    1.14790
     1.36357   -.96107   -.46651      .92889   -1.38072
     -.31455   -.74937   1.17505     1.27623   -1.04640
     -.31795    .85860    .10061      .00145     .39644
     -.97010    .19129   2.43890     -.83642    -.13250
     -.66439    .29267   1.20405      .90068   -1.78066
      .87025   -.89018   -.99386    -1.80001     .42768
    -1.96219   -.27535    .58754      .34556     .12587
    -1.03638   -.24645   -.11083      .07013    -.84446

Hãy tạo một số phụ thuộc tuyến tính giữa V2, V4 và V5:

compute V4 = .4*V2+1.2*V5.
execute.

Vì vậy, chúng tôi đã sửa đổi cột V4 của chúng tôi.

matrix.
get X. /*take the data*/
compute M = sscp(X). /*SSCP matrix, X'X; it is singular*/
print rank(M). /*with rank 5-1=4, because there's 1 group of interdependent columns*/
loop i= 1 to 5. /*Start iterative sweep operation on M from column 1 to column 5*/
-compute M = sweep(M,i).
-print M. /*That's printout we want to trace*/
end loop.
end matrix.

Các bản in của M trong 5 lần lặp:

M
     .06660028    -.12645565    -.54275426    -.19692972    -.12195621
     .12645565    3.20350385    -.08946808    2.84946215    1.30671718
     .54275426    -.08946808    7.38023317   -3.51467361   -2.89907198
     .19692972    2.84946215   -3.51467361   13.88671851   10.62244471
     .12195621    1.30671718   -2.89907198   10.62244471    8.41646486

M
     .07159201     .03947417    -.54628594    -.08444957    -.07037464
     .03947417     .31215820    -.02792819     .88948298     .40790248
     .54628594     .02792819    7.37773449   -3.43509328   -2.86257773
     .08444957    -.88948298   -3.43509328   11.35217042    9.46014202
     .07037464    -.40790248   -2.86257773    9.46014202    7.88345168

M
    .112041875    .041542117    .074045215   -.338801789   -.282334825
    .041542117    .312263922    .003785470    .876479537    .397066281
    .074045215    .003785470    .135542964   -.465602725   -.388002270
    .338801789   -.876479537    .465602725   9.752781632   8.127318027
    .282334825   -.397066281    .388002270   8.127318027   6.772765022

M
   .1238115070   .0110941027   .0902197842   .0347389906   .0000000000
   .0110941027   .3910328733  -.0380581058  -.0898696977  -.3333333333
   .0902197842  -.0380581058   .1577710733   .0477405054   .0000000000
   .0347389906  -.0898696977   .0477405054   .1025348498   .8333333333
   .0000000000   .3333333333   .0000000000  -.8333333333   .0000000000

M
   .1238115070   .0110941027   .0902197842   .0347389906   .0000000000
   .0110941027   .3910328733  -.0380581058  -.0898696977   .0000000000
   .0902197842  -.0380581058   .1577710733   .0477405054   .0000000000
   .0347389906  -.0898696977   .0477405054   .1025348498   .0000000000
   .0000000000   .0000000000   .0000000000   .0000000000   .0000000000

Lưu ý rằng cuối cùng cột 5 có đầy đủ các số không. Đây phương tiện (như tôi hiểu nó) mà V5 là tuyến tính gắn với một số preceeding cột. Những cột nào? Nhìn vào lần lặp trong đó cột 5 không phải là số 0 - lặp đi lặp lại 4. Chúng ta thấy rằng V5 được gắn với V2 và V4 với các hệ số -.3333 và .8333: V5 = -.3333 * V2 + .8333 * V4, tương ứng với những gì chúng tôi đã làm với dữ liệu: V4 = .4 * V2 + 1.2 * V5.

Đó là cách chúng tôi biết cột nào được liên kết tuyến tính với cột nào khác. Tôi đã không kiểm tra mức độ hữu ích của phương pháp trên trong trường hợp tổng quát hơn với nhiều nhóm phụ thuộc lẫn nhau trong dữ liệu. Trong ví dụ trên, nó có vẻ hữu ích.


Đây không phải là hình thức hồi âm hàng giảm? Nếu vậy, không có gói / chức năng có sẵn trong R?
Arun

@Arun, tôi không phải là người dùng R nên không thể biết.
ttnphns

25

Đây là một cách tiếp cận đơn giản: tính thứ hạng của ma trận dẫn đến việc loại bỏ từng cột. Các cột, khi bị loại bỏ, dẫn đến thứ hạng cao nhất là các cột phụ thuộc tuyến tính (vì loại bỏ các cột không làm giảm thứ hạng, trong khi loại bỏ một cột độc lập tuyến tính thì không).

Trong R:

rankifremoved <- sapply(1:ncol(your.matrix), function (x) qr(your.matrix[,-x])$rank)
which(rankifremoved == max(rankifremoved))

1
Câu trả lời cực kỳ hữu ích trong việc xác định cột vi phạm trong ma trận hồi quy nơi tôi đã nhận được lỗi system is exactly singular: U[5,5] = 0 , mà bây giờ tôi biết có nghĩa là cột 5 là vấn đề (có vẻ rõ ràng với nhận thức là một cột số không!)
Matt Weller

Trong bình luận của James, anh ấy đã đăng kịch bản: rankifremond <- sapply (1: ncol (your.matrix), function (x) qr (your.matrix [, - x]) $ rank) mà (rankifremond == max ( xếp hạng)) Tôi đã làm một bài kiểm tra trên một ma trận, tôi muốn biết về đầu ra của R. Các cột của đầu ra phụ thuộc tuyến tính? Cảm tạ!

@ EltonAraújo: Đầu ra sẽ là một vectơ đưa ra các chỉ số của các cột phụ thuộc tuyến tính: vì vậy (2,4,5) cho ví dụ trong câu trả lời của ttnphns. Nhưng tôi tự hỏi làm thế nào các vấn đề về độ chính xác số sẽ ảnh hưởng đến phương pháp này.
Scortchi - Tái lập Monica

Thứ hạng chứa tất cả các cột phụ thuộc tuyến tính giữa chúng hoặc giữa chúng. Trong một số ứng dụng, chúng tôi có thể muốn giữ lại một cột hoặc một vài cột và không bỏ tất cả
MasterJedi

Không nên trả lại một bộ trống cho your.matrix = matrix(1:4, 2)?
Holger Brandl

15

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 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

Các kết quả

Đầ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

00ABCDE

Đầ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.


Wow, đây là những gì tôi hiểu từ phản hồi của bạn..theo các biến của tôi chống lại bất kỳ biến nào khác. Sử dụng VIF để sau đó các biến liên quan đến ID..đây hoạt động. Là tốt nhất để làm điều này với khối dữ liệu tại một thời điểm? Ngoài ra, bạn có loại bỏ bất cứ điều gì nếu bạn phát hiện ra colinearity bằng hồi quy trước không? .. Từ những gì tôi hiểu về PCA nói chung là bạn sử dụng các PC lớn nhất (giải thích hầu hết phương sai) dựa trên các giá trị riêng vì chúng giải thích hầu hết các phương sai độ sử dụng các biến ban đầu. Tôi không chắc chắn về những gì tải nhỏ và những gì họ đang ở cùng với
Samuel

Câu trả lời này giải thích làm thế nào để giải thích các thành phần nhỏ: chúng thể hiện các cộng tuyến. Có, bạn có thể sử dụng các nhóm con của biến nếu bạn muốn. Phương pháp hồi quy chỉ là để phát hiện sự hiện diện của cộng tuyến, không xác định mối quan hệ cộng tuyến: đó là những gì PCA làm.
whuber

"loadings," which are linear combinations of the original variablesAA1

Ngoài ra, tôi có thể yêu cầu bạn để lại ý kiến ​​của mình về khả năng sử dụng thao tác quét ( stats.stackexchange.com/a/16391 / 3277 ) trong nhiệm vụ theo dõi các tập hợp con phụ thuộc tuyến tính của các biến không?
ttnphns

XX=UWVVprincompXV=UWWUW0XVX


3

Tôi đã gặp vấn đề này khoảng hai tuần trước và quyết định rằng tôi cần phải xem lại nó bởi vì khi xử lý các tập dữ liệu lớn, không thể thực hiện những việc này một cách thủ công.

Tôi đã tạo một vòng lặp for () để tính thứ hạng của ma trận một cột tại một thời điểm. Vì vậy, đối với lần lặp đầu tiên, thứ hạng sẽ là 1. Lần thứ hai, 2. Điều này xảy ra cho đến khi thứ hạng trở nên ÍT hơn số cột bạn đang sử dụng.

Rất đơn giản:

for (i in 1:47) {

  print(qr(data.frame[1:i])$rank) 
  print(i) 
  print(colnames(data.frame)[i])
  print("###") 
}

phân tích vòng lặp for ()

  1. tính thứ hạng cho cột thứ i
  2. in số lần lặp
  3. in tên cột để tham khảo
  4. chia bàn điều khiển với "###" để bạn có thể dễ dàng cuộn qua

Tôi chắc chắn rằng bạn có thể thêm một câu lệnh if, tôi chưa cần đến nó bởi vì tôi chỉ xử lý 50 cột.

Hi vọng điêu nay co ich!


2
Mặc dù về mặt lý thuyết không có gì sai, đây là một thuật toán không ổn định về số lượng và không hiệu quả. Đặc biệt với số lượng lớn các cột, nó có thể không phát hiện được cộng tuyến và phát hiện sai sự cộng tuyến không tồn tại.
whuber

2

Xếp hạng, r của ma trận = số cột độc lập tuyến tính (hoặc hàng) của ma trận. Đối với a n theo n ma trận A , thứ hạng (A) = n => tất cả các cột (hoặc hàng) là độc lập tuyến tính.


2

Không phải là câu trả lời @Whuber đưa ra thực sự cần được mở rộng nhưng tôi nghĩ tôi sẽ cung cấp một mô tả ngắn gọn về toán học.

Nếu kết hợp tuyến tính X'Xv= =0 cho v0 sau đó v là một người bản địa của X'X liên kết với giá trị bản địa λ= =0. Các giá trị riêng và giá trị riêng củaX'X cũng là các hàm riêng và giá trị riêng của X, vì vậy người bản địa của X'X liên kết với giá trị bản địa gần λ= =0đại diện cho các hệ số cho mối quan hệ tuyến tính gần đúng giữa các biến hồi quy. Phân tích thành phần chính cho ra các hàm riêng và giá trị riêng củaX'X, vì vậy bạn có thể sử dụng các hàm riêng v kết hợp với nhỏ λ để xác định xem mối quan hệ tuyến tính có tồn tại giữa một số biến hồi quy của bạn không.

Một phương pháp xác định xem giá trị riêng có nhỏ một cách thích hợp để tạo thành cộng tuyến hay không là sử dụng Chỉ số điều kiện:

κj= =λmmộtxλj
đo kích thước của các giá trị riêng nhỏ nhất so với lớn nhất. Một nguyên tắc chung là tính đa hình khiêm tốn có liên quan đến chỉ số điều kiện trong khoảng từ 100 đến 1.000 trong khi tính đa hình nghiêm trọng có liên quan đến chỉ số điều kiện trên 1.000 (Montgomery, 2009).

Điều quan trọng là sử dụng một phương pháp thích hợp để xác định xem giá trị riêng có nhỏ hay không bởi vì nó không phải là kích thước tuyệt đối của giá trị riêng, đó là kích thước tương đối của chỉ số điều kiện quan trọng, như có thể thấy trong một ví dụ. Hãy xem xét ma trận

X'X= =[0,0010000,0010000,001].
Các giá trị riêng cho ma trận này là λ1= =λ2= =λ3= =0,001. Mặc dù các giá trị riêng này xuất hiện nhỏ, chỉ số điều kiện là
κ= =λmmộtxλmtôin= =1
cho thấy không có đa bạch cầu và trên thực tế, các cột của ma trận này là độc lập tuyến tính.

Trích dẫn

Montgomery, D. (2012). Giới thiệu về phân tích hồi quy tuyến tính, phiên bản 5. John Wiley & Sons Inc.


1
Sử dụng các chỉ số điều kiện là một ý tưởng tốt (+1). Tôi chỉ muốn chỉ ra hai điều. Đầu tiên, nó sẽ ổn định hơn về mặt số lượng và có liên quan trực tiếp hơn để tính toán các đối ứng của chúng: chia mỗi giá trị riêng cho tất cả các giá trị lớn nhất và xem nó gần bằng không. Thứ hai (đề cập đến cuộc thảo luận ban đầu của bạn), trừ khiXlà hình vuông, nó không thể có giá trị riêng hoặc hàm riêng: khái niệm này không có ý nghĩa đối với ma trận không vuông.
whuber

Tại sao bạn không thực hiện một QR-Phân tích X (có thể là n bởi k, n>>k)? Bất kỳ thiếu sót cấp bậc củaX cũng ở trong R on which you could perform the aforementioned eigenvalue-decomposition to detect linear dependent columns (which are easy identified even under pivoting) - this is the reference: page 179 of Wood Generalized Additive Models an Introduction with R.
Druss2k
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.