Zaman serilerindeki değişiklikleri tespit etme (R örneği)


18

Genellikle aynı şekle sahip zaman serisi verilerindeki değişiklikleri tespit etmek istiyorum. Şimdiye kadar changepointR ve cpt.mean(), cpt.var()ve cpt.meanvar()işlevleri için paketle çalıştım . cpt.mean()PELT yöntemi ile veriler genellikle bir seviyede kaldığında iyi çalışır. Ancak, inişler sırasındaki değişiklikleri de tespit etmek istiyorum. Tespit etmek istediğim bir değişiklik örneği, siyah eğrinin aniden düştüğü, örnek kırmızı noktalı çizgiyi takip etmesi gereken bölümdür. Cpt.var () işlevini denedim, ancak iyi sonuçlar alamadım. Herhangi bir tavsiyeniz var mı (mutlaka R kullanmak zorunda değiller)?

Eğriyi değiştir

Değişiklik içeren veriler (R nesnesi olarak):

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)

Sadece R kodu istiyorsanız, bunun konu dışı olduğunu unutmayın. Genel metodolojik tavsiye istiyorsanız, sorun değil. Bazı R kodları ile gelebilir, ama sonra tekrar gelmeyebilir.
gung - Monica'yı eski

1
İyi bir açıklama, genel bir çözümle ilgileniyorum, R'yi kullanmak sadece uygun olurdu.
mlee

Yanıtlar:


17

Zaman serilerindeki değişiklikleri tespit etmek için zaman serisi aykırı algılamasını kullanabilirsiniz. Tsay veya Chen ve Liu'nun prosedürleri popüler zaman serisi aykırı tespit yöntemleridir. Bu sitedeki önceki soruma bakın .

R'nin tsoutlier paketi, aykırı değerleri tespit etmek için Chen ve Liu'nun yöntemini kullanıyor. SAS / SPSS / Autobox da bunu yapabilir. Zaman serisindeki değişiklikleri tespit etmek için R kodu için aşağıya bakın.

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

tsoultlier paketindeki tso işlevi aşağıdaki aykırı değerleri tanımlar. Aykırı değerlerin türünü öğrenmek için belgeleri okuyabilirsiniz.

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

paket de güzel araziler sağlar. aşağıya bakınız. Grafik, aykırı değerlerin nerede olduğunu ve aykırı değer olmasaydı ne olacağını gösterir.

resim açıklamasını buraya girin

Ayrıca seviye değişimlerini tespit etmek için strucchange adında R paketini kullandım . Verilerinize örnek olarak

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

Program kesme noktalarını veya yapısal değişiklikleri doğru bir şekilde tanımlar.

Optimal 4-segment partition: 

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

Breakpoints at observation number:
17 41 87 

Corresponding to breakdates:
17 41 87 

Bu yardımcı olur umarım


1
Teşekkürler, tsoiyi çalışıyor, ancak daha büyük veri kümeleri için biraz yavaş. Yapı değişiminin kırılma noktası pozisyonları biraz keyfi görünmektedir (pozisyon 41 hariç).
mlee

7

Bu soruna aşağıdakilerden yaklaşırım perspektiflerden . Bunlar sadece kafamın üstünden bazı fikirler - lütfen onları bir tane tuzla alın. Yine de, bunun faydalı olacağını umuyorum.

  • Zaman serisi kümeleme . Örneğin, popüler dinamik zaman atlama (DTW) veya alternatif yaklaşımlar kullanarak. Lütfen ilgili cevaplarıma bakın: sınıflandırma / kümeleme için DTW ve DTW veya eşit olmayan zaman serileri için alternatifler . Buradaki fikir , zaman serilerini "normal" ve "anormal" (veya benzeri) kategorilerine ayırmaktır.

  • Entropi önlemleri . Zaman serisi entropi ölçümleri ile ilgili cevabımı görün . Fikir "normal" zaman serilerinin entropi belirlemek ve daha sonra bu fikir bir an varsayımı vardır (diğer zaman serileri ile karşılaştırmaktır entropi sapma "normalliği" sapma durumunda).

  • Anomali tespiti . Anomali tespiti ile ilgili cevabımı görün (R kaynaklarını içerir). Fikir etmektir doğrudan (referanslar bakınız) çeşitli yöntemlerle anormallik tespiti. Erken Uyarı Sinyalleri (EWS) Araç kutusu ve Rpaketi earlywarningsözellikle umut vericidir.


6

AUTOBOX kullanarak yanıtım @forecaster'a oldukça benziyor, ancak çok daha basit bir modelle. Box ve Einstein ve diğerleri, çözümleri basit ama çok basit değil tutmaya yansımışlardır. Otomatik olarak geliştirilen modeldi resim açıklamasını buraya girin. Gerçek ve temizlenmiş arsa çok benzer resim açıklamasını buraya girin. Kalıntıların (her zaman gösterilmesi gereken) bir arsa, artıkların resim açıklamasını buraya girinzorunlu acf'si ile birlikte buradadır resim açıklamasını buraya girin. Artıkların istatistikleri, "düello modelleri" arasında karşılaştırma yaparken her zaman faydalıdır resim açıklamasını buraya girin. Fiili / Sığdır / Tahmin grafiği buradaresim açıklamasını buraya girin


1

Verilerinizi düşürdüğünüzde sorununuz büyük ölçüde basitleştirilecek gibi görünüyor. Doğrusal olarak azalıyor gibi görünüyor. Verileri bir kez saptadığınızda, durağan olmama durumu için çok çeşitli testler uygulayabilirsiniz.


3
Tarihte açıkça farklı eğimler olduğu için bu yaklaşım başarısız olacaktır. Birden fazla "trend / eğim" eklemediğiniz sürece bu yaklaşım anlamlı sonuçlar vermeyecektir. Basit, basit çözümler genellikle çok basittir.
IrishStat

1

Tüm iyi cevaplar, ancak burada, @MrMeritology tarafından önerildiği gibi, söz konusu zaman serileri için ve diğer birçok "benzer" veri kümesi için iyi çalışıyor gibi görünen basit bir cevap var.

Aşağıda, aşağıdaki açıklayıcı grafikleri üreten bir R sn pasajı bulunmaktadır.

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")

resim açıklamasını buraya girin resim açıklamasını buraya girin resim açıklamasını buraya girin


çoklu eğilim değişiklikleri ve çoklu kesme değişiklikleri (seviye kaymaları) olabilir ... bu nedenle, bunları belirlemek için verileri gerçekten teşhis eden çözümler bulmaya ihtiyaç vardır ...
IrishStat

Evet, gerçekten, yukarıdaki yorumunuzu okudum. Bununla birlikte, birden fazla eğilimi / düzeyi tespit etmek için zaman serilerini teşhis etmek kendi başına bir sorundur. Buradaki nokta, yukarıdaki basit yaklaşımın bazen özellikle verilen veriler için işe yaradığını göstermek. Tersine, hiçbir yaklaşım her zaman iyi sonuç vermez. R.Hyndman'ın (R-fonksiyonu tsoutliers) bir yaklaşımı, başka türlü tavsiye edeceğim bir şeydir.
dnqxt

AUTOBOX, her zaman iyi çalışacak tek bir yaklaşımdır (en azından gördüğümüz zaman serilerinin zilyonları için) ve bir R versiyonu var. Eğer "salesy" almak istemiyorum gibi çevrimdışı sohbet etmek istiyorsanız burada tamamen anlaşılabilir / şeffaf ama kolayca çoğaltılamaz süreci açıklayabilirim.
IrishStat
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.