समय श्रृंखला में परिवर्तन का पता लगाना (R उदाहरण)


18

मैं समय श्रृंखला के आंकड़ों में बदलाव का पता लगाना चाहूंगा, जिसमें आमतौर पर एक ही आकार होता है। अब तक मैं changepointआर cpt.mean(), cpt.var()और cpt.meanvar()कार्यों के लिए पैकेज के साथ काम कर चुका हूं । cpt.mean()PELT विधि के साथ अच्छी तरह से काम करता है जब डेटा आमतौर पर एक स्तर पर रहता है। हालाँकि मैं उतरने के दौरान परिवर्तनों का पता लगाना चाहूंगा। एक बदलाव के लिए एक उदाहरण, मैं इसका पता लगाना चाहूंगा, वह खंड है जहां काला वक्र अचानक गिरता है जबकि इसे वास्तव में परीक्षा लाल बिंदीदार रेखा का पालन करना चाहिए। मैंने cpt.var () फ़ंक्शन के साथ प्रयोग किया है, हालांकि मुझे अच्छे परिणाम नहीं मिले। क्या आपको कोई सिफारिश मिली है (जिन्हें आवश्यक रूप से आर का उपयोग करने की आवश्यकता नहीं है)?

करवट बदलें

यहां परिवर्तन के साथ डेटा है (आर ऑब्जेक्ट के रूप में):

dat.change <- c(12.013995263488, 11.8460207231808, 11.2845153487846, 11.7884417180764, 
11.6865425802022, 11.4703118125303, 11.4677576899063, 11.0227199625084, 
11.274775836817, 11.03073498338, 10.7771805591742, 10.7383206158923, 
10.5847230134625, 10.2479315651441, 10.4196381241735, 10.467607842288, 
10.3682422713283, 9.7834431752935, 9.76649842404295, 9.78257968297228, 
9.87817694914062, 9.3449034905713, 9.56400153361727, 9.78120084558148, 
9.3445162813738, 9.36767436354887, 9.12070987223648, 9.21909859069157, 
8.85136359917466, 8.8814423003979, 8.61830163359642, 8.44796977628488, 
8.06957847272046, 8.37999165387824, 7.98213210294954, 8.21977468333673, 
7.683960439316, 7.73213584532496, 7.98956476021092, 7.83036046746187, 
7.64496198988985, 4.49693528397253, 6.3459274845112, 5.86993447552116, 
4.58301192892403, 5.63419551523625, 6.67847511602895, 7.2005344054883, 
5.54970477623895, 6.00011922569104, 6.882667104467, 4.74057284230894, 
6.2140437333397, 6.18511450451019, 5.83973575417525, 6.57271194428385, 
5.36261938326723, 5.48948831338016, 4.93968645996861, 4.52598133247377, 
4.56372558828803, 5.74515428123725, 5.45931581984165, 5.58701112949141, 
6.00585679276365, 5.41639695946931, 4.55361875158434, 6.23720558202826, 
6.19433060301002, 5.82989415940829, 5.69321394985076, 5.53585871082265, 
5.42684812413063, 5.80887522466946, 5.56660158483312, 5.7284521523444, 
5.25425775891636, 5.4227645808924, 5.34778016248718, 5.07084809927736, 
5.324066161355, 5.03526881241705, 5.17387528516352, 5.29864121433813, 
5.36894461582415, 5.07436929444317, 4.80619983525015, 4.42858947882894, 
4.33623051506001, 4.33481791951228, 4.38041031792294, 3.90012900415342, 
4.04262777674943, 4.34383842876647, 4.36984816425014, 4.11641092254315, 
3.83985887104645, 3.81813419810962, 3.85174630901311, 3.66434598962311, 
3.4281724860426, 2.99726515704766, 2.96694634792395, 2.94003031547181, 
3.20892607367132, 3.03980832743458, 2.85952185077593, 2.70595278908964, 
2.50931109659839, 2.1912274016859)

ध्यान दें कि यदि आप केवल आर कोड के लिए पूछ रहे हैं, तो यह यहां विषय से हटकर होगा। यदि आप सामान्य कार्यप्रणाली सलाह के लिए पूछ रहे हैं, तो यह ठीक है। यह w / कुछ R कोड आ सकता है, लेकिन फिर, यह नहीं हो सकता है।
गंग -

1
अच्छी टिप्पणी, मैं एक सामान्य समाधान में रुचि रखता हूं, आर का उपयोग करना सुविधाजनक होगा।
mlee

जवाबों:


17

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

R का tsoutlier पैकेज आउटलेर्स का पता लगाने के लिए चेन और लियू की विधि का उपयोग करता है। SAS / SPSS / ऑटोबॉक्स भी ऐसा कर सकते हैं। समय श्रृंखला में परिवर्तनों का पता लगाने के लिए आर कोड के लिए नीचे देखें।

library("tsoutliers")
dat.ts<- ts(dat.change,frequency=1)
data.ts.outliers <- tso(dat.ts)
data.ts.outliers
plot(data.ts.outliers)

tsoultlier पैकेज में tso फ़ंक्शन आउटलेर्स का अनुसरण करता है। आप आउटलेयर के प्रकार का पता लगाने के लिए प्रलेखन पढ़ सकते हैं।

Outliers:
  type ind time coefhat   tstat
1   TC  42   42 -2.9462 -10.068
2   AO  43   43  1.0733   4.322
3   AO  45   45 -1.2113  -4.849
4   TC  47   47  1.0143   3.387
5   AO  51   51  0.9002   3.433
6   AO  52   52 -1.3455  -5.165
7   AO  56   56  0.9074   3.710
8   LS  62   62  1.1284   3.717
9   AO  67   67 -1.3503  -5.502

पैकेज भी अच्छा भूखंड प्रदान करता है। निचे देखो। साजिश से पता चलता है कि आउटलेयर कहां हैं और यह भी कि अगर कोई आउटलेयर नहीं होता तो क्या होता।

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

मैंने स्तर बदलावों का पता लगाने के लिए स्ट्रैचेंज नामक आर पैकेज का भी उपयोग किया है। आपके डेटा पर एक उदाहरण के रूप में

library("strucchange")
breakpoints(dat.ts~1)

कार्यक्रम सही ढंग से ब्रेकपॉइंट या संरचनात्मक परिवर्तनों की पहचान करता है।

Optimal 4-segment partition: 

Call:
breakpoints.formula(formula = dat.ts ~ 1)

Breakpoints at observation number:
17 41 87 

Corresponding to breakdates:
17 41 87 

उम्मीद है की यह मदद करेगा


1
धन्यवाद, tsoअच्छी तरह से काम करता है, हालांकि यह बड़े डेटासेट के लिए थोड़ा धीमा है। स्ट्रैचचेंज के ब्रेकपॉइंट स्थिति थोड़ी सी मनमानी लगती है (स्थिति 41 को छोड़कर)।
mlee

7

मैं निम्नलिखित दृष्टिकोण से इस समस्या से संपर्क करूंगा । ये सिर्फ मेरे सिर के ऊपर से कुछ विचार हैं - कृपया उन्हें नमक के दाने के साथ लें। फिर भी, मुझे आशा है कि यह उपयोगी होगा।

  • समय श्रृंखला क्लस्टरिंग । उदाहरण के लिए, लोकप्रिय डायनेमिक टाइम वारपिंग (DTW) या वैकल्पिक तरीकों का उपयोग करके । कृपया मेरे संबंधित उत्तर देखें: वर्गीकरण के लिए DTW पर / क्लस्टरिंग और DTW पर या असमान समय श्रृंखला के लिए विकल्पविचार श्रेणियों "सामान्य" और "असामान्य" (या समान) में क्लस्टर समय श्रृंखला है।

  • एन्ट्रापी के उपायसमय श्रृंखला एन्ट्रापी उपायों पर मेरा प्रासंगिक उत्तर देखें । यह विचार एक "सामान्य" समय श्रृंखला की एन्ट्रापी निर्धारित करने के लिए है और फिर अन्य समय श्रृंखला के साथ तुलना करें (इस विचार में "सामान्यता" से विचलन के मामले में एक एंट्रॉपी विचलन की धारणा है )।

  • विसंगति का पता लगानाविसंगति का पता लगाने (आर संसाधनों सहित) पर मेरा प्रासंगिक उत्तर देखें । यह विचार विभिन्न तरीकों के माध्यम से विसंगतियों का सीधे पता लगाने के लिए है (कृपया संदर्भ देखें)। प्रारंभिक चेतावनी संकेत (ईडब्ल्यूएस) टूलबॉक्स और Rपैकेज earlywarningsविशेष रूप से आशाजनक लगता है।


6

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


1

ऐसा लगता है कि यदि आप अपने डेटा को बाधित करते हैं तो आपकी समस्या बहुत सरल हो जाएगी। यह रैखिक रूप से घटता हुआ प्रतीत होता है। एक बार जब आप डेटा को रोकते हैं, तो आप गैर-स्टेशनरिटी के लिए कई प्रकार के परीक्षण लागू कर सकते हैं।


3
यह दृष्टिकोण विफल हो जाएगा क्योंकि इतिहास में स्पष्ट रूप से अलग ढलान हैं। जब तक आप कई "रुझान / ढलान" को शामिल नहीं कर रहे हैं, यह दृष्टिकोण सार्थक परिणाम नहीं देगा। सरल सीधे-आगे के समाधान अक्सर बहुत सरल होते हैं।
आयरिशस्टैट

1

सभी ठीक उत्तर, लेकिन यहाँ एक सरल है, जैसा कि @MrMititology द्वारा सुझाया गया है, जो प्रश्न में समय श्रृंखला के लिए अच्छी तरह से काम करता है, और कई अन्य "समान" डेटा सेटों के लिए भी संभव है।

यहाँ एक आर-स्निपेट है जो नीचे दिए गए स्व-व्याख्यात्मक ग्राफ का उत्पादन करता है।

outl = rep( NA, length(dat.change))
detr = c( 0, diff( dat.change))

ix = abs(detr) > 2*IQR( detr)
outl[ix] = dat.change[ix]

plot( dat.change, t='l', lwd=2, main="dat.change TS")
points( outl, col=2, pch=18)

plot( detr, col=4, main="detrended TS", t='l', lwd=2 )
acf( detr, main="ACF of detrended TS")

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


वहाँ कई प्रवृत्ति परिवर्तन और कई अवरोधन परिवर्तन (स्तर बदलाव) हो सकते हैं ... इस प्रकार समाधान खोजने की आवश्यकता है जो वास्तव में इनको निर्धारित करने के लिए डेटा का निदान करते हैं ...
आयरिशस्टैट

हां, वास्तव में, मैंने आपकी पिछली टिप्पणी ऊपर पढ़ी है। हालांकि, कई प्रवृत्तियों / स्तरों का पता लगाने के लिए समय श्रृंखला का निदान करना अपने आप में एक समस्या है। यहां मेरा कहना यह है कि उपरोक्त सरल दृष्टिकोण कभी-कभी काम करता है, विशेष रूप से दिए गए डेटा के लिए। इसके विपरीत, कोई एकल दृष्टिकोण हमेशा अच्छी तरह से काम नहीं करेगा। R.Hyndman (R-function tsoutliers) का एक दृष्टिकोण कुछ ऐसा है जिसे मैं अन्यथा सुझाऊंगा।
dnqxt

AUTOBOX एकल दृष्टिकोण है जो हमेशा अच्छी तरह से काम करेगा (कम से कम समय में हमने जो श्रृंखला देखी है, उसके लिए) एक आर संस्करण है। यदि आप ऑफ़लाइन चैट करना चाहते हैं, तो मैं "सेल्फी" नहीं लेना चाहता, यहां मैं उस प्रक्रिया को समझा सकता हूं जो पूरी तरह से समझने योग्य / पारदर्शी है लेकिन आसानी से नकल नहीं की जाती है।
आयरिशस्टैट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.