2011-12-19 23 views
10

आर में princomp() फ़ंक्शन का उपयोग करते समय, निम्न त्रुटि आई है: "covariance matrix is not non-negative definite"आर में प्रिंसकंप() फ़ंक्शन का उपयोग कैसे करें जब कॉन्वर्सिस मैट्रिक्स में शून्य है?

मुझे लगता है कि यह कुछ मूल्य शून्य (वास्तव में शून्य के करीब है, लेकिन गोलाकार के दौरान शून्य हो जाता है) कोवर्सियन मैट्रिक्स में है।

क्या पीसीए के साथ आगे बढ़ने के लिए कोई काम है जब कॉन्वर्सिस मैट्रिक्स में शून्य होता है?

[एफवाईआई: कॉन्वर्सिस मैट्रिक्स प्राप्त करना princomp() कॉल के भीतर एक मध्यवर्ती कदम है। इस त्रुटि को पुन: पेश करने के लिए डेटा फ़ाइल यहां से डाउनलोड की जा सकती है - http://tinyurl.com/6rtxrc3]

+0

समस्या को पुन: उत्पन्न करने के लिए नमूना इनपुट जोड़ना उत्तरदाताओं के लिए उपयोगी है। –

+1

यदि आप 'आँकड़े ::: princomp.default' देखते हैं तो आप देखेंगे कि त्रुटि तब होती है जब आपके पास covariance matrix में नकारात्मक eigenvalues ​​हैं। –

+0

@ रिची कपास: मेरी इच्छा है कि मैं प्रदान कर सकूं। मेरा डेटा विशाल है (10 के x 10k) और मुझे उस हिस्से को नहीं पता है जो त्रुटि उत्पन्न कर रहा है। मुझे यह जानकर ख़ुशी होगी कि क्या कोई तरीका है जिसमें मैं डेटा के परेशान हिस्से को निकाल सकता हूं और इसे यहां पोस्ट कर सकता हूं! – 384X21

उत्तर

9

पहली रणनीति सहिष्णुता तर्क को कम करने के लिए हो सकती है। मुझे लगता है कि princomp सहनशीलता तर्क पर नहीं गुजरेंगे लेकिन prcomp एक 'tol' तर्क स्वीकार करता है।

nr0=0.001 
which(abs(cov(M)) < nr0, arr.ind=TRUE) 

और यह नकारात्मक eigenvalues ​​साथ वैक्टर की पहचान हैं:

which(eigen(M)$values < 0) 

मदद पर (QR) पेज H9 उदाहरण का उपयोग प्रभावी नहीं हैं, तो यह वैक्टर जो लगभग शून्य सहप्रसरण है की पहचान करनी चाहिए:

0:

> which(abs(cov(h9)) < .001, arr.ind=TRUE) 
     row col 
[1,] 9 4 
[2,] 8 5 
[3,] 9 5 
[4,] 7 6 
[5,] 8 6 
[6,] 9 6 
[7,] 6 7 
[8,] 7 7 
[9,] 8 7 
[10,] 9 7 
[11,] 5 8 
[12,] 6 8 
[13,] 7 8 
[14,] 8 8 
[15,] 9 8 
[16,] 4 9 
[17,] 5 9 
[18,] 6 9 
[19,] 7 9 
[20,] 8 9 
[21,] 9 9 
> qr(h9[-9,-9])$rank 
[1] 7     # rank deficient, at least at the default tolerance 
> qr(h9[-(8:9),-(8:9)])$ take out only the vector with the most dependencies 
[1] 6     #Still rank deficient 
> qr(h9[-(7:9),-(7:9)])$rank 
[1] 6 

एक और दृष्टिकोण alias समारोह का उपयोग करने के हो सकता है

+0

अच्छा। मैं पहले 'उर्फ' नहीं आया था। –