Soru:
Bir zaman serisine sağlam bir adım işlevi nasıl yerleştirilir?
Alexander Engelhardt
2018-11-16 15:13:28 UTC
view on stackexchange narkive permalink

Farklı seviyelerde dolaşan biraz gürültülü bir zaman serim var.

Örneğin, aşağıdaki veriler:

enter image description here

Kesintisiz çizgi verisine sahibim ve kesikli çizgi için bir tahmin almak istiyorum. Parçalı sabit olmalıdır.

Burada hangi algoritmaları denemek uygundur?

Şimdiye kadarki fikirlerim, 0 derecelik P-spline'lar (ama düğümleri nereye yerleştireceğimi nasıl öğrenebilirim?) veya yapısal kırılma modelleri etrafında dönüyor. Bir regresyon ağacı şu anda sahip olduğum en iyi fikir, ancak ideal olarak y = 250'deki iki seviyenin eşit y değerlerinde olduğu gerçeğini hesaba katan bir yöntem arıyorum. Doğru anlarsam, bir regresyon ağacı bu iki aralığı, her biri farklı bir ortalamaya sahip iki farklı gruba ayırırdı.

Onu oluşturan R kodu şudur:

  set.seed (20181118)
true_fct = stepfun (c (100, 200, 250), c (200, 250, 300, 250))
x = 1: 400
y = true_fct (x) + rt (uzunluk (x), df = 1)
arsa (x, y, tür = "l")
çizgiler (x, true_fct (x), lty = 2, lwd = 3)
 
Verileriniz gerçekten simüle edilenler gibi görünüyorsa, çok küçük bir pencereye sahip pencereli bir medyan hesaplamaktan daha iyisini yapamazsınız: bu, tüm sıçramaları güvenilir bir şekilde tespit eder.Algılanan bu tür her aralıktaki yanıtların medyanlarını kullanarak seviyeleri tahmin edin.Bu nedenle, simülasyonun örtük varsayımlarının - büyük sıçramalar, parçalı sabit medyanlar ve Student t hataları - tam olarak yapmamız gereken varsayımlar olup olmadığını belirtebilir misiniz?
Yorumun için teşekkürler!İki notum var: (1) Aralıkları pencereli medyandan nasıl elde ederim? (2) Varsayımlar, parçalı sabit medyanlar ve göze çarpan sıçramalardır, ancak hata dağılımı hakkında, büyük aykırı değerlerin olabileceği gerçeği dışında hiçbir şey bilmiyorum.
Bazen basit parametrik olmayan yöntemler, problem basit olduğunda işe yarar.Yerleşik bir arima yapısının ve belki de bir veya iki mevsimsel nabzın olduğu daha zorlu / gerçekçi bir veri setini simüle etmenizi istiyorum.Bunun gibi sorunlara yönelik kapsamlı yaklaşımların, işleme sırasında otoregresif yapı ve anormallikleri dikkate alması ve izole etmesi gerekir.Başka bir soru gönderebilir ve biraz daha gerçekçi veri kümesini ekleyebilirsiniz.
Ayrıca, seviye / adım kaymaları çok büyük olduğunda, parametrik olmayan yöntemlerin hata sürecine kıyasla yararlı bir rol oynayabileceğini ve bu oran küçüldükçe daha azını da eklemeliyim.
üç yanıtlar:
whuber
2018-11-17 00:30:18 UTC
view on stackexchange narkive permalink

Bu tür gürültülerin üstesinden gelmenin basit ve sağlam bir yöntemi, medyanları hesaplamaktır.

Kısa bir pencerede yuvarlanan bir medyan, en küçük sıçramalar dışında tümünü algılarken, algılanan sıçramalar arasındaki aralıklar içindeki yanıtın ortancaları bunların seviyelerini sağlam bir şekilde tahmin eder. (Bu ikinci tahmini, aykırı değerlerden etkilenmeyen herhangi bir sağlam tahminle değiştirebilirsiniz.)

Kabul edilebilir hata oranlarına ulaşmak için bu yaklaşımı gerçek veya simüle edilmiş verilerle ayarlamalısınız. Örneğin, sorudaki simülasyon için, atlamaları algılamak için eşikleri ayarlamak için ikinci ve 98. yüzdelik dilimleri kullanmayı iyi buldum. Diğer durumlarda - örneğin çok sayıda sıçramanın meydana gelebileceği durumlarda - daha merkezi yüzdelik dilim daha iyi çalışır.

İşte (a) üç sıçramayı kırmızı noktalar olarak ve (b) tahmini dört seviyeyi açık mavi çizgiler olarak gösteren sonuç.

Figure

Sıçramaların 100, 200, 250 dizinlerinde (simülasyonun meydana geldiği yer tam olarak budur) gerçekleşeceği tahmin edilmektedir ve sonuçta elde edilen düzeyler 199,6, 249,8, 300,0 ve 250,2 olarak tahmin edilmektedir: tümü gerçek temelin 0,4'ü içinde değerler.

Bu mükemmel davranış, tekrarlanan simülasyonlarla devam eder (başlangıçta set.seed komutunun kaldırılması).

İşte R kodu.

  #
# Yuvarlanan medyanlar.
#
<- fonksiyonu (x, k = 3) {
  n <- uzunluk (x)
  x.med <- sapply (1: (n-k + 10), işlev (i) medyan (x [i + 0: (k-1)]))
  l <- kat (k / 2)
  c (rep (NA, l), x.med, rep (NA, k-l))
}
y.med <- rollmed (y, k = 5)
#
# Değişiklik noktası analizi.
#
dy <- diff (y.med)
dördüncü <- kuantil (dy, c (1,49) / 50, na.rm = DOĞRU)
eşikler <- dördüncü + fark (dördüncüsü) * 2,5 * c (-1,1)
<- atlar (dy < eşikleri [1] | dy > eşikleri [2]) + 1

noktalar (atlamalar, y.med [atlamalar], pch = 21, bg = "Kırmızı")
#
# Çizim.
#
limitler <- c (1, atlamalar, uzunluk (y) +1)
y.hat <- rep (NA, uzunluk (atlamalar) +1)
for (i in 1: (length (atlar) +1)) {
  j0 <- sınırlar [i]
  j1 <- sınırlar [i + 1] -1
  y.hat [i] <- medyan (y [j0: j1])
  çizgiler (x [j0: j1], rep (y.hat [i], j1-j0 + 1), col = "skyblue", lwd = 2)
}
 
+1, ancak kodun "değişim noktası analizi" kısmı bazı kullanıcılar için tam olarak net olmayabilir, bu nedenle orada neler olduğunu yorumlayabilirsiniz?
@Tim Öneriniz için teşekkür ederiz.İlk paragrafın amacı bu algoritmayı açıklamaktır.Bunun uygulanmasının ayrıntılarını küçümsemek isterim çünkü bunlar önemsizdir: kalıntılara herhangi bir sağlam aykırı değer tarama yöntemini uygulamak yeterli olmalıdır.
Kodunuzu basitleştirmek için "zoo :: rollmedian" veya benzer bir işlevi düşünebilirsiniz.
@usεr11852 Teşekkürler.['Hayvanat bahçesinin' farkındayım] (https://stats.stackexchange.com/a/35612/919) ancak tembel olduğum için onu kullanmamayı seçtim!"Rollmed" yazmak, halihazırda mevcut olan herhangi bir işlev için argüman çağrılarını incelemekten daha hızlı ve daha kolaydı.Ayrıca, bir kara kutunun arkasındaki ayrıntıları gizlemek yerine, "rollmed" in ne yaptığımı açıkça göstermesini seviyorum.
Sorun değil.:) (`zoo'yu bildiğinizden emindim, onu kendi seçiminizle mi yoksa kazayla mı kullanmadığınızdan emin değildim. Her durumda iyi cevap +1)
İyi istatistiksel yazılım (AUTOBOX gibi yazdığım) hiçbir zaman cehalet perdesinin arkasına saklanmaz, ancak kullanılan prosedürleri adım adım detaylandırır ve böylece biz zarfı daha da zorlamak için çalışırken (tabiri caizse) tekrarlamaya davet eder.Yine OP'den, ARIMA yapısının oyunda olduğu ve adımların büyüklüğünün daha gerçekçi bir problem setine yol açacak şekilde azaltıldığı bir örnek yayınlamasını istiyorum, Bana göre parametrik olmayan yöntemler genellikle son başvurulacak ve mümkün olduğunda titizlikle kaçınılmalıdır.. '
Gi_F.
2018-11-28 16:29:58 UTC
view on stackexchange narkive permalink

L0 cezalarıyla düzeltmeyle hala ilgileniyorsanız, şu referansa bir göz atacağım: "Genomik Değişikliklerin L0 Cezası Kullanılarak Segmentlere Ayrılmış Düzeltme ile Görselleştirilmesi" - DOI: 10.1371 / journal.pone.0038230 (güzel bir Whittaker pürüzsüzlüğüne giriş P. Eilers kağıt "Mükemmel pürüzsüzlükte" - DOI: 10.1021 / ac034173t) bulunabilir. Elbette, hedefinize ulaşmak için yöntem etrafında biraz çalışmanız gerekir.

Prensip olarak 3 malzemeye ihtiyacınız var:

  1. Daha pürüzsüz - Whittaker'ı daha pürüzsüz kullanırdım. Ayrıca, matris büyütmeyi kullanacağım (bkz.Eilers ve Marx, 1996 - "B-spline'lar ile Esnek Düzeltme ve Cezalar ", s.101).
  2. Nicelik regresyonu - Tembellik için R paketi quantreg (rho = 0.5) kullanacağım :-)
  3. L0-ceza - Bahsedilen "Genomik Değişikliklerin L0 Cezası Kullanılarak Segmentlere Ayrılmış Düzeltme ile Görselleştirilmesi" ni takip edeceğim - DOI: 10.1371 / journal.pone.0038230

Elbette, en uygun düzleştirme miktarını seçmenin de bir yolunu bulmanız gerekir. Bu örnek için marangoz gözlerim tarafından yapıldı. DOI: 10.1371 / journal.pone.0038230'daki ölçütleri kullanabilirsiniz (sf. 5, ancak sizin örneğinizde denemedim).

Aşağıda küçük bir kod bulacaksınız. Yol göstermesi için bazı yorumlar bıraktım.

  # Çapraz Doğrulanmış örnek
rm (liste = ls ()); graphics.off (); kedi ("\ 014")

kitaplık (eğri çizgiler)
kütüphane (Matrix)
kütüphane (quantreg)

# Veri
set.seed (20181118)
n = 400
x = 1: n
true_fct = stepfun (c (100, 200, 250), c (200, 250, 300, 250))
y = true_fct (x) + rt (uzunluk (x), df = 1)

# Bazları hazırlayın - Kimlik matrisi (Whittaker)
# B-spline'lar için değiştirilebilir
B = diag (1, n, n)

# Ceza hazırlayın - lambda parametresi düzeltmesi
nb = ncol (B)
D = fark (diag (1, nb, nb), fark = 1)
lambda = 1e2

# Standart Whittaker'ı çözün - başlangıç ​​değerleri için
a = çöz (t (B)% *% B + çapraz kanal (D), t (B)% *% y, tol = 1e-50)

DOI: 10.1371 / journal.pone.0038230'daki gibi L0-Diff cezalı tahmini döngü
p = 1e-6
nit = 100
beta = 1e-5

for (it in 1: nit) {
  ao = a

  # Ceza ağırlıkları
w = (c (D% *% a) ^ 2 + beta ^ 2) ^ ((p - 2) / 2)
  W = diag (c (w))

  # Matris büyütme
  cD = lambda * sqrt (W)% *% D
  Bp = rbind (B, cD)
  yp = c (y, 1: nrow (cD) * 0)

  # Katsayıları güncelle - Quantreg'den rq.fit
  a = rq.fit (Bp, yp, tau = 0.5) $ coef

  # Yakınsamayı kontrol edin ve güncelleyin
  da = max (abs ((a - ao) / ao))
  kedi (o, da, '\ n')
  eğer (da < 1e-6) kırılırsa
}

# Uygun
v = B% *% a

# Sonuçları göster
arsa (x, y, pch = 16, cex = 0.5)
çizgiler (x, y, col = 8, lwd = 0.5)
çizgiler (x, v, col = 'blue', lwd = 2)
çizgiler (x, true_fct (x), col = 'red', lty = 2, lwd = 2)
açıklama ("topright", açıklama = c ("Gerçek Sinyal", "Düzleştirilmiş sinyal"),
       col = c ("kırmızı", "mavi"), lty = c (2, 1))
 

enter image description here PS.Bu, Çapraz Doğrulamayla ilgili ilk cevabım.Umarım yeterince yararlı ve anlaşılırdır :-)

Tom Reilly
2018-11-16 18:33:42 UTC
view on stackexchange narkive permalink

Ruey Tsay'in kağıt Aykırı Değerlerini, seviye değişimlerini ve zaman serilerindeki varyans değişikliklerini AR1 ve 21 aykırı değerlere sahip Fark modelini kullanmayı düşünürdüm.

enter image description here

enter image description here

Farklılıkları kapattık ve özellikle seviye değişimleri çağrıldı.

enter image description here

Sorunun başlığındaki "sağlam" vurgusunu gözden kaçırıp gözden kaçırmadığınızı merak ediyorum, çünkü 3 gerçek sıçramaya ek olarak 18 sahte parametreyi (simülasyonda tanıtılan aykırı değerlere karşılık gelen) tanımlayan herhangi bir yöntem pek sağlam (veya cimri) olarak kabul edilemez.bu önemli).
Bu sağlam bir çözüm.Aykırı değerleri belirlemeye ve bunlara uyum sağlamaya neden karşı olduğunuzu bilmiyorum ama bunu yapmayı destekleyen bir araştırma dünyası ve tabii ki deneyimlerimiz var.Bu diğer değişkenler uç değerlerdir.Farkı karşılaştırmak için geçmiş verileri ve temizlenmiş bir sürümü gösteren bir grafik ekledim.
Adım işlevine ilişkin tahmininizin ne olduğu konusunda açık olabilir misiniz?
100 (x3), 200 (x2), 250 (x4) periyodunda adımı gösteren bir bayrak vardır.Farklılaştıran operatör, görmeyi biraz daha zorlaştırır, ancak etkisi aynıdır.Fark etmeden bir model ekledim.


Bu Soru-Cevap, otomatik olarak İngilizce dilinden çevrilmiştir.Orijinal içerik, dağıtıldığı cc by-sa 4.0 lisansı için teşekkür ettiğimiz stackexchange'ta mevcuttur.
Loading...