2012-11-27 20 views
7

किसी mts ऑब्जेक्ट पर लागू (या sapply) का उपयोग करना फ़ंक्शन पर भेजते समय इसकी टाइम श्रृंखला गुणों को हटा देता है। मुझे एमटीएस ऑब्जेक्ट में प्रत्येक बार श्रृंखला पर एक ही फ़ंक्शन (टीएस इनपुट और टीएस आउटपुट के साथ) कैसे लागू करना चाहिए और इसे वापस करना (अधिमानतः एमटीएस के रूप में) [मेरा मतलब है लूप के लिए उपयोग करने के अलावा]?एमटीएस ऑब्जेक्ट्स पर फ़ंक्शंस के परिवार को लागू करने का उपयोग करना

उदाहरण के लिए मैं एक समारोह है कि एक नमूना मीटर

z <- ts(matrix(rnorm(90), 30, 3), start=c(1961, 1), frequency=4) 
class(z) 

केवल समय श्रृंखला कार्यों में से एक के लिए भेजा जा रहा है अब एक समय श्रृंखला की प्रवृत्ति (एसटीएल का उपयोग कर)

myfunc <- function(x) { 
     return(stl(x,"per")$time.series[,2]) 
} 

रिटर्न लिखने मान लें कि सही:

myfunc(z[,1]) # works correctly, returns the trend of first series 

मेरा फ़ंक्शन एकाधिक समय श्रृंखला के लिए डिज़ाइन नहीं किया गया है:

myfunc(z) # will not work returning the error below 

Error in stl(x, "per") : only univariate series are allowed 

मीटर पर लागू होते हैं का उपयोग करते हुए आपत्ति वेक्टर के रूप में समय श्रृंखला के प्रत्येक भेजने के लिए, अपने समय श्रृंखला गुण (चम्मच) संरक्षण नहीं:

apply(z,2,myfunc) # will not work returning the error below 

Error in stl(x, "per") : 
series is not periodic or has less than two periods 
+1

सच है, 'लागू' विशेषताएँ हटा देगा, लेकिन 'sapply' ऐसा नहीं करना चाहिए। 'ts' ऑब्जेक्ट अजीब हैं। उनके पास अक्सर प्रिंटिंग विधियां होती हैं जो उपयोगकर्ता को उनके वास्तविक ढांचे के रूप में गुमराह करती हैं, इसलिए आपको उन पर str() का उपयोग करना चाहिए। –

+0

क्या आप कृपया मेरे उदाहरण के लिए sapply का उपयोग करने पर कोड प्रदान करेंगे? मैंने पाया कि सपने में एक ही त्रुटि उठाई गई है क्योंकि यह सिर्फ कॉल ही लागू होती है। –

+1

और 'ts' वस्तुओं अजीबता के बारे में! मैं किसी भी मुद्रण विधि का उपयोग या भरोसा नहीं करता हूं, मुझे _do_ को अपनी टाइम श्रृंखला गुणों, यानी 'tsp', जो कि लंबाई 3 का एक वेक्टर है, की शुरुआत, अंत और समय श्रृंखला डेटा की आवृत्ति को इंगित करने की आवश्यकता है –

उत्तर

8

इस के चारों ओर एक सरल तरीका है, एक साफ apply के बजाय सूचकांक के साथ काम करने के लिए है:

sapply(seq_len(ncol(z)),function(i) myfunc(z[,i])) 

apply समारोह के अंदर साफ वैक्टर डालता है, क्योंकि यह पहले एक मैट्रिक्स को कोई चीज बदल देता है। टाइम श्रृंखला ऑब्जेक्ट्स के लिए परिभाषित [ फ़ंक्शन का उपयोग करके, आप सुनिश्चित हैं कि आप प्रत्येक बार एक वैध समय श्रृंखला निकालते हैं।

+0

सुंदर समाधान। – agstudy

3

मैं अगर यह एक है की जाँच करने के myfunc बदल पैरामीटर एक्स के रूप में ts वस्तु।

यदि एक्स टीएस नहीं है, तो इसे 0 ऑब्जेक्ट में बदल दिया गया है क्योंकि stl इस पैरामीटर प्रकार की आवश्यकता है।

myfunc <- function(x,...){ 
     y <- x 
     if(class(x) != 'ts') { 
     dots <- c(...) 
     y <- ts(x,start=c(dots[1], dots[2]), frequency=dots[3]) 
     } 
     return(stl(y,"per")$time.series[,2]) 
    } 
    ## no need to conversion (already ts object) 
    myfunc(z[,1]) 


    ## mts object (here we give parameter necessary for conversion) 
    apply(z,2,myfunc,1961,1,4) 
+0

और अगर मुझे एमटीएस के रूप में परिणाम होना है: ts (लागू करें (z, 2, myfunc, 1 961,1,4), प्रारंभ = सी (1 9 61, 1), आवृत्ति = 4) –

+0

इस उत्तर में समस्या यह है कि हम हमेशा 'myfunc' फ़ंक्शन नहीं लिखते हैं। अक्सर हम किसी और के कोड का उपयोग करते हैं। –