Bir matrisin kolonları arasında doğrusal bağımlılık testi


26

Belirleyicisi sıfır olan bir güvenlik getirisi korelasyon matrisine sahibim. (Örnek korelasyon matrisi ve karşılık gelen kovaryans matrisi teorik olarak pozitif olarak kesin olmalıdır, çünkü bu biraz şaşırtıcıdır.)

Hipotezim, en az bir güvenliğin doğrusal olarak diğer menkul kıymetlere bağlı olduğudur. R'de, her bir sütunu sıralı olarak doğrusal bağımlılık için bir matris test eden bir işlev var mı?

Örneğin, bir yaklaşım bir seferde bir güvenlik korelasyon matrisi oluşturmak ve her adımda determinantı hesaplamak olacaktır. Belirleyici = 0 olduğunda, diğer menkul kıymetlerin doğrusal bir birleşimi olan güvenliği tanımladığınız gibi durun.

Böyle bir matristeki lineer bağımlılığı tanımlamak için herhangi başka bir teknik takdir edilmektedir.


Matrisiniz yarı kesin pozitif, kesin değil, tekil olduğu için kesin.
ttnphns

Boyutlar nelerdir (no. Değişkenler; no. Örnekler)?
Karl

Sütun sayısı = 480. Her zaman dizisi için satır sayısı = 502. Genel olarak, zaman dizisi ne kadar büyükse, örnek kovaryans matrisinin pozitif olarak kesinleşme eğiliminde olduğunu görürsünüz. Bununla birlikte, son piyasa koşullarını yansıtmak için önemli ölçüde daha küçük bir T değeri (veya katlanarak ağırlık) kullanmak istediğiniz birçok durum vardır.
Ram Ahluwalia

3
Soru yanlış yazılmış. Eğer veri matrisiniz 480 x 502 ise, o zaman matrisin (matrisin sütun alanı boyutundadır ) olduğunu söylemek, bazı sütunların diğerlerinin lineer bir kombinasyonu olduğunu söylemeye matematiksel olarak eşittir, ancak bir sütun seçmeyin ve bunun doğrusal olarak bağımlı olan sütun olduğunu söyleyin. Bu nedenle, bunu yapmak için hiçbir prosedür yoktur ve önerilen prosedür dahil edildikleri sıraya göre oldukça keyfi bir güvenlik seçecektir. q < 480q<480q<480
NRH

Kovaryans matrisi simetriktir. Transpozisyon (A) * A ile üretilir. A matrisi 480x502 boyutlarına sahiptir. Ancak kovaryans matrisi 480x480
Ram Ahluwalia

Yanıtlar:


6

Gerçekten kışkırtıcı bir soru soruyor gibi görünüyorsunuz: hangi sütunun lineer olarak bağımlı olduğu tekil bir korelasyon (veya kovaryans veya karelerin toplamı ve çarpım çarpımı) matrisinin nasıl algılanacağı. Geçici olarak tarama işleminin yardımcı olabileceğini düşünüyorum. Örneklemek için SPSS'deki (R değil) probum.

Hadi biraz veri üretelim:

        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 ve V5 arasında bazı doğrusal bağımlılık yaratalım:

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

Böylece sütun V4'ü değiştirdik.

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 yinelemede M çıktıları:

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

Sonunda 5. sütunun sıfırlarla dolu olduğuna dikkat edin. Bu, (anladığım kadarıyla) V5'in bazı önceki sütunlarla doğrusal olarak bağlı olduğu anlamına gelir . Hangi sütunlar? Sütun 5'in en son sıfırlarla dolu olmadığı yinelemeye bakın - yineleme 4. Orada V5'in -2333 ve .8333 katsayıları ile V2 ve V4 ile bağlı olduğunu görüyoruz: V5 = -.3333 * V2 + .8333 * V4, Verilerle yaptığımız şeye: V4 = .4 * V2 + 1.2 * V5.

Hangi kolonun diğerine hangi lineer olarak bağlı olduğunu bu şekilde biliyorduk. Verilerdeki birçok meslektaş grubu ile daha genel bir durumda yukarıdaki yaklaşımın ne kadar yararlı olduğunu kontrol etmedim. Yukarıdaki örnekte olsa da, yararlı göründü.


Bu azaltılmış sıra kademe formu değil mi? Öyleyse, R içinde paketler / işlevler yok mu?
Arun,

@Arun, ben R kullanıcı değilim bu yüzden bilemiyorum.
ttnphns

25

İşte basit bir yaklaşım: her bir sütunun kaldırılmasından kaynaklanan matrisin derecesini hesaplayın. Kaldırıldığında, en yüksek sırayla sonuçlanan sütunlar doğrusal olarak bağımlı sütunlardır (çünkü bunları kaldırmak sıralamayı düşürmez, doğrusal olarak bağımsız bir sütunu kaldırır).

R'de:

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 Şu an bildiğim hatayı aldığım bir regresyon matrisindeki rahatsız edici sütunun belirlenmesinde oldukça yararlı bir cevap, şimdi 5 numaralı sütunun sorun olduğu anlamına geliyor (sanki sıfırdan yapılmış bir sütun gibi açık havada görünüyor!)
Matt Weller

James'in yorumuna şöyle yazdı: rankifremoved <- sapply (1: ncol (your.matrix), function (x) qr (your.matrix [, - x]) $ rank hangi rankfremoved == max ( rankifremoved)) Bir matris üzerinde bir test yaptım, R'nin çıktısını bilmek istiyorum. Çıktının sütunları doğrusal olarak mı bağımlı? Teşekkür!

@ EltonAraújo: Çıktı, lineer bağımlı sütunların indekslerini veren bir vektör olacaktır: yani ttnphns'in cevabındaki örnek için (2,4,5). Ancak sayısal hassasiyet konularının bu yöntemi nasıl etkileyeceğini merak ediyorum.
Scortchi

rankifremoved, aralarında veya aralarında doğrusal olarak bağımlı olan tüm sütunları içerir. Bazı uygulamalarda, bir sütunu veya birkaç sütunu tutmak ve hepsini
bırakmamak isteyebiliriz

Bunun için boş bir set geri dönmemeli your.matrix = matrix(1:4, 2)mi?
Holger Brandl

15

Soru değişkenler arasında "temel [doğrusal] ilişkilerin belirlenmesi" hakkında sorular sorar.

İlişkileri saptamanın hızlı ve kolay yolu , favori yazılımınızı kullanarak bu değişkenlere karşı başka bir değişkeni (bir sabit, hatta) kullanmaktır: herhangi bir iyi regresyon prosedürü, eşitliğini tespit eder ve teşhis eder. (Regresyon sonuçlarına bakmak bile zahmet etmeyecek: regresyon matrisini oluşturmanın ve analiz etmenin yararlı bir yan etkisine güveniyoruz.)

Eşdoğrusallığın tespit edildiğini varsayarsak, sonra ne olacak? Temel Bileşenler Analizi (PCA) tam olarak gerekli olan şeydir: en küçük bileşenleri doğrusal-doğrusal ilişkilere karşılık gelir. Bu ilişkiler doğrudan orijinal değişkenlerin doğrusal kombinasyonları olan "yüklemelerden" doğrudan okunabilir. Küçük yükler (yani, küçük özdeğerlerle ilişkilendirilenler), collinsearities'e karşılık gelir. bir öz değeri mükemmel bir doğrusal ilişkiye karşılık gelir. Hala en büyüğünden çok daha küçük olan özdeğerler, yaklaşık doğrusal ilişkilere karşılık gelir.0

("Küçük" bir yükün ne olduğunu belirleme ile ilgili bir sanat ve oldukça fazla literatür var. Bağımlı bir değişkeni modellemek için, bileşenleri tanımlamak için - PCA'daki bağımsız değişkenlere dahil etmeyi öneriyorum. boyutları - bağımlı değişken önemli bir rol oynar. Bu açıdan "küçük" herhangi bir bileşenden çok daha küçük anlamına gelir.)


Bazı örneklere bakalım. (Bu Rhesaplamalar ve çizim için kullanılırlar.) PCA'yı gerçekleştirme işlevi, küçük bileşenler arayın, bunları işaretleyin ve aralarındaki doğrusal ilişkileri döndürün.

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

Bunu bazı rasgele verilere uygulayalım. Bunlar dört değişken üzerine inşa edilmiştir ( sorunun ve ). İşte diğerlerinin verilen lineer bir kombinasyonu olarak hesaplamak için küçük bir fonksiyon . Daha sonra iid Normalde dağıtılmış değerleri beş değişkenin tümüne ekler (çoklu doğrusallık sadece yaklaşık olduğunda ve tam olmadığında prosedürün ne kadar iyi performans gösterdiğini görmek için).B,C,D,EA

process <- function(z, beta, sd, ...) {
  x <- z %*% beta; colnames(x) <- "A"
  pca(cbind(x, z + rnorm(length(x), sd=sd)), ...)
}

Hepimiz gitmeye hazırız: sadece ve bu prosedürleri uygulamak için kalır . Soruda açıklanan iki senaryoyu kullanıyorum: (artı her birinde bazı hatalar) ve (artı her birinde bazı hatalar). İlk önce, PCA'nın neredeyse her zaman merkezlenmiş verilere uygulandığını unutmayın; bu nedenle bu benzetilmiş veriler kullanarak ortalanır (ancak başka bir şekilde ölçeklendirilmez) .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

Burada iki senaryo ve her birine üç hata seviyesi uygulandı. orijinal değişkenleri değişiklik yapılmadan korunur: sadece ve hata terimleri değişir.B,,EA

Sonuçlar

Sol üst panel ile ilgili çıktı

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

Bu, sürekli olarak , mükemmel bir çoklu doğrusallık sergileyen kırmızı nokta sırasının, : tam olarak belirtilenin kombinasyonundan oluştuğunu .00ABCDE

Üst orta panelin çıkışı

       A     B     C     D     E
Comp.5 1 -0.95 -1.03 -0.98 -1.02

Katsayılar hala beklediklerimize yakın, ancak ortaya konan hata nedeniyle tam olarak aynı değiller. Dört boyutlu hiper düzlemi ima ettiği beş boyutlu uzayda kalınlaştırdı ve tahmin edilen yönü biraz eğdi. Daha fazla hata ile kalınlaşma, noktaların orijinal yayılmasıyla karşılaştırılabilir hale gelir ve bu da hiper düzlemi tahmin etmek neredeyse imkansız hale getirir. Şimdi (sağ üst panelde) katsayılar(A,B,C,D,E)

       A     B     C     D     E
Comp.5 1 -1.33 -0.77 -0.74 -1.07

Bu biraz değiştirdi ama yine de altta yatan temel ilişki yansıtacak olan asal çıkarıldı (bilinmeyen) hata değerlerini belirtmektedir.A=B+C+D+E

Alt sıra aynı şekilde yorumlanır ve çıktısı benzer şekilde katsayılarını yansıtır .1,1/2,1/2,1

Uygulamada, genellikle bir değişkenin diğerlerinin açık bir birleşimi olarak seçildiği durum söz konusu değildir: tüm katsayılar karşılaştırılabilir boyutlarda ve değişken işaretlerde olabilir. Ayrıca, birden fazla ilişki boyutu olduğunda, onları belirtmenin benzersiz bir yolu yoktur: bu ilişkilerin faydalı bir temelini belirlemek için daha fazla analiz (satır azaltma gibi) gereklidir. Dünya böyle işler: Söyleyebileceğiniz tek şey, PCA tarafından üretilen bu belirli kombinasyonların verilerdeki neredeyse hiçbir değişikliğe karşılık gelmediğidir. Bununla başa çıkmak için, bazı insanlar ne tür olursa olsun, regresyonda veya daha sonraki analizlerde doğrudan en büyük ("temel") bileşenleri, regresyondaki bağımsız değişkenler olarak kullanırlar. Bunu yaparsanız, önce bağımlı değişkeni değişken kümesinden çıkarmak ve PCA'yı tekrar yapmak için ihmal etmeyin!


İşte bu rakamı çoğaltacak kod:

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

(Yalnızca tek bir bileşeni görüntülemek için büyük hata durumlarında eşik değerine sahip olmam gerekiyordu: bu değeri parametre olarak vermenin nedeni budur process.)


User ttnphns, dikkatimizi yakından ilgili bir konuya yönlendirmiştir. Cevaplarından biri (JM tarafından) burada açıklanan yaklaşımı önerir.


Vay canına, cevabınızdan ne anlıyorum ... değişkenlerimi diğer değişkenlere karşı sürdürün. Daha sonra ID ile ilgili değişkenleri tanımlamak için VIF kullanın. Bunu bir seferde veri parçalarıyla yapmak en iyisi midir? Ayrıca, önceki regresyon kullanarak eş anlamlılığı tespit ederseniz, herhangi bir şeyi kaldırır mısınız? .. PCA hakkında genel olarak anladığım kadarıyla, en değişkenliği açıklayan özdeğerleri temel alan en büyük PC'leri (çoğu varyansı açıklayan) kullanıyor olmanız, bunlar değişkenlik göstermektedir. orijinal değişkenleri kullanarak derece. Hangi küçük yüklerin ne olduğuna bağlı olduklarından emin değilim
Samuel

Bu cevap, küçük bileşenlerin nasıl yorumlanacağını açıklar: ortaklıklar sergilerler. Evet, isterseniz değişkenlerin alt gruplarını kullanabilirsiniz. Regresyon yöntemi sadece etmektir tespit PCA ne olduğunu: Eşdoğrusallık varlığını değil, aynı doğrultudaki ilişkilerini tespit etmektir.
whuber

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

Ayrıca, değişkenlerin doğrusal bağımlı altkümelerinin izlenmesi görevinde süpürme işleminin ( istatistik.stackexchange.com/a/16391/3277 ) kullanılmasıyla ilgili fikrinizi bırakmanızı isteyebilir miyim ?
ttnphns

XX=UWVVprincompXV=UWWUW0XVX


3

Yaklaşık iki hafta önce bu sorunla karşılaştım ve tekrar gözden geçirmem gerektiğine karar verdim, çünkü büyük veri kümeleriyle uğraşırken bunları elle yapmak imkansız.

Her seferinde bir sütunun matrisinin sırasını hesaplayan bir for () döngüsü yarattım. Böylece, ilk tekrarlama için, sıralama 1 olacaktır. İkinci, 2. Bu, sıralama kullandığınız sütun numarasından LESS olana kadar gerçekleşir.

Çok basit:

for (i in 1:47) {

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

() döngü bozulması için

  1. ith sütununun derecesini hesaplar
  2. yineleme numarasını yazdırır
  3. başvuru için sütun adını yazdırır
  4. Konsolu "###" ile böler;

Bir if ifadesi ekleyebileceğinizden eminim, henüz ihtiyacım yok çünkü sadece 50ish sütunlarla ilgileniyorum.

Bu yardımcı olur umarım!


2
Bu teorik olarak yanlış bir şey olmamasına rağmen, sayısal olarak dengesiz ve verimsiz bir algoritmadır. Özellikle çok sayıda sütunla, hiçbirinin olmadığı yerlerde, eşdoğumsuzluğu tespit etmek ve yanlış eşdoğruluğu tespit etmek başarısızlıkla sonuçlanabilir.
whuber

2

Bir matrisin sırası , r = bir matrisin doğrusal olarak bağımsız sütunlarının (veya satırlarının) sayısı. Bir nxn matrisi A için , (A) sırası = n => tüm sütunlar (veya satırlar) doğrusal olarak bağımsızdır.


2

@Whuber'ın verdiği cevabın gerçekten genişletilmesi gerekiyor, ancak matematiğin kısa bir açıklamasını vereceğimi düşündüm.

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

κj=λmaxλj

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

Atıflar

Montgomery, D. (2012). Lineer Regresyon Analizine Giriş, 5. Baskı. John Wiley & Sons Inc.


1
X

QRXnkn>>kXR
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.