행렬 열 사이의 선형 의존성 테스트


26

결정 요인이 0 인 보안 수익의 상관 관계 행렬이 있습니다. (이는 샘플 상관 행렬과 해당 공분산 행렬이 이론적으로 양의 명확한 값이어야하기 때문에 약간 놀라운 일입니다.)

내 가설은 적어도 하나의 보안이 다른 유가 증권에 선형 적으로 의존한다는 것입니다. R에 선형 의존성을 위해 각 열의 행렬을 순차적으로 테스트하는 함수가 있습니까?

예를 들어, 한 가지 접근 방식은 한 번에 하나의 보안 관계 행렬을 작성하고 각 단계에서 결정자를 계산하는 것입니다. 결정자가 0 일 때 다른 유가 증권의 선형 조합 인 유가 증권을 식별 한대로 중지하십시오.

이러한 매트릭스에서 선형 의존성을 식별하는 다른 기술이 인정된다.


행렬은 양의 반 정밀도입니다. 단수이기 때문에 양의 한정은 아닙니다.
ttnphns

치수는 무엇입니까 (변수 없음, 샘플 없음)?
Karl

열 수 = 480. 각 시계열에 대한 행 수 = 502. 일반적으로 표본 공분산 행렬의 시계열이 클수록 양의 한정된 경향이 있음을 알 수 있습니다. 그러나 최근 시장 상황을 반영하기 위해 T 값이 기하 급수적으로 (또는 기하 급수적으로) 많이 사용하려는 경우가 많습니다.
Ram Ahluwalia

3
문제는 잘못된 것입니다. 데이터 행렬이 480 x 502 인 경우 행렬의 순위가 (매트릭스의 열 공간의 차원이 )라고 말하는 것은 일부 열이 다른 열의 선형 조합이라고 말하는 것과 수학적으로 같습니다. 하나의 열을 선택하지 말고 이것이 선형 적으로 종속적 인 열이라고 말하십시오. 따라서이 작업을 수행하는 절차가 없으며 제안 된 절차는 포함 된 순서에 따라 상당히 임의의 보안을 선택합니다. q < 480q<480q<480
NRH

공분산 행렬은 대칭입니다. transpose (A) * A에 의해 생성됩니다. 행렬 A의 크기는 480x502입니다. 그러나 공분산 행렬은 480x480입니다
Ram Ahluwalia

답변:


6

단 하나의 상관 관계 (또는 공분산 또는 제곱합과 교차 곱) 행렬을 사용하여 어떤 열에 어떤 열이 의존하는지 감지하는 방법을 실제로 자극하는 질문을하는 것 같습니다. 나는 스윕 작업 이 도움이 될 것이라고 잠정적으로 생각합니다 . 다음은 SPSS (R이 아닌)의 프로브입니다.

몇 가지 데이터를 생성하자 :

        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

V2, V4 및 V5간에 선형 종속성을 작성해 보겠습니다.

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

따라서 V4 열을 수정했습니다.

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.

5 회 반복으로 M의 인쇄물 :

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

결국 열 5는 0으로 가득 차 있습니다. 이것은 V5가 일부 선행 열과 선형으로 묶여 있음을 의미 합니다. 어떤 열? 열 5가 마지막으로 0으로 채워지지 않은 반복을보십시오. 반복 4 데이터로 수행 한 작업 : V4 = .4 * V2 + 1.2 * V5.

이것이 우리가 어떤 컬럼이 다른 컬럼과 선형으로 묶여 있는지를 알 수있는 방법입니다. 데이터의 많은 상호 의존성 그룹에서 더 일반적인 경우 위의 접근 방식이 얼마나 유용한 지 확인하지 못했습니다. 위의 예에서 도움이되는 것처럼 보입니다.


줄이 줄어든 형태입니까? 그렇다면 R에서 사용할 수있는 패키지 / 기능이 없습니까?
Arun

@ Arun, 나는 R 사용자가 아니므로 알 수 없습니다.
ttnphns

25

다음은 간단한 접근 방식입니다. 각 열을 제거하여 발생하는 행렬의 순위를 계산하십시오. 제거 할 때 최고 순위를 초래하는 열은 선형 종속 열입니다 (선형 독립 열을 제거하는 동안 순위를 줄이지 않고 순위를 줄임).

R에서 :

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

1
내가 오류받은 경우 회귀 행렬의 기분을 상하게 열을 결정하는데 상당히 유용한 답변 system is exactly singular: U[5,5] = 0 지금 열 다섯 문제였다 수단을 알고, (이 제로의 열의로 돌이켜와 분명한 것 같다!)
매트 웰러

James의 의견에 그는 다음 스크립트를 게시했습니다 : rankifremoved <-sapply (1 : ncol (your.matrix), function (x) qr (your.matrix [,-x]) $ rank) which (rankifremoved == max ( rankifremoved)) 행렬에 대한 테스트를했는데 R의 출력에 대해 알고 싶습니다. 출력의 열은 선형으로 의존합니까? 감사!

@ EltonAraújo : 출력은 선형 종속 열의 인덱스를 제공하는 벡터입니다. 따라서 ttnphns의 답변에 대한 예는 (2,4,5)입니다. 그러나 수치 정밀도 문제 가이 방법에 어떤 영향을 미칠지 궁금합니다.
Scortchi-Monica Monica 복원

rankifremoved에는 열 간 또는 열간에 선형으로 종속 된 모든 열이 포함됩니다. 일부 응용 프로그램에서는 열 또는 몇 개의 열을 유지하고 모두 삭제하지 않을 수 있습니다.
MasterJedi

이것에 대해 빈 세트를 반환해서는 안 your.matrix = matrix(1:4, 2)됩니까?
Holger Brandl

15

이 질문은 변수들 사이의 "기본 [선형] 관계 식별"에 대해 묻습니다.

관계 를 감지 하는 빠르고 쉬운 방법 은 자주 사용하는 소프트웨어를 사용하여 해당 변수에 대해 다른 변수를 일정하게 사용하는 것입니다. (회귀 결과를 보더라도 귀찮게하지 않을 것입니다. 우리는 회귀 행렬을 설정하고 분석하는 데 유용한 부작용에 의존하고 있습니다.)

0

(“작은”하중이 무엇인지 식별하는 것과 관련된 기술과 상당히 많은 문헌이 있습니다. 종속 변수를 모델링하려면 구성 요소를 식별하기 위해 PCA의 독립 변수에 포함시키는 것이 좋습니다. 종속 변수가 중요한 역할을하는 크기 (이러한 관점에서 "작은"은 그러한 구성 요소보다 훨씬 작다는 의미입니다.)


몇 가지 예를 살펴 보겠습니다. (이 R계산 및 플로팅에 사용합니다.) PCA를 수행하고 작은 구성 요소를 찾고 구성하며 이들 간의 선형 관계를 리턴하는 함수로 시작하십시오.

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

B,C,D,EA

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

결과

왼쪽 상단 패널과 관련된 출력은

       A  B  C  D  E
Comp.5 1 -1 -1 -1 -1

00ABCDE

상단 중간 패널의 출력은

       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

1,1/2,1/2,1

실제로, 하나의 변수가 다른 변수의 명백한 조합으로 분류되는 경우는 종종 없습니다. 모든 계수는 크기가 다양하고 부호가 다를 수 있습니다. 또한 관계의 차원이 둘 이상인 경우 관계를 지정하는 고유 한 방법이 없습니다. 이러한 관계에 대한 유용한 기초를 식별하려면 추가 분석 (예 : 행 축소)이 필요합니다. 그것이 세상이 작동하는 방식입니다. PCA가 출력 하는 이러한 특정 조합은 데이터의 변화와 거의 일치하지 않는다는 것입니다. 이에 대처하기 위해, 어떤 사람들은 어떤 형태를 취하더라도 회귀 분석 또는 후속 분석에서 가장 큰 ( "주체") 성분을 독립 변수로 직접 사용합니다. 이를 수행하는 경우 먼저 변수 세트에서 종속 변수를 제거하고 PCA를 다시 실행하는 것을 잊지 마십시오!


이 그림을 재현하는 코드는 다음과 같습니다.

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

(단일 구성 요소 만 표시하기 위해 큰 오류의 경우 임계 값을 조정해야했습니다 process. 이 값을에 매개 변수로 제공하는 이유입니다 .)


사용자 ttnphns는 밀접하게 관련된 스레드에 관심을 기울였습니다. JM의 답변 중 하나가 여기에 설명 된 접근 방식을 제안합니다.


와우, 여기 내가 당신의 응답에서 이해하는 것이 있습니다. 다른 변수에 대해 변수를 회귀하십시오. VIF를 사용하여 관련 변수를 식별하십시오. 한 번에 여러 덩어리의 데이터로이 작업을 수행하는 것이 가장 좋습니까? 또한 회귀 분석을 사용하여 동일 선상 성을 탐지하면 무엇을 제거합니까? .. PCA에 대해 일반적으로 이해하는 바에 따르면 가장 큰 차이를 설명하는 고유 값을 기반으로 가장 큰 PC (대부분의 편차를 설명 함)를 사용한다는 것입니다. 원래 변수를 사용하여도. 어떤 작은 하중과 그것들이 동일 선상에 있는지 확실하지 않습니다
Samuel

이 답변은 작은 구성 요소를 해석하는 방법을 설명합니다. 구성 요소는 공선 성을 나타냅니다. 예, 원하는 경우 하위 그룹의 변수를 사용할 수 있습니다. 회귀 방법은 공선 관계를 식별하는 것이 아니라 공선 성 을 감지 하는 것입니다. PCA가하는 일입니다.
whuber

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

또한 선형 종속 변수의 하위 집합을 추적하는 작업에서 스윕 작업 ( stats.stackexchange.com/a/16391/3277 ) 사용에 대한 의견을 남겨 주 시겠습니까?
ttnphns

XX=UWVVprincompXV=UWWUW0XVX


3

나는 대략 2 주 전에이 문제에 부딪 쳤고 대량의 데이터 세트를 처리 할 때 이러한 작업을 수동으로 수행 할 수 없기 때문에 다시 방문해야한다고 결정했습니다.

한 번에 한 열씩 행렬의 순위를 계산하는 for () 루프를 만들었습니다. 따라서 첫 번째 반복의 경우 순위는 1이됩니다. 두 번째, 2. 이것은 순위가 사용중인 열 번호보다 LESS가 될 때까지 발생합니다.

매우 간단합니다.

for (i in 1:47) {

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

for () 루프 분석

  1. i 번째 열의 순위를 계산합니다
  2. 반복 번호를 인쇄합니다
  3. 참조 할 열 이름을 인쇄합니다.
  4. 콘솔을 "###"으로 나누면 쉽게 스크롤 할 수 있습니다.

if 문을 추가 할 수 있다고 확신합니다 .50 개의 열만 처리하기 때문에 아직 필요하지 않습니다.

이것이 도움이되기를 바랍니다!


2
이론적으로는 아무런 문제가 없지만 수치 적으로 불안정하고 비효율적 인 알고리즘입니다. 특히 많은 수의 열을 사용하면 거의 공선 성을 감지하지 못하고 존재하지 않는 공선 성을 잘못 감지 할 수 있습니다.
whuber

2

행렬의 순위, r = 행렬의 선형 독립 열 (또는 행) 수입니다. A에 대한 N 개의 의한 N 행렬 , 계수 (A) = N => 전체 열 (또는 행)이 선형 독립이다.


2

@Whuber가 제공 한 답변을 실제로 확장 해야하는 것은 아니지만 수학에 대한 간단한 설명을 제공 할 것이라고 생각했습니다.

XXv=0v0vXXλ=0XXXXXλ=0XXvλ

κj=λmaxλj

XX=[0.0010000.0010000.001].
λ1=λ2=λ3=0.001
κ=λmaxλmin=1

인용

Montgomery, D. (2012). 선형 회귀 분석 소개, 5 판. 존 와일리 & 선즈


1
X

QRXnkn>>kXR
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.