2012-05-11 21 views
7

पर रोलिंग विंडो xts का उपयोग करके घटनाओं (पोस्ट) की अनियमित समय श्रृंखला है, और मैं रोलिंग साप्ताहिक विंडो (या द्विपक्षीय, या 3 दिन, आदि) पर होने वाली घटनाओं की संख्या की गणना करना चाहता हूं। डेटा इस तरह दिखता है:अनियमित समय श्रृंखला

    postid 
2010-08-04 22:28:07 867 
2010-08-04 23:31:12 891 
2010-08-04 23:58:05 901 
2010-08-05 08:35:50 991 
2010-08-05 13:28:02 1085 
2010-08-05 14:14:47 1114 
2010-08-05 14:21:46 1117 
2010-08-05 15:46:24 1151 
2010-08-05 16:25:29 1174 
2010-08-05 23:19:29 1268 
2010-08-06 12:15:42 1384 
2010-08-06 15:22:06 1403 
2010-08-07 10:25:49 1550 
2010-08-07 18:58:16 1596 
2010-08-07 21:15:44 1608 

जो एक 2 दिवसीय विंडो के लिए की तरह

    nposts 
2010-08-05 00:00:00  10 
2010-08-06 00:00:00  9 
2010-08-07 00:00:00  5 

कुछ प्रस्तुत करना चाहिए। मैंने rollapply, apply.rollingPerformanceAnalytics आदि से देखा है, और वे सभी नियमित समय श्रृंखला डेटा मानते हैं। मैंने पोस्ट को हर दिन बदलने के लिए और प्रत्येक दिन समूह के लिए ddply जैसे कुछ का उपयोग करने की कोशिश की, जो मुझे करीब ले जाती है। हालांकि, उपयोगकर्ता हर दिन पोस्ट नहीं कर सकता है, इसलिए समय श्रृंखला अभी भी अनियमित होगी। मैं 0s के साथ अंतराल भर सकता हूं, लेकिन यह मेरे डेटा को बहुत बढ़ा सकता है और यह पहले से काफी बड़ा है।

मुझे क्या करना चाहिए?

+2

इस वर्तमान XTS पैकेज में मौजूद नहीं है, लेकिन इस अनुरोध काफी ऊपर आता है कि मैं एक समाधान सहित के बारे में सोचना शुरू कर दिया है के लिए समाधान। –

+0

क्या आपके पास अपडेट @JoshuaUlrich है? या नीचे दिए गए उत्तर के प्रभाव के लिए कुछ जो शून्य या एनएएस डेटा के साथ लापता दिनों में भर जाएगा ताकि हम 'रोलप्ली' का उपयोग कर सकें? मुझे लगता है कि मैं 'मर्ज' का उपयोग कर सकता हूं ... – flodel

+0

@flodel: इस प्रश्न को मैंने जो कुछ सोचा था, उसे जरूरी नहीं है (मेरा जवाब देखें)। मैंने सोचा कि वे अपनी मूल श्रृंखला में प्रत्येक अवलोकन में 'n' दिन वापस देखना चाहते हैं, जो हल करने के लिए एक और अधिक कठिन समस्या है। –

उत्तर

4

यह काम करने के लिए लगता है:

# n = number of days 
n <- 30 
# w = window width. In this example, w = 7 days 
w <- 7 

# I will simulate some data to illustrate the procedure 
data <- rep(1:n, rpois(n, 2)) 

# Tabulate the number of occurences per day: 
# (use factor() to be sure to have the days with zero observations included) 
date.table <- table(factor(data, levels=1:n)) 

mat <- diag(n) 
for (i in 2:w){ 
    dim <- n+i-1 
    mat <- mat + diag(dim)[-((n+1):dim),-(1:(i-1))] 
    } 

# And the answer is.... 
roll.mean.7days <- date.table %*% mat 

बहुत धीमी गति से नहीं हो लगता है (हालांकि mat मैट्रिक्स मिल जाएगा आयाम n * एन)। मैंने n = 30 को n = 3000 के साथ बदलने की कोशिश की (जो 9 मिलियन तत्वों का एक मैट्रिक्स बनाता है = 72 एमबी) और यह अभी भी मेरे कंप्यूटर पर उचित तेज़ था। बहुत बड़े डेटा सेट के लिए, पहले सबसेट पर आज़माएं .... mat मैट्रिक्स बनाने के लिए मैट्रिक्स पैकेज (बैंडस्पर) में कुछ फ़ंक्शंस का उपयोग करना भी तेज़ होगा।

+0

यह रोलिंग विंडो को किसी चीज़ पर लागू करने का एक अच्छा तरीका है, लेकिन यदि आप एक उदाहरण नहीं देते हैं कि यह वास्तविक समय सेरी (मूल प्रश्न के रूप में POSIXct दिनांक-समय ऑब्जेक्ट्स के रूप में व्यक्त) के रूप में कैसे लागू किया जाए, तो यह शायद ही कभी सवाल का जवाब दें। – plannapus

+0

अनियमित रूप से दूरी वाले POSIXct ऑब्जेक्ट्स के डेटा के वैक्टर के साथ 'डेटा <- नमूना (seq (as.POSIXct ("2012/01/01"), as.POSIXct ("2012/01/31"), = "घंटे" द्वारा) , 30) ', आप अपनी 'date.table' लाइन को प्रतिस्थापित कर सकते हैं:' date.table <- तालिका (कट (डेटा, "दिन"))' और फिर आगे बढ़ें, और यह चाल चलनी चाहिए। – plannapus

+0

प्लानैपस, POSIXct ऑब्जेक्ट्स के संबंध में आपके जोड़ों के लिए धन्यवाद। –

3

यहाँ एक समाधान XTS का उपयोग कर रहा है:

x <- structure(c(867L, 891L, 901L, 991L, 1085L, 1114L, 1117L, 1151L, 
    1174L, 1268L, 1384L, 1403L, 1550L, 1596L, 1608L), .Dim = c(15L, 1L), 
    index = structure(c(1280960887, 1280964672, 1280966285, 
    1280997350, 1281014882, 1281017687, 1281018106, 1281023184, 1281025529, 
    1281050369, 1281096942, 1281108126, 1281176749, 1281207496, 1281215744), 
    tzone = "", tclass = c("POSIXct", "POSIXt")), class = c("xts", "zoo"), 
    .indexCLASS = c("POSIXct", "POSIXt"), tclass = c("POSIXct", "POSIXt"), 
    .indexTZ = "", tzone = "") 
# first count the number of observations each day 
xd <- apply.daily(x, length) 
# now sum the counts over a 2-day rolling window 
x2d <- rollapply(xd, 2, sum) 
# align times at the end of the period (if you want) 
y <- align.time(x2d, n=60*60*24) # n is in seconds 
संबंधित मुद्दे