आर 'फ़ंक्शंस' और 'प्रैम्पक' अलग-अलग ईजेंवल क्यों देते हैं?


22

इसे पुन: उत्पन्न करने के लिए आप डिकैथलॉन डेटासेट {FactoMineR} का उपयोग कर सकते हैं। सवाल यह है कि गणना किए गए आइजेनवेल्स कोवरियन मैट्रिक्स से भिन्न क्यों हैं।

यहाँ का उपयोग कर eigenvalues ​​हैं princomp:

> library(FactoMineR);data(decathlon)
> pr <- princomp(decathlon[1:10], cor=F)
> pr$sd^2
      Comp.1       Comp.2       Comp.3       Comp.4       Comp.5       Comp.6 
1.348073e+02 2.293556e+01 9.747263e+00 1.117215e+00 3.477705e-01 1.326819e-01 
      Comp.7       Comp.8       Comp.9      Comp.10 
6.208630e-02 4.938498e-02 2.504308e-02 4.908785e-03 

और उसी का उपयोग करते हुए PCA:

> res<-PCA(decathlon[1:10], scale.unit=FALSE, ncp=5, graph = FALSE)
> res$eig
          eigenvalue percentage of variance cumulative percentage of variance
comp 1  1.348073e+02           79.659589641                          79.65959
comp 2  2.293556e+01           13.552956464                          93.21255
comp 3  9.747263e+00            5.759799777                          98.97235
comp 4  1.117215e+00            0.660178830                          99.63252
comp 5  3.477705e-01            0.205502637                          99.83803
comp 6  1.326819e-01            0.078403653                          99.91643
comp 7  6.208630e-02            0.036687700                          99.95312
comp 8  4.938498e-02            0.029182305                          99.98230
comp 9  2.504308e-02            0.014798320                          99.99710
comp 10 4.908785e-03            0.002900673                         100.00000

क्या आप मुझे समझा सकते हैं कि सीधे गणना किए गए आइजनवेल्स उनसे अलग क्यों हैं? (आइजनवेक्टर समान हैं):

> eigen(cov(decathlon[1:10]))$values
 [1] 1.381775e+02 2.350895e+01 9.990945e+00 1.145146e+00 3.564647e-01
 [6] 1.359989e-01 6.363846e-02 5.061961e-02 2.566916e-02 5.031505e-03

इसके अलावा, वैकल्पिक prcompविधि प्रत्यक्ष गणना के समान ही प्रतिरूप प्रदान करती है:

> prc <- prcomp(decathlon[1:10])
> prc$sd^2
 [1] 1.381775e+02 2.350895e+01 9.990945e+00 1.145146e+00 3.564647e-01
 [6] 1.359989e-01 6.363846e-02 5.061961e-02 2.566916e-02 5.031505e-03

क्यों PCA/ करते हैं princompऔर prcompअलग-अलग eigenvalues ​​देते हैं?


पीसीए आपको अलग-अलग परिणाम देगा कि आप सहसंयोजक मैट्रिक्स या सहसंबंध मैट्रिक्स का उपयोग करते हैं या नहीं।
charles.y.zheng

7
मतभेद अपेक्षाकृत छोटे लगते हैं, हालांकि सरल संख्यात्मक मुद्दों के लिए शायद बहुत बड़ा है। यह या n - 1 द्वारा सामान्यीकरण के बीच अंतर हो सकता है , उदाहरण के लिए, जब SVD या eigenvalues ​​अपघटन की गणना करने से पहले सहसंयोजक के अनुमान की गणना करते हैं? nn-1
कार्डिनल

7
@ कार्डिनल नाइस अनुमान! ध्यान दें कि eigenvalues ​​के दो अलग-अलग अनुक्रमों में समान क्रमिक अनुपात होते हैं। इस प्रकार, एक सेट दूसरे का एक स्थिर बहु ​​है। एकाधिक 1.025 = 41/40 ( बिल्कुल ) है। यह मेरे लिए स्पष्ट नहीं है कि यह कहां से आता है। हो सकता है कि डेटासेट में 41 तत्व हों और ओपी केवल पहले 10 का खुलासा कर रहा हो?
whuber

7
@कार्डिनल वास्तव में: इसके लिए सहायता पृष्ठ princomp: "ध्यान दें कि डिफ़ॉल्ट गणना सहसंयोजक मैट्रिक्स के लिए भाजक एन का उपयोग करती है।" इसके लिए सहायता पृष्ठ prcomp: "प्रिंसपी के विपरीत, संस्करण को सामान्य भाजक एन -1 के साथ गणना की जाती है।"
काराकल

2
@caracal, आपको अपनी टिप्पणी को एक उत्तर में कॉपी करना चाहिए (और शायद इसे सीडब्ल्यू बनाना चाहिए) ताकि इसे स्वीकार किया जा सके और प्रश्न को हल के रूप में चिह्नित किया जा सके।
कार्डिनल

जवाबों:


16

princompएनprcompcovएन-1एन

इसका उल्लेख दोनों विवरण अनुभाग में किया गया है help(princomp):

ध्यान दें कि डिफ़ॉल्ट गणना सहसंयोजक मैट्रिक्स के लिए भाजक 'एन' का उपयोग करता है।

और विवरण अनुभाग help(prcomp):

इसके विपरीत princomp, variances की गणना सामान्य भाजक N - 1 के साथ की जाती है।

princompएनn.obscv

else if (is.null(covmat)) {
    dn <- dim(z)
    if (dn[1L] < dn[2L]) 
        stop("'princomp' can only be used with more units than variables")
    covmat <- cov.wt(z)
    n.obs <- covmat$n.obs
    cv <- covmat$cov * (1 - 1/n.obs)
    cen <- covmat$center
}

आप covmatतर्क के बजाय तर्क को निर्दिष्ट करके इस गुणा से बच सकते हैं x

princomp(covmat = cov(iris[,1:4]))$sd^2

पीसीए स्कोर के बारे में अपडेट:

cor = TRUEprincompprincompzएन

princomp(scale(data))$scoresprincomp(data, cor = TRUE)$scores(एन-1)/एन


1
आप "पहले से पुष्टि की गई" के साथ "अनुमानित" की जगह पर विचार कर सकते हैं (ऊपर टिप्पणी स्ट्रीम देखें।) आप इसे सीडब्ल्यू बनाने के लिए अपने उत्तर को संपादित करने पर भी विचार कर सकते हैं। चीयर्स।
कार्डिनल

@ कार्डिनल मैंने उन टिप्पणियों को नहीं देखा। मैंने केवल उन लोगों को देखा जो मतदान कर चुके थे। धन्यवाद। इसके अलावा, क्या आप उत्तर को सीडब्ल्यू बनाने के पीछे तर्क को स्पष्ट कर सकते हैं? उसके लिए नियम / दिशानिर्देश क्या हैं?
जोशुआ उलरिच

क्या कोई अनुमान लगा सकता है कि कोड केवल cv <- cov.wt(z, method="ML")2 फॉलिंग लाइनों को अनावश्यक क्यों नहीं बना रहा है?
कारकल

2
@ जोशुआ: जवाब सीडब्ल्यू बनाने के बारे में मेरा सुझाव इस तथ्य के कारण था कि उत्तर टिप्पणियों की एक धारा के माध्यम से प्रकट हुआ था और "समुदाय" चर्चा द्वारा उत्पन्न किया गया था। चूंकि यह टिप्पणियों में हल किया गया था, इसलिए मेरे विचार हैं कि यह एक जवाब के रूप में इसे सुधारने के लिए सबसे अधिक समझ में आता है, इस सहयोग को इंगित करने के लिए सीडब्ल्यू के रूप में चिह्नित किया गया है, और यह उत्तर को स्वीकार करने और प्रश्न को हल करने के लिए अनुमति देता है। (अन्यथा, यह निश्चित समय के बाद सॉफ़्टवेयर द्वारा स्वचालित रूप से वापस टकरा जाएगा।)
कार्डिनल

2
@amoeba यह आपके संपादन टिप्पणी में उल्लेख करने के लिए उपयोगी होता। "~ 450 वर्णों को शरीर में जोड़ा गया" ~ 450 वर्णों के उत्तर से किसी का मूल्यांकन करने में मदद नहीं मिलती है कि क्या संपादन उचित है।
जोशुआ उलरिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.