आर

2012-05-05 7 views
13

में समय श्रृंखला डेटा के लिए स्लाइडिंग समय अंतराल मैं अनियमित समय श्रृंखला डेटा सेट के लिए दिलचस्प आंकड़े निकालने का प्रयास कर रहा हूं, लेकिन नौकरी के लिए सही उपकरण खोजने पर कम आ रहा हूं। नियमित रूप से नमूना समय श्रृंखला या किसी भी समय इंडेक्स-आधारित श्रृंखला में हेरफेर करने के लिए उपकरण बहुत आसानी से पाए जाते हैं, हालांकि मुझे उन समस्याओं के साथ बहुत भाग्य नहीं है जिन्हें मैं हल करने की कोशिश कर रहा हूं।आर

सबसे पहले, एक प्रतिलिपि प्रस्तुत करने योग्य डेटा सेट:

library(zoo) 
set.seed(0) 
nSamples <- 5000 
vecDT  <- rexp(nSamples, 3) 
vecTimes <- cumsum(c(0,vecDT)) 
vecDrift <- c(0, rnorm(nSamples, mean = 1/nSamples, sd = 0.01)) 
vecVals  <- cumsum(vecDrift) 
vecZ  <- zoo(vecVals, order.by = vecTimes) 
rm(vecDT, vecDrift) 

मान लें बार सेकंड में कर रहे हैं। vecZ श्रृंखला में लगभग 1700 सेकंड (केवल 30 मिनट का शर्मीला), और उस समय के दौरान 5001 प्रविष्टियां हैं। (ध्यान दें:। मैं xts उपयोग करने का प्रयास करते हैं, लेकिन तारीख की जानकारी की जरूरत के लिए xts लगता है, और जब यह प्रासंगिक नहीं है मैं नहीं बल्कि एक विशेष तिथि का उपयोग नहीं चाहते हैं)

मेरे लक्ष्यों निम्नलिखित हैं:

  • प्रत्येक बिंदु के 3 मिनट पहले और 3 मिनट के मानों के सूचकांक की पहचान करें। जैसे-जैसे समय लगातार रहता है, मुझे संदेह है कि किसी भी दो बिंदु ठीक से 3 मिनट अलग हैं।

    backIX(t, vecZ, tDelta) = min{ix in length(vecZ) : t - time(ix) < tDelta} forwardIX(t, vecZ, tDelta) = min{ix in length(vecZ) : time(ix) - t > tDelta}

    : मैं प्राप्त करना चाहते हैं क्या अंक कि पहले सबसे 3 मिनट में कर रहे हैं, और कम से कम 3 मिनट के बाद, भी बिंदु, यानी (स्यूडोकोड में) निम्नलिखित की तरह कुछ कर रहे हैं तो, 3 मिनट के लिए, tDelta = 180। यदि t=2500, तो परिणाम forwardIX() का परिणाम 3012 होगा (यानी समय (वीसीजेड) [2500] 860.1462 है, और समय (वीसीजेड) [3012] 1040.403 है, या 180 सेकंड बाद में), और backwardIX() का आउटपुट 2020 होगा (समय 680.7162 सेकेंड के अनुरूप)।

    आदर्श रूप से, मैं ऐसे फ़ंक्शन का उपयोग करना चाहूंगा जिसके लिए t की आवश्यकता नहीं है, क्योंकि उस कार्य को length(vecZ) कॉल की आवश्यकता होगी, जो इस तथ्य को अनदेखा करता है कि समय की खिड़कियां स्लाइडिंग की गणना अधिक कुशलता से की जा सकती है।

  • समय की रोलिंग विंडो में सभी मानों पर एक फ़ंक्शन लागू करें। मैंने rollapply देखा है, जो एक निश्चित विंडो आकार लेता है (यानी सूचकांक की निश्चित संख्या, लेकिन समय की निश्चित विंडो नहीं)। मैं इसे एक लूप (या foreach ;-)) के साथ बेवकूफ तरीके से हल कर सकता हूं, जिसकी गणना प्रति इंडेक्स t पर की जाती है, लेकिन मुझे आश्चर्य हुआ कि क्या कुछ सरल कार्य पहले ही कार्यान्वित किए गए हैं, उदाहरण के लिए किसी दिए गए समय सीमा में सभी मानों के माध्य की गणना करने के लिए एक फ़ंक्शन। चूंकि यह एक खिड़की पर स्लाइड करने वाले सरल सारांश आंकड़ों के माध्यम से कुशलता से किया जा सकता है, इसलिए यह एक ऐसे कार्य से कम्प्यूटेशनल रूप से सस्ता होना चाहिए जो प्रत्येक आंकड़े की गणना करने के लिए कई बार डेटा को एक्सेस करता है। कुछ काफी प्राकृतिक कार्य: मतलब, न्यूनतम, अधिकतम, और औसत।

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

वहाँ आर में पैकेज उस समय-खिड़कियां में डेटा के ऐसे जोड़तोड़ की सुविधा, या मैं किस्मत से बाहर हूँ और मैं अपने खुद के कार्यों लिखना चाहिए रहे हैं?


नोट 1: This question बल्कि रोलिंग समय की खिड़कियां, जैसे की तुलना में, इसी तरह कुछ करने के लिए संबंध तोड़ना अंतराल के ऊपर छोड़कर, चाहता हैमैं इसे हर 3 मिनट के ब्लॉक पर अपना विश्लेषण करने के लिए अनुकूलित कर सकता हूं, लेकिन मुझे इसे 3 मिनट अंतराल रोल करने के लिए अनुकूलित करने का कोई तरीका नहीं दिख रहा है।

नोट 2: मुझे पता चला है कि zoo ऑब्जेक्ट से एक संख्यात्मक वेक्टर (समय के लिए) से स्विचिंग ने पहले लक्ष्य के लिए रेंज-फाइंडिंग/विंडो एंडपॉइंट पहचान के मुद्दे को काफी हद तक बढ़ा दिया है। यह अभी भी एक बेवकूफ एल्गोरिदम है, लेकिन यह उल्लेखनीय है कि zoo ऑब्जेक्ट्स के साथ काम करना निष्क्रिय दृष्टिकोण के लिए अनुकूल नहीं हो सकता है।

+0

मुझे लगता है कि 'xts' शायद जाने का रास्ता है उत्तर देता है नहीं कर रहा हूँ। '? Endpoints','? To.period', '? Period.apply' और'? Split.xts' देखें। इस ऑब्जेक्ट को इस तरह xts पर केंद्रित करें: 'x <- .xts (vecVals, vecTimes)' – GSee

+0

@GSee धन्यवाद, हालांकि मुझे लगता है कि उन कार्यों ने डेटा को लगातार, अलग अंतराल में विभाजित किया है (जैसा कि मैंने संलग्न नोट में उल्लिखित किया है प्रश्न)। यदि समय की स्लाइडिंग/रोलिंग विंडो बनाने का कोई तरीका है, तो मैंने अभी तक यह नहीं पता लगाया है कि 'xts' को कैसे करना है। – Iterator

+0

आप अपने डेटा को कड़ाई से नियमित रूप से प्राप्त करने के लिए शून्य-चौड़ाई सख्ती से नियमित xts ऑब्जेक्ट और 'na.locf' के साथ विलय कर सकते हैं। फिर 'रोलप्ली' – GSee

उत्तर

1

यहाँ मैं क्या suggeting गया था, लेकिन मुझे यकीन है कि यह वास्तव में अपने प्रश्न

#Picking up where your code left off 
library(xts) 
library(TTR) 
x <- .xts(vecZ, vecTimes) 
xx <- na.locf(cbind(xts(, seq.POSIXt(from=start(x), to=end(x), by='sec')), x)) 
x$means <- runMean(xx, n=180) 
out <- x[!is.na(x[, 1]), ] 
tail(out) 

            x  means 
1969-12-31 18:28:17.376141 0.2053531 0.1325938 
1969-12-31 18:28:17.379140 0.2101565 0.1329065 
1969-12-31 18:28:17.619840 0.2139770 0.1332403 
1969-12-31 18:28:17.762765 0.2072574 0.1335843 
1969-12-31 18:28:17.866473 0.2065790 0.1339608 
1969-12-31 18:28:17.924270 0.2114755 0.1344264