मुझे आर। में रोलप्ली पीसीए में "उछल" लोड हो रहा है। क्या मैं इसे ठीक कर सकता हूं?


20

मेरे पास 28 विभिन्न मुद्राओं के लिए दैनिक रिटर्न डेटा के 10 साल हैं। मैं पहले प्रमुख घटक को निकालना चाहता हूं, लेकिन पूरे 10 वर्षों में पीसीए संचालित करने के बजाय, मैं 2 साल की खिड़की को रोलअप करना चाहता हूं, क्योंकि मुद्राओं का व्यवहार विकसित होता है और इसलिए मैं इसे प्रतिबिंबित करना चाहता हूं। हालाँकि मुझे एक बड़ी समस्या है, वह यह है कि दोनों पीसीपी एनालिसिस (यानी 1 दिन अलग) में प्रैम्पक () और प्रैम्पक () फंक्शन्स अक्सर पॉजिटिव से नेगेटिव लोडिंग की ओर कूदेंगे। EUR मुद्रा के लिए लोडिंग चार्ट पर एक नजर:

यहां छवि विवरण दर्ज करें

स्पष्ट रूप से मैं इसका उपयोग नहीं कर सकता क्योंकि आसन्न लोडिंग सकारात्मक से नकारात्मक तक कूद जाएगी, इसलिए मेरी श्रृंखला जो उनका उपयोग करती है वह गलत होगी। अब यूरो मुद्रा लोडिंग के निरपेक्ष मूल्य पर एक नज़र डालें:

यहां छवि विवरण दर्ज करें

समस्या यह है कि मैं अभी भी इसका उपयोग नहीं कर सकता क्योंकि आप शीर्ष चार्ट से देख सकते हैं कि लोडिंग नकारात्मक से सकारात्मक और समय पर वापस जाती है, एक विशेषता जिसे मुझे संरक्षित करने की आवश्यकता है।

क्या कोई रास्ता है जिससे मैं इस समस्या से घिर सकता हूँ? क्या मैं आसन्न पीसीए में आइजन्वेक्टर अभिविन्यास को हमेशा के लिए मजबूर कर सकता हूं?

वैसे यह समस्या FactoMineR PCA () फ़ंक्शन के साथ भी होती है। रोलप्ले के लिए कोड यहाँ है:

rollapply(retmat, windowl, function(x) summary(princomp(x))$loadings[, 1], by.column = FALSE, align = "right") -> princomproll

3
क्या आप बता सकते हैं कि आइजन्वेक्टर "ओरिएंटेशन" से आपका क्या मतलब है? जहां तक ​​मुझे पता है, ऐसी कोई चीज नहीं है जो डेटा के लिए आंतरिक हो। (यही कारण है कि अलग-अलग सॉफ़्टवेयर अलग-अलग सामान्यीकृत eigenvectors का उत्पादन करेंगे।) तो ऐसा लगता है कि आप कुछ ऐसा पूछ रहे हैं जो मौजूद नहीं है और अर्थहीन है।
whuber

1
खैर एक दिन मुझे इस तरह से लोडिंग मिलेगी: EUR -0.2 जियांग +0.8 USD +0.41 ..... 28 मुद्राएं। और अगले दिन मुझे EUR +0.21 ZAR -0.79 USD -0.4 आदि मिलेंगे। इसलिए पीसीए ने डेटा को घुमाने के लिए जिस धुरी को चुना है, वह दिन 2 की तुलना में 2 दिन विपरीत दिशा में उन्मुख है। इन लोडिंग कूदता है और मैं इसे से बचने के लिए चाहते हैं, किसी तरह ...... माफी अगर मेरी शब्दावली भ्रामक है। मैं समझता हूं कि पीसीए कोड वास्तव में अक्ष अभिविन्यास के बारे में परवाह नहीं करता है जब तक कि यह एक दिन में लोडिंग के अनुरूप नहीं होता है , लेकिन मुझे इसे कई दिनों तक लगातार करने की आवश्यकता है।
थॉमस ब्राउन

1
यह ध्यान में रखते हुए कि एक दिन से अगले दिन तक, दैनिक डेटा पर एक रोलिंग 2 वर्ष की खिड़की दी जाती है, हमारे पास बहुत, बहुत समान पीसीए होना चाहिए।
थॉमस ब्राउन

मुझे लगता है कि आपके पास समस्या होने का कारण यह है कि यह रोलप्ले विचार नहीं करता है। मेरे पास कुछ अलग देखने के अलावा कोई और उपाय नहीं है जो आपके लक्ष्यों को प्राप्त कर सके (यह सुनिश्चित नहीं है कि वे क्या हैं) और समझदार है।
माइकल आर। चेरिक

EUR -0.2 ZAR +0.8 USD +0.41और EUR +0.21 ZAR -0.79 USD -0.4 कर रहे हैं बहुत बहुत समान। आप बस किसी भी दो परिणामों में साइन इनवर्ट करें।
ttnphns

जवाबों:


22

जब भी प्लॉट बहुत ज्यादा उछलता है, ओरिएंटेशन को उलट दें। एक प्रभावी मानदंड यह है: सभी घटकों पर कूद की कुल मात्रा की गणना करें। यदि अगले ईजेनवेक्टर को नकार दिया जाता है तो कुल राशि की गणना करें। यदि उत्तरार्द्ध कम है, तो अगले ईजेनवेक्टर को नकारें।

यहाँ एक कार्यान्वयन है। (मैं इससे परिचित नहीं हूं zoo, जो अधिक सुरुचिपूर्ण समाधान की अनुमति दे सकता है।)

require(zoo)
amend <- function(result) {
  result.m <- as.matrix(result)
  n <- dim(result.m)[1]
  delta <- apply(abs(result.m[-1,] - result.m[-n,]), 1, sum)
  delta.1 <- apply(abs(result.m[-1,] + result.m[-n,]), 1, sum)
  signs <- c(1, cumprod(rep(-1, n-1) ^ (delta.1 <= delta)))
  zoo(result * signs)
}

एक उदाहरण के रूप में, हम एक रूढ़िवादी समूह में एक यादृच्छिक चलना चलाते हैं और इसे ब्याज के लिए थोड़ा सा परेशान करते हैं:

random.rotation <- function(eps) {
  theta <- rnorm(3, sd=eps)
  matrix(c(1, theta[1:2], -theta[1], 1, theta[3], -theta[2:3], 1), 3)
}
set.seed(17)
n.times <- 1000
x <- matrix(1., nrow=n.times, ncol=3)
for (i in 2:n.times) {
  x[i,] <- random.rotation(.05) %*% x[i-1,]
}

यहाँ रोलिंग पीसीए है:

window <- 31
data <- zoo(x)
result <- rollapply(data, window, 
  function(x) summary(princomp(x))$loadings[, 1], by.column = FALSE, align = "right")
plot(result)

मूल

अब निश्चित संस्करण:

plot(amend(result))

संशोधित


टीमैंvमैं+1मैं+1vमैंमैं1-1vमैं+1। आपका एल्गोरिथ्म थोड़ा अलग लगता है। क्या यह उसी तरह काम करेगा?
अमीबा का कहना है कि मोनिका

@amoeba हालांकि मुझे बिल्कुल यकीन नहीं है कि आप क्या कर रहे हैं, यह डेविड जे हैरिस के जवाब और इसके बाद की टिप्पणियों में चर्चा किए गए कुछ विचारों की तरह लगता है। देखें, विशेष रूप से, आँकड़े.स्टैकएक्सचेंज . com / questions / 34396 / पर मेरी टिप्पणी ।
whuber

2
@Art, इसलिए जैसा कि मैं इसे समझता हूं, आप कुछ बाहरी (PCA) की प्राथमिकताओं के आधार पर घटक के संकेत को ठीक करना चाहते हैं। यह ठीक है, लेकिन यह है कि आपको इसे कैसे देखना चाहिए। सबसे पहले स्लाइडिंग पीसीए चीज करें, जिससे यह सुनिश्चित हो सके कि संकेत सुसंगत हैं। और फिर तय करें, कुछ अतिरिक्त मानदंडों के आधार पर, पूरे घटक को फ्लिप करना है या नहीं। उदाहरण के लिए, आप इसे यूरो प्रवृत्ति के साथ सहसंबंधित कर सकते हैं और यदि सहसंबंध नकारात्मक है, तो घटक को फ्लिप करें। या कुछ इस तरह का। यह पूरी तरह से आपके विशिष्ट एप्लिकेशन और आपके डोमेन ज्ञान पर निर्भर करता है।
अमीबा का कहना है कि मोनिका

1
मैं @ अमीबा की व्याख्या और सिफारिश से सहमत हूं।
whuber

1
@amoeba: हां, आप इस बारे में सही हैं, हालांकि, मैंने भोलेपन से सोचा कि कुछ सामान्य समाधान हो सकते हैं जो विशिष्ट समय श्रृंखला पर निर्भर नहीं हैं, कुछ "वेक्टर का वास्तविक अभिविन्यास" जैसा है: वैसे भी, मदद के लिए धन्यवाद और सुझाव
बेनामी

8

@ जब सही है कि डेटा के लिए आंतरिक है कि एक अभिविन्यास नहीं है, लेकिन आप अभी भी लागू कर सकते हैं कि आपके eigenvectors कुछ संदर्भ वेक्टर के साथ सकारात्मक सहसंबंध है।

उदाहरण के लिए, आप अपने सभी eigenvectors पर यूएसडी के लिए लोडिंग को सकारात्मक बना सकते हैं (यानी, यदि यूएसडी की लोडिंग नकारात्मक है, तो पूरे वेक्टर के संकेतों को पलटें)। आपके वेक्टर की समग्र दिशा अभी भी मनमानी है (क्योंकि आप इसके बजाय अपने संदर्भ के रूप में EUR या ZAR का उपयोग कर सकते थे), लेकिन आपके पीसीए के पहले कुछ अक्ष शायद लगभग उतना नहीं कूदेंगे - खासकर क्योंकि आपकी रोलिंग खिड़कियां इतनी हैं लंबा।


7
अच्छा विचार। मैंने पहली बार यह कोशिश की (शायद जब आप इस उत्तर को पोस्ट कर रहे थे :-))। समस्या यह है कि अन्य लोडिंग चारों ओर कूद सकती है। इसे ठीक करने के लिए, सबसे बड़ी लोडिंग पर साइन पसंद को आधार बनाएं। अभी भी कोई पासा नहीं है: लोडिंग अभी भी कूद सकती है। पिछली बार से लोडिंग के वेक्टर में कम से कम गड़बड़ी पैदा करने वाले अभिविन्यास को चुनने के लिए चाल हर बार होती है ।
whuber

4
@ शुभ काम अच्छा है।
डेविड जे। हैरिस

1
सही है, लोडिंग का संकेत कोई मायने नहीं रखता (अभिविन्यास)। जो कुछ संबोधित नहीं किया गया था, वह यह है कि यदि आप इसे अलग-अलग सॉफ्टवेयर पैकेजों में प्रदर्शित करते हैं, तो इन-पैकेज अंतर यह है कि एक प्रोग्राम का परिणाम विशेष लोडिंग पर नकारात्मक (पॉजिटिव) संकेत हो सकता है, जबकि उसी लोडिंग के लिए पॉजिटिव (नकारात्मक) संकेतों में अन्य परिणाम। इसलिए, ऊपर दिए गए 3-सीरीज प्लॉट में अंतिम परिणामों के संकेत दूसरे पैकेज का उपयोग करते समय उलटा हो सकता है। संदर्भ वेक्टर लोडिंग में एक संकेत परिवर्तन भी हो सकता है - और यह समाधान गलत नहीं होगा।
जोले

@ एलईपी: मैंने उलटा होने के साथ एक ही समस्या का सामना किया, हो सकता है कि आपने पहले ही इस मुद्दे का हल ढूंढ लिया हो - कैसे पता लगाया जाए कि पहला वेक्टर सही है और सुनिश्चित करें कि बाकी इसे ठीक से संरेखित किया जाएगा - quant.stackexchange.com/questions / 3094 /… ?
अनाम

जब तक मैट्रिक्स एकवचन नहीं होता है और कोई भी प्रतिजन शून्य नहीं होता है, तब तक अधिकांश एल्गोरिदम परिणाम समान होने चाहिए, सिवाय संकेतों में 180 डिग्री परिवर्तन के - जो गारंटी नहीं है।
जोल

1

मैंने जो किया वह क्रमिक eigenvectors के बीच L1 की दूरी की गणना करना था। इस मैट्रिक्स को सामान्य करने के बाद, मैं az स्कोर थ्रेशोल्ड जैसे 1 का चुनाव करता हूं, ताकि यदि किसी नए रोलिंग में परिवर्तन इस सीमा से ऊपर हो तो मैं रोलिंग विंडो में स्थिरता रखने के लिए आइजन्वेक्टर, कारकों और लोडिंग को फ्लिप करता हूं। व्यक्तिगत रूप से मुझे कुछ सहसंबंधों में दिए गए संकेतों को मजबूर करना पसंद नहीं है क्योंकि वे मैक्रो ड्राइवरों के आधार पर बहुत अस्थिर हो सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.