प्रश्न चर के बीच "अंतर्निहित [रैखिक] रिश्तों की पहचान" के बारे में पूछता है।
रिश्तों का पता लगाने का त्वरित और आसान तरीका यह है कि आप अपने पसंदीदा सॉफ़्टवेयर का उपयोग करके उन चर के खिलाफ किसी भी अन्य चर (एक निरंतर, यहां तक कि) का उपयोग करें: कोई भी अच्छा प्रतिगमन प्रक्रिया का पता लगाएगी और कोलीनियरिटी का निदान करेगी। (आप प्रतिगमन परिणामों को देखने के लिए भी परेशान नहीं होंगे: हम सिर्फ प्रतिगमन मैट्रिक्स की स्थापना और विश्लेषण के एक उपयोगी पक्ष-प्रभाव पर भरोसा कर रहे हैं।)
माना जाता है कि कोलीनियरिटी का पता लगाया जाता है, हालांकि, आगे क्या? प्रिंसिपल कंपोनेंट्स एनालिसिस (पीसीए) वास्तव में वही है जो आवश्यक है: इसके सबसे छोटे घटक निकट-रैखिक संबंधों के अनुरूप हैं। इन संबंधों को सीधे "लोडिंग" से पढ़ा जा सकता है, जो मूल चर के रैखिक संयोजन हैं। छोटे लोडिंग (यानी, छोटे आइजनवेल्स से जुड़े) निकट-कोलीनरीज़ के अनुरूप हैं। का एक स्वदेशी एक परिपूर्ण रैखिक संबंध के अनुरूप होगा। थोड़ा बड़ा ईजेन्यूएल्स जो अभी भी सबसे बड़े से छोटे हैं वे अनुमानित रैखिक संबंधों के अनुरूप होंगे।0
(एक कला है और "लिटिल" लोडिंग क्या है, यह पहचानने के लिए बहुत सारे साहित्य जुड़े हुए हैं। एक आश्रित चर के मॉडलिंग के लिए, मैं पीसीए में स्वतंत्र चर के भीतर इसे शामिल करने का सुझाव दूंगा ताकि घटकों की पहचान की जा सके - चाहे कोई भी हो उनके आकार - जिसमें आश्रित चर महत्वपूर्ण भूमिका निभाता है। इस दृष्टिकोण से, "छोटा" का अर्थ ऐसे किसी भी घटक से बहुत छोटा है। "
आइए कुछ उदाहरण देखें। (ये R
गणना और प्लॉटिंग के लिए उपयोग करते हैं।) पीसीए प्रदर्शन करने के लिए एक फ़ंक्शन के साथ शुरू करें, छोटे घटकों की तलाश करें, उन्हें प्लॉट करें और उनके बीच रैखिक संबंधों को लौटाएं।
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))
}
बी , सी, डी ,एए
process <- function(z, beta, sd, ...) {
x <- z %*% beta; colnames(x) <- "A"
pca(cbind(x, z + rnorm(length(x), sd=sd)), ...)
}
बी , … , ईए = बी + सी+ डी + ईए = बी + ( सी)+ डी ) / 2 + ईsweep
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
बी , … , ईए
ऊपरी बाएं पैनल से जुड़ा आउटपुट था
A B C D E
Comp.5 1 -1 -1 -1 -1
00 ≈ एक - बी - सी- डी - ई
ऊपरी मध्य पैनल के लिए आउटपुट था
A B C D E
Comp.5 1 -0.95 -1.03 -0.98 -1.02
( ए , बी , सी, डी , ई)
A B C D E
Comp.5 1 -1.33 -0.77 -0.74 -1.07
ए'= बी'+ सी'+ डी'+ ई'
1 , 1 / 2 , 1 / 2 , 1
व्यवहार में, यह अक्सर ऐसा नहीं होता है कि एक चर को दूसरों के एक स्पष्ट संयोजन के रूप में एकल किया जाता है: सभी गुणांक तुलनात्मक आकार और भिन्न संकेतों के हो सकते हैं। इसके अलावा, जब संबंधों के एक से अधिक आयाम होते हैं, तो उन्हें निर्दिष्ट करने का कोई अनूठा तरीका नहीं है: उन संबंधों के लिए एक उपयोगी आधार की पहचान करने के लिए आगे के विश्लेषण (जैसे पंक्ति में कमी) की आवश्यकता होती है। यह है कि दुनिया कैसे काम करती है: आप सभी कह सकते हैं कि ये विशेष संयोजन जो पीसीए द्वारा आउटपुट हैं, डेटा में लगभग भिन्नता के अनुरूप नहीं हैं। इससे निपटने के लिए, कुछ लोग प्रतिगमन या उसके बाद के विश्लेषण में स्वतंत्र चर के रूप में सबसे बड़े ("प्रिंसिपल") घटकों का उपयोग करते हैं, जो भी रूप ले सकता है। यदि आप ऐसा करते हैं, तो चर के सेट से आश्रित चर को हटाने और पीसीए को फिर से करने के लिए पहले मत भूलना!
इस आंकड़े को पुन: पेश करने के लिए कोड है:
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
।)
उपयोगकर्ता tnnphns ने कृपया हमारे ध्यान को बारीकी से संबंधित धागे पर निर्देशित किया है। इसका एक उत्तर (जेएम द्वारा) यहां वर्णित दृष्टिकोण का सुझाव देता है।