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 R
untuk 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
Output yang terkait dengan panel kiri atas adalah
A B C D E
Comp.5 1 -1 -1 -1 -1
00≈A−B−C−D−E
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.