आर का उपयोग करके समय श्रृंखला की एसटीएल प्रवृत्ति


27

मैं आर से नया हूं और समय श्रृंखला विश्लेषण के लिए। मैं एक लंबी (40 वर्ष) दैनिक तापमान समय श्रृंखला की प्रवृत्ति को खोजने की कोशिश कर रहा हूं और अलग-अलग अनुमान लगाने की कोशिश कर रहा हूं। पहला एक साधारण रेखीय प्रतिगमन है और दूसरा लूस द्वारा टाइम सीरीज़ का मौसमी अपघटन है।

उत्तरार्द्ध में यह प्रतीत होता है कि मौसमी घटक प्रवृत्ति से अधिक है। लेकिन, मैं प्रवृत्ति को कैसे निर्धारित करूं? मैं सिर्फ एक संख्या बताना चाहूंगा कि वह प्रवृत्ति कितनी मजबूत है।

     Call:  stl(x = tsdata, s.window = "periodic")
     Time.series components:
        seasonal                trend            remainder               
Min.   :-8.482470191   Min.   :20.76670   Min.   :-11.863290365      
1st Qu.:-5.799037090   1st Qu.:22.17939   1st Qu.: -1.661246674 
Median :-0.756729578   Median :22.56694   Median :  0.026579468      
Mean   :-0.005442784   Mean   :22.53063   Mean   : -0.003716813 
3rd Qu.:5.695720249    3rd Qu.:22.91756   3rd Qu.:  1.700826647    
Max.   :9.919315613    Max.   :24.98834   Max.   : 12.305103891   

 IQR:
         STL.seasonal STL.trend STL.remainder data   
         11.4948       0.7382    3.3621       10.8051
       % 106.4          6.8      31.1         100.0  
     Weights: all == 1
     Other components: List of 5   
$ win  : Named num [1:3] 153411 549 365  
$ deg  : Named int [1:3] 0 1 1   
$ jump : Named num [1:3] 15342 55 37  
$ inner: int 2  
$ outer: int 0

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

जवाबों:


20

मैं इसके stl()लिए परेशान नहीं होता - ट्रेंड को निकालने के लिए इस्तेमाल किए जाने वाले लोअर स्मूथ के लिए बैंडविड्थ बहुत दूर तक है, जिसके परिणामस्वरूप छोटे पैमाने पर आप देख सकते हैं। मैं एक additive मॉडल का उपयोग करेगा। GAMs पर साइमन वुड की पुस्तक के डेटा और मॉडल कोड का उपयोग करने का एक उदाहरण है:

require(mgcv)
require(gamair)
data(cairo)
cairo2 <- within(cairo, Date <- as.Date(paste(year, month, day.of.month, 
                                              sep = "-")))
plot(temp ~ Date, data = cairo2, type = "l")

कैरो तापमान डेटा

प्रवृत्ति और मौसमी घटकों के साथ एक मॉडल को फिट करें --- चेतावनी यह धीमी है:

mod <- gamm(temp ~ s(day.of.year, bs = "cc") + s(time, bs = "cr"),
            data = cairo2, method = "REML",
            correlation = corAR1(form = ~ 1 | year),
            knots = list(day.of.year = c(0, 366)))

फिट मॉडल इस तरह दिखता है:

> summary(mod$gam)

Family: gaussian 
Link function: identity 

Formula:
temp ~ s(day.of.year, bs = "cc") + s(time, bs = "cr")

Parametric coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  71.6603     0.1523   470.7   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1 

Approximate significance of smooth terms:
                 edf Ref.df       F p-value    
s(day.of.year) 7.092  7.092 555.407 < 2e-16 ***
s(time)        1.383  1.383   7.035 0.00345 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1 

R-sq.(adj) =  0.848  Scale est. = 16.572    n = 3780

और हम प्रवृत्ति और मौसमी शब्दों के माध्यम से कल्पना कर सकते हैं

plot(mod$gam, pages = 1)

काहिरा ने ट्रेंड और मौसमी को फिट किया

और यदि हम प्रेक्षित डेटा पर प्रवृत्ति की साजिश करना चाहते हैं, तो हम भविष्यवाणी के साथ कर सकते हैं:

pred <- predict(mod$gam, newdata = cairo2, type = "terms")
ptemp <- attr(pred, "constant") + pred[,2]
plot(temp ~ Date, data = cairo2, type = "l",
     xlab = "year",
     ylab = expression(Temperature ~ (degree*F)))
lines(ptemp ~ Date, data = cairo2, col = "red", lwd = 2)

काहिरा फिटेड ट्रेंड

या वास्तविक मॉडल के लिए समान:

pred2 <- predict(mod$gam, newdata = cairo2)
plot(temp ~ Date, data = cairo2, type = "l",
     xlab = "year",
     ylab = expression(Temperature ~ (degree*F)))
lines(pred2 ~ Date, data = cairo2, col = "red", lwd = 2)

काहिरा फिटेड मॉडल

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

ट्रेंड को कैसे निर्धारित किया जाए, इस बारे में आपकी बात के अनुसार - अच्छी तरह से यह एक समस्या है, क्योंकि ट्रेंड रैखिक नहीं है, न तो आपके stl()संस्करण में और न ही जीएएम संस्करण मैं दिखाता हूं। यदि यह होता, तो आप परिवर्तन की दर (ढलान) दे सकते थे। यदि आप यह जानना चाहते हैं कि नमूनाकरण की अवधि में अनुमानित प्रवृत्ति कितनी बदल गई है, तो हम केवल समाहित किए गए डेटा का उपयोग कर सकते हैं predऔर केवल प्रवृत्ति घटक में श्रृंखला के प्रारंभ और अंत के बीच अंतर की गणना कर सकते हैं :

> tail(pred[,2], 1) - head(pred[,2], 1)
    3794 
1.756163

इसलिए तापमान औसतन रिकॉर्ड की शुरुआत की तुलना में 1.76 डिग्री अधिक गर्म होता है।


चार्ट को देखते हुए, मुझे लगता है कि फारेनहाइट और सेल्सियस के बीच कुछ भ्रम हो सकता है।
हेनरी

अच्छी तरह से देखा - मैं कुछ महीनों के लिए कुछ ऐसा ही कर रहा हूं और डेटा सी में हैं। आदत की ताकत थी!
मोनिका की बहाली - जी। सिम्पसन

थैंक्स गाविन, बहुत अच्छा और समझने योग्य जवाब। मैं आपके सुझावों की कोशिश करूँगा। क्या स्टाल () ट्रेंड कंपोनेंट को प्लॉट करना और लीनियर रिग्रेशन बनाना अच्छा है?
पचोमेट्री

1
@pacomet - नहीं, वास्तव में नहीं, जब तक कि आप एक मॉडल फिट नहीं करते हैं जो कि अवशिष्टों में आटोक्लेररेशन के लिए जिम्मेदार है जैसा कि मैंने ऊपर किया था। आप उसके लिए GLS का उपयोग कर सकते हैं ( gls()पैकेज के लिए nlme)। लेकिन जैसा कि ऊपर काहिरा के लिए दिखाता है, और एसटीएल आपके डेटा के लिए सुझाव देता है, प्रवृत्ति रैखिक नहीं है। जैसे, एक रेखीय प्रवृत्ति उचित नहीं होगी - क्योंकि यह डेटा का ठीक से वर्णन नहीं करता है। आपको इसे अपने डेटा पर आज़माने की ज़रूरत है, लेकिन अगर मैं दिखाता हूं तो एक एएम एक रैखिक प्रवृत्ति को नीचा दिखाएगा अगर यह डेटा सबसे अच्छा है।
मोनिका को बहाल करें - जी। सिम्पसन

1
@ और-एच-मैं ऐसा नहीं करेगा; एसटीएल का चलन खत्म हो गया है। GAM को AR () संरचना के साथ फिट करें और प्रवृत्ति की व्याख्या करें। यह एक उचित प्रतिगमन मॉडल देगा जो आपके लिए कहीं अधिक उपयोगी होगा।
मोनिका को बहाल करें - जी। सिम्पसन

4

गेविन ने बहुत ही गहन उत्तर दिया, लेकिन एक सरल और तेज़ समाधान के लिए, मैं stl फ़ंक्शन t.window पैरामीटर को उस मान पर सेट करने की सलाह देता हूं जो ts डेटा की आवृत्ति का एक से अधिक गुण है । मैं ब्याज की अनुमानित अवधि (उदाहरण के लिए, 3660 के मूल्य के लिए डायडल रिज़ॉल्यूशन डेटा के साथ डेडल ट्रेंड) का उपयोग करूंगा। लेखक के शोध प्रबंध में वर्णित stl2 पैकेज में भी आपकी रुचि हो सकती है । मैंने अपने स्वयं के डेटा में गैविन की विधि लागू की है और यह बहुत प्रभावी है।

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