Menguji ketergantungan linear di antara kolom-kolom matriks

26

Saya memiliki matriks korelasi pengembalian keamanan yang determinannya nol. (Ini agak mengejutkan karena matriks korelasi sampel dan matriks kovarian yang sesuai secara teoritis pasti positif.)

Hipotesis saya adalah bahwa setidaknya satu sekuritas secara linear tergantung pada sekuritas lainnya. Apakah ada fungsi dalam R yang secara berurutan menguji setiap kolom sebuah matriks untuk ketergantungan linier?

Misalnya, satu pendekatan akan membangun matriks korelasi satu keamanan pada suatu waktu dan menghitung determinan pada setiap langkah. Ketika determinan = 0 maka berhenti ketika Anda telah mengidentifikasi keamanan yang merupakan kombinasi linear dari sekuritas lain.

Setiap teknik lain untuk mengidentifikasi ketergantungan linear dalam matriks semacam itu dihargai.

Ram Ahluwalia
sumber
Matriks Anda adalah semi-pasti positif, meskipun tidak pasti positif, karena singular.
ttnphns
Apa dimensi (tidak. Variabel; tidak. Sampel)?
Karl
Jumlah kolom = 480. # baris untuk setiap deret waktu = 502. Secara umum Anda menemukan bahwa semakin besar deret waktu, matriks kovarians sampel cenderung positif pasti. Namun, ada banyak kasus di mana Anda ingin menggunakan nilai T (atau bobot eksponensial) yang jauh lebih kecil untuk mencerminkan kondisi pasar saat ini.
Ram Ahluwalia
3
Pertanyaannya salah. Jika matriks data Anda adalah 480 oleh 502 maka mengatakan bahwa matriks memiliki peringkat (ruang kolom matriks memiliki dimensi q < 480 ) secara matematis setara dengan mengatakan bahwa beberapa kolom adalah kombinasi linear dari yang lain, tetapi Anda dapat dapat memilih satu kolom dan mengatakan bahwa ini adalah kolom yang bergantung secara linear. Jadi tidak ada prosedur untuk melakukan ini, dan prosedur yang disarankan akan memilih keamanan yang cukup sewenang-wenang tergantung pada urutan mereka dimasukkan. q<480q<480
NRH
Matriks kovarians simetris. Ini dihasilkan oleh transpose (A) * A. Matriks A memiliki dimensi 480x502. Namun matriks kovarians adalah 480x480
Ram Ahluwalia

Jawaban:

6

Anda tampaknya mengajukan pertanyaan yang benar-benar memancing: bagaimana mendeteksi, diberikan korelasi singular (atau kovarians, atau jumlah-dari-kuadrat-dan-lintas-produk) matriks, kolom mana yang secara linear bergantung pada mana. Tentunya saya kira operasi pembersihan dapat membantu. Berikut ini adalah probe saya di SPSS (bukan R) untuk diilustrasikan.

Mari kita menghasilkan beberapa data:

        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

Mari kita buat beberapa ketergantungan linear antara V2, V4 dan V5:

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

Jadi, kami memodifikasi kolom V4 kami.

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.

Cetakan M dalam 5 iterasi:

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

Perhatikan bahwa pada akhirnya kolom 5 penuh dengan nol. Ini berarti (seperti yang saya mengerti) bahwa V5 diikat secara linear dengan beberapa kolom sebelumnya . Kolom mana? Lihatlah iterasi di mana kolom 5 terakhir tidak penuh dengan nol - iterasi 4. Kita melihat di sana bahwa V5 diikat dengan V2 dan V4 dengan koefisien -3,333 dan 0,8333: V5 = -3333 * V2 + .8333 * V4, yang sesuai untuk apa yang telah kami lakukan dengan data: V4 = .4 * V2 + 1.2 * V5.

Begitulah cara kami mengetahui kolom mana yang terikat secara linear dengan kolom lainnya. Saya tidak memeriksa seberapa bermanfaat pendekatan di atas dalam kasus yang lebih umum dengan banyak kelompok saling ketergantungan dalam data. Namun, dalam contoh di atas tampaknya bermanfaat.

ttnphns
sumber
Bukankah ini bentuk eselon baris tereduksi? Jika demikian, bukankah ada paket / fungsi yang tersedia di R?
Arun
@Arun, saya bukan pengguna R jadi tidak bisa tahu.
ttnphns
25

Berikut ini pendekatan langsung: hitung pangkat matriks yang dihasilkan dari menghapus setiap kolom. Kolom yang, ketika dihilangkan, menghasilkan peringkat tertinggi adalah yang bergantung secara linier (karena menghapusnya tidak menurunkan peringkat, sementara menghapus kolom yang bebas linear tidak).

Dalam R:

rankifremoved <- sapply(1:ncol(your.matrix), function (x) qr(your.matrix[,-x])$rank)
which(rankifremoved == max(rankifremoved))
James
sumber
1
Jawaban yang sangat berguna dalam menentukan kolom yang menyinggung dalam matriks regresi di mana saya menerima kesalahan system is exactly singular: U[5,5] = 0 , yang sekarang saya tahu berarti kolom 5 adalah masalah (tampaknya jelas dengan melihat ke belakang karena kolom nol!)
Matt Weller
Dalam komentar James, ia memposting script: rankifremoved <- sapply (1: ncol (your.matrix), function (x) qr (your.matrix [, - x]) $ rank) yang (rankifremoved == max ( rankifremoved)) Saya melakukan tes pada sebuah matriks, saya ingin tahu tentang output dari R. Kolom-kolom dari output tergantung secara linear? Terima kasih!
@ EltonAraújo: Outputnya akan berupa vektor yang memberikan indeks pada kolom yang bergantung linear: so (2,4,5) untuk contoh dalam jawaban ttnphns. Tapi saya bertanya-tanya bagaimana masalah ketepatan angka akan mempengaruhi metode ini.
Scortchi
rankifremoved berisi semua kolom yang bergantung secara linear di antara mereka atau di antara mereka. Dalam beberapa aplikasi, kami mungkin ingin mempertahankan kolom atau beberapa kolom dan tidak menjatuhkan semua
MasterJedi
Bukankah ini seharusnya mengembalikan set kosong untuk your.matrix = matrix(1:4, 2)?
Holger Brandl
15

Pertanyaannya adalah tentang "mengidentifikasi hubungan [linear] yang mendasari" di antara variabel.

Cara cepat dan mudah untuk mendeteksi hubungan adalah dengan regresi variabel lainnya (gunakan konstanta, bahkan) terhadap variabel-variabel tersebut menggunakan perangkat lunak favorit Anda: setiap prosedur regresi yang baik akan mendeteksi dan mendiagnosis kolinearitas. (Anda bahkan tidak akan repot untuk melihat hasil regresi: kami hanya mengandalkan efek samping yang berguna dari pengaturan dan analisis matriks regresi.)

Dengan asumsi collinearity terdeteksi, selanjutnya apa? Principal Components Analysis (PCA) adalah persis apa yang dibutuhkan: komponen terkecilnya berhubungan dengan hubungan linier-dekat. Relasi ini dapat dibaca langsung dari "loadings," yang merupakan kombinasi linear dari variabel asli. Muatan kecil (yaitu, yang terkait dengan nilai eigen kecil) sesuai dengan kolinearitas dekat. Nilai eigen akan sesuai dengan hubungan linear sempurna. Nilai eigen yang sedikit lebih besar yang masih jauh lebih kecil daripada yang terbesar akan sesuai dengan perkiraan hubungan linear.0

(Ada seni dan cukup banyak literatur yang terkait dengan mengidentifikasi apa itu "kecil" loading. Untuk memodelkan variabel dependen, saya akan menyarankan memasukkannya dalam variabel independen di PCA untuk mengidentifikasi komponen - terlepas dari ukurannya - di mana variabel dependen memainkan peran penting. Dari sudut pandang ini, "kecil" berarti jauh lebih kecil daripada komponen semacam itu.)


Mari kita lihat beberapa contoh. (Ini digunakan Runtuk perhitungan dan merencanakan). Mulailah dengan fungsi untuk melakukan PCA, cari komponen kecil, plot mereka, dan kembalikan hubungan linier di antara mereka.

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

Mari kita terapkan ini pada beberapa data acak. Ini dibangun di atas empat variabel ( dan E dari pertanyaan). Berikut adalah sedikit fungsi untuk menghitung A sebagai kombinasi linear yang diberikan dari yang lain. Itu kemudian menambahkan iid nilai-nilai yang didistribusikan secara normal ke semua lima variabel (untuk melihat seberapa baik prosedur melakukan ketika multikolinieritas hanya perkiraan dan tidak tepat).B,C,D,EA

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

Kita siap untuk pergi: tetap hanya untuk menghasilkan dan menerapkan prosedur ini. Saya menggunakan dua skenario yang dijelaskan dalam pertanyaan: A = B + C + D + E (ditambah beberapa kesalahan di masing-masing) dan A = B + ( CB,,EA=B+C+D+E (ditambah beberapa kesalahan di masing-masing). Pertama, bagaimanapun, perhatikan bahwa PCA hampir selalu diterapkanpadadataterpusat, jadi data simulasi ini dipusatkan (tetapi tidak sebaliknya diubah) menggunakan.A=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

Di sini kita pergi dengan dua skenario dan tiga tingkat kesalahan yang diterapkan untuk masing-masing. Variabel asliB,,EA

Hasil

Output yang terkait dengan panel kiri atas adalah

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

00ABCDE

Output untuk panel tengah atas adalah

       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

Dalam praktiknya, seringkali bukan kasus bahwa satu variabel dipilih sebagai kombinasi yang jelas dari yang lain: semua koefisien mungkin dari ukuran yang sebanding dan dari berbagai tanda. Selain itu, ketika ada lebih dari satu dimensi hubungan, tidak ada cara unik untuk menentukannya: analisis lebih lanjut (seperti pengurangan baris) diperlukan untuk mengidentifikasi dasar yang berguna untuk hubungan tersebut. Bahwa ini cara kerja dunia: semua yang Anda bisa katakan adalah bahwa ini kombinasi tertentu yang output dengan PCA sesuai dengan hampir tidak ada variasi dalam data. Untuk mengatasinya, beberapa orang menggunakan komponen terbesar ("pokok") secara langsung sebagai variabel independen dalam regresi atau analisis selanjutnya, dalam bentuk apa pun. Jika Anda melakukan ini, jangan lupa terlebih dahulu untuk menghapus variabel dependen dari set variabel dan ulangi PCA!


Berikut adalah kode untuk mereproduksi gambar ini:

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

(Saya harus mengutak-atik ambang dalam kasus kesalahan besar untuk menampilkan hanya satu komponen: itulah alasan untuk memasok nilai ini sebagai parameter process.)


Pengguna ttnphns telah mengarahkan perhatian kami ke utas terkait erat. Salah satu jawabannya (oleh JM) menyarankan pendekatan yang dijelaskan di sini.

whuber
sumber
Wow, ini yang saya mengerti dari respons Anda..mengatasi variabel saya terhadap variabel lainnya. Gunakan VIF untuk kemudian ID variabel terkait .. ini bekerja. Apakah yang terbaik untuk melakukan ini dengan potongan data sekaligus? Juga apakah Anda menghapus sesuatu jika Anda mendeteksi colinearity menggunakan regresi sebelumnya? .. Dari apa yang saya pahami tentang PCA secara umum adalah bahwa Anda menggunakan PC terbesar (menjelaskan sebagian varian) berdasarkan nilai eigen karena ini menjelaskan sebagian besar varian, ini dimuat ke berbagai derajat menggunakan variabel asli. Saya tidak yakin dengan muatan apa yang kecil dan apa yang mereka colinear
Samuel
Jawaban ini menjelaskan bagaimana menafsirkan komponen kecil: mereka menunjukkan collinearities. Ya, Anda bisa menggunakan subkelompok variabel jika mau. Metode regresi hanya untuk mendeteksi keberadaan collinearity, bukan untuk mengidentifikasi hubungan collinear: itulah yang dilakukan PCA.
whuber
"loadings," which are linear combinations of the original variablesPernyataan ini terlihat tidak tepat. Muatan adalah koefisien kombinasi linear komponen dalam variabel prediksi . Jadi, maksud Anda A - 1AA1 ?
ttnphns
Juga, bolehkah saya meminta Anda meninggalkan pendapat Anda tentang kemungkinan penggunaan operasi sweep ( stats.stackexchange.com/a/16391/3277 ) dalam tugas melacak subset variabel yang bergantung secara linear?
ttnphns
XX=UWVVprincompXV=UWWUW0XVX , seperti yang dinyatakan - semua nol.
whuber
5

502×480

JM bukan ahli statistik
sumber
3

Saya mengalami masalah ini kira-kira dua minggu yang lalu dan memutuskan bahwa saya perlu mengunjunginya kembali karena ketika berhadapan dengan set data besar, tidak mungkin untuk melakukan hal-hal ini secara manual.

Saya membuat for () loop yang menghitung pangkat matriks satu kolom pada suatu waktu. Jadi untuk iterasi pertama, peringkatnya adalah 1. Yang kedua, 2. Ini terjadi sampai peringkatnya menjadi KURANG dari jumlah kolom yang Anda gunakan.

Sangat mudah:

for (i in 1:47) {

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

untuk () kerusakan loop

  1. menghitung peringkat untuk kolom ke-i
  2. mencetak nomor iterasi
  3. mencetak nama kolom untuk referensi
  4. bagikan konsol dengan "###" sehingga Anda dapat dengan mudah menggulir

Saya yakin Anda dapat menambahkan pernyataan if, saya belum membutuhkannya karena saya hanya berurusan dengan kolom 50ish.

Semoga ini membantu!

Nick P
sumber
2
Meskipun tidak ada yang salah dengan ini secara teoritis, ini adalah algoritma yang tidak stabil dan tidak stabil secara numerik. Terutama dengan sejumlah besar kolom, ia dapat gagal mendeteksi kolinearitas dekat dan mendeteksi kolinearitas palsu di mana tidak ada.
whuber
2

Rangking, r dari sebuah matriks = jumlah kolom (atau baris) yang bebas linear dari suatu matriks. Untuk n oleh n matriks A , peringkat (A) = n => semua kolom (atau baris) adalah bebas linear.

Arun
sumber
2

Bukan berarti jawaban @Whuber memberi benar-benar perlu diperluas tapi saya pikir saya akan memberikan deskripsi singkat tentang matematika.

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

κj=λmaxλj

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

Kutipan

Montgomery, D. (2012). Pengantar Analisis Regresi Linier, Edisi ke-5. John Wiley & Sons Inc.

tjnel
sumber
1
X
QRXnkn>>k)? Setiap kekurangan peringkatX juga di Rdi mana Anda dapat melakukan dekomposisi-nilai eigen yang disebutkan di atas untuk mendeteksi kolom dependen linier (yang mudah diidentifikasi bahkan di bawah pivoting) - ini adalah referensi: halaman 179 dari Wood Generalized Additive Models an Introduction with R.
Druss2k