Łączenie dwóch szeregów czasowych przez uśrednienie punktów danych


10

Chciałbym połączyć prognozę i prognozę wsteczną (mianowicie prognozowane wartości przeszłe) zestawu danych szeregów czasowych w jeden szereg czasowy, minimalizując średni błąd przewidywania kwadratu.

Powiedzmy, że mam szeregi czasowe z lat 2001–2010 z luką dla roku 2007. Byłem w stanie prognozować 2007 na podstawie danych z lat 2001–2007 (czerwona linia - zwana ) i nadawać wstecz z wykorzystaniem danych na lata 2008–2009 (jasnoniebieski linia - nazwij to ).Y bYfYb

Chciałbym połączyć punkty danych i w przypisany punkt danych Y_i dla każdego miesiąca. Idealnie chciałbym uzyskać wagę tak, aby zminimalizować średni błąd przewidywania kwadratu (MSPE) . Jeśli nie jest to możliwe, jak miałbym znaleźć średnią między punktami danych dwóch szeregów czasowych?Y b w Y iYfYbwYi

Yi=wYf+(1w)Yb

Jako szybki przykład:

tt_f <- ts(1:12, start = 2007, freq = 12)
tt_b <- ts(10:21, start=2007, freq=12)

tt_f
     Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2007   1   2   3   4   5   6   7   8   9  10  11  12
tt_b
     Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2007  10  11  12  13  14  15  16  17  18  19  20  21

Chciałbym uzyskać (tylko pokazując uśrednianie ... Idealnie minimalizując MSPE)

tt_i
     Jan Feb Mar Apr May Jun  Jul  Aug  Sep  Oct  Nov  Dec
2007 5.5 6.5 7.5 8.5 9.5 10.5 11.5 12.5 13.5 14.5 15.5 16.5

wprowadź opis zdjęcia tutaj


Jaki jest model prognostyczny (arima, etc, niektóre inne)? (+1) za sugestię podejścia, kiedyś myślałem o takim sposobie, ale pozostawałem w granicach Oczekiwania-Maksymalizacji po interpolacji. Zasadniczo okres nauki może mieć znaczenie, aby nadać modelowi większą wagę w oparciu o większe informacje (czerwona prognoza na zdjęciu). Niektóre kryteria dokładności mogą być również potencjalnie przydatne do tworzenia wag, ponieważ nie są tak deterministycznie powiązane z długością szeregów czasowych.
Dmitrij Celov,

Przepraszamy za pominięcie modelu prognozowania. Powyższy używa po prostu predictfunkcji pakietu prognozy. Myślę jednak, że użyję modelu prognostycznego HoltWinters do przewidywania i wstecznego rozwoju. Mam szeregi czasowe z niewielką liczbą <50 i próbowałem prognozowania regresji Poissona - ale z jakiegoś powodu bardzo słabych prognoz.
OSlOlSO,

Dane do zliczeń wydają się mieć przerwę dokładnie w miejscu, w którym pokazujesz, prognozy i przekazywanie również ilustrują to samo. W Poissonie dokonałeś regresji według trendu czasowego ? tlog(counts)t
Dmitrij Celov,

Czy masz tylko zliczenia lub jakieś dodatkowe powiązane szeregi czasowe bez NAwartości? Wydaje się, że uczynienie okresu nauki MSPE może wprowadzać w błąd, ponieważ podokresy są dobrze opisane przez tendencje liniowe, ale w pominiętym okresie gdzieś następuje spadek, a właściwie może to być dowolny punkt. Należy również zauważyć, że ponieważ prognozy mają tendencję kolinearną, ich średnia wprowadzi dwie przerwy strukturalne zamiast pozornie jednej.
Dmitrij Celov,

Przepraszam, że wróciłem tylko teraz @Dmitij. O czym jest ta „przerwa”, o której mówisz? Zrobiłem dziennik (liczy) dla regresji GLM. I jest podzbiór danych zliczania, który ma mniej niż <6, co zmusi mnie do korzystania z niego. Mam tylko liczby. Jeśli spojrzysz na to pytanie , zorientujesz się, jakie dane posiadam. Powyższe liczby dotyczą tylko grupy wiekowej „15up”. Czy to ma sens?
OSlOlSO,

Odpowiedzi:


0

Zakładając, że masz kwadratowe błędy predykcji dla prognozy i osobno dla backcastu, poleciłbym to: Niech będzie wektorem długości 12, niech będzie miesiącem, który Cię interesuje.

w=rep(NA,12);
for(w in 1:12){
w[m]=SPE_Backcast[m]/(SPE_Backcast[m]+SPE_Forecast[m]);
}

Teraz w jest wagą prognozy, a 1-w jest wagą prognozy wstecznej.


Wydaje się, że to tylko ważenie najwyższej wartości najniższej (do tego stopnia, że ​​liczby ujemne mogą mieć wagi> 1). Jaki jest sens? Również druga linias/w/m/
zero 101

Jak uzyskasz ujemne kwadratowe błędy prognozy?
Owe Jessen

3

Twoim celem jest wykonanie wygładzania ustalonego interwału (FI) szeregów czasowych. Wygładzona wartość obserwacji w czasie jest zdefiniowana jako oczekiwanie warunkowe gdzie zapis jest dla wektor obserwacji od czasu do czasu . Powyżej przyjmuje się, że odstęp stanowi przedział od czasu do , a jest długością całej serii. Czas jest w luce i oczekiwanie można zapisaćT T : = E ( T T | T 1 : R ,t Y u : v :=[ Y u ,

Y^t:=E(Yt|Y1:r,Ys:n)
U v r + 1 s - 1 n T Y T | 1 : r , s : nYu:v:=[Yu,Yu+1,,Yv]uvr+1s1ntY^t|1:r,s:n przypomnieć jej warunkowy charakter.

Wygładzona wartość nie ma prostej formy, którą zgadujesz. Dla gaussowskiego stacjonarnego szeregu czasowego ze znaną strukturą kowariancji, oszacowane dla w szczelinie można znaleźć rozwiązując układ liniowy. TY^tt

Gdy model szeregów czasowych można umieścić w postaci przestrzeni stanu (SS), wygładzanie FI jest standardową operacją opartą na filtrowaniu Kalmana i można tego dokonać np. Przy użyciu dostępnych funkcji R. Musisz tylko określić, że brakuje wartości w luce. Algorytm wygładzania szacuje stan ukryty który zawiera wszystkie istotne informacje o dla luce. Modele ARIMA można wprowadzić w postaci SS.αt tYtt

Co ciekawe, wygładzanie FI można zapisać jako kombinację dwóch filtrów: jednego do przodu i jednego do tyłu, co prowadzi do formuły oczekiwanej, ale do oszacowania stanu ukrytego (prognoza i backcast), ale nie dla obserwacji . Jest to znane jako filtrowanie Rauch-Tung-Striebel .Y tαtYt

Przynajmniej w wersjach multiplikatywnych procedury prognozowania „ad hoc”, takie jak Holt-Winters, opierają się na modelach stochastycznych bez prostych algorytmów FI, ponieważ nie można ich wprowadzić w postaci SS. Formułę wygładzania można prawdopodobnie przybliżyć w przybliżeniu za pomocą modelu SS, ale o wiele prostsze jest zastosowanie modeli Strukturalnych Szeregów Czasowych z transformacjami logów. Funkcje „KalmanSmooth”, „tsSmooth” i „StructTS” pakietu statystyk R mogą wykonać to zadanie. Powinieneś rzucić okiem na książki Harveya lub Durbina i Koopmana cytowane na stronach pomocy R. Algorytm wygładzania może zapewnić warunkową wariancję dla oszacowanegoYti może służyć do budowania interwałów wygładzania, które zwykle są większe w środku odstępu. Należy jednak pamiętać, że oszacowanie modeli konstrukcyjnych może być trudne.

AP <- log10(AirPassengers) 
## Fit a Basic Structural Model
fit <- StructTS(AP, type = "BSM")

## Fit with a gap
AP.gap <- AP
AP.gap[73:96] <- NA
fit.gap <- StructTS(AP.gap, type = "BSM", optim.control = list(trace = TRUE))

# plot in orginal (non-logged) scale
plot(AirPassengers, col = "black", ylab = "AirPass")
AP.missing <- ts(AirPassengers[73:96], start=1955, , freq=12)
lines(AP.missing, col = "grey", lwd = 1)

## smooth and sum 'level' and 'sea' to retrieve series
sm <- tsSmooth(fit.gap)
fill <- apply(as.matrix(sm[ , c(1,3)]), 1, sum)
AP.fill <- ts(fill[73:96], start=1955, , freq=12)
lines(10^AP.fill, col = "red", lwd = 1)

Wygładzone wypełnienie


2

Uważam, że wasze sugerowane podejście, polegające na wykorzystaniu środków z przednich i tylnych rzutów, jest interesujące.

Warto zwrócić uwagę na to, że w każdym systemie o chaotycznej strukturze prognozy prawdopodobnie będą dokładniejsze w krótszych okresach. Nie dotyczy to wszystkich systemów, na przykład tłumik wahadłowy może być modelowany przez funkcję z niewłaściwym okresem, w którym to przypadku wszystkie prognozy średnioterminowe prawdopodobnie będą błędne, podczas gdy wszystkie długoterminowe będą bardzo dokładne, ponieważ system zbiega się do zera. Ale wydaje mi się, z wykresu w pytaniu, że może to być rozsądne założenie tutaj.

Oznacza to, że lepiej byłoby, gdybyśmy w większym stopniu polegali na danych prognozowanych dla wcześniejszej części brakującego okresu, a bardziej na danych rzutowanych wstecz dla drugiej części. Najprostszym sposobem na to byłoby użycie liniowo malejącej wagi dla prognozy, a odwrotnie dla rzutowania wstecznego:

> n <- [number of missing datapoints] 
> w <- seq(1, 0, by = -1/(n+1))[2:(n+1)]

Daje to niewielką wagę backcastu na pierwszym elemencie. Możesz także użyć n-1, bez indeksów na końcu, jeśli chcesz użyć tylko wartości prognozy dla pierwszego interpolowanego punktu.

> w
 [1] 0.92307692 0.84615385 0.76923077 0.69230769 0.61538462 0.53846154
 [7] 0.46153846 0.38461538 0.30769231 0.23076923 0.15384615 0.07692308

Nie mam twoich danych, więc wypróbujmy to w zestawie danych AirPassenger w R. Po prostu usunę dwuletni okres w pobliżu centrum:

> APearly <- ts(AirPassengers[1:72], start=1949, freq=12)
> APlate <- ts(AirPassengers[97:144], start=1957, freq=12)
> APmissing <- ts(AirPassengers[73:96], start=1955, freq=12)
> plot(AirPassengers)
# plot the "missing data" for comparison
> lines(APmissing, col="#eeeeee")
# use the HoltWinters algorithm to predict the mean:
> APforecast <- hw(APearly)[2]$mean
> lines(APforecast, col="red")
# HoltWinters doesn't appear to do backcasting, so reverse the ts, forecast, 
# and reverse again (feel free to edit if there's a better process)
> backwards <- ts(rev(APlate), freq=12)
> backcast <- hw(backwards)[2]$mean
> APbackcast <- ts(rev(backcast), start=1955, freq=12)
> lines(APbackcast, col='blue')
# now the magic: 
> n <- 24 
> w <- seq(1, 0, by=-1/(n+1))[2:(n+1)]
> interpolation = APforecast * w + (1 - w) * APbackcast
> lines(interpolation, col='purple', lwd=2)

I jest twoja interpolacja.

wyjście wykresu

Oczywiście nie jest idealny. Wydaje mi się, że wynika to z faktu, że wzorce we wcześniejszej części danych różnią się od wzorców w drugiej części (szczyt lipiec-sierpień nie jest tak silny we wcześniejszych latach). Ale jak widać na zdjęciu, jest to wyraźnie lepsze niż tylko prognozowanie lub samo rzutowanie wstecz. Wyobrażam sobie, że twoje dane mogą uzyskać nieco mniej wiarygodne wyniki, ponieważ nie ma tak silnej zmienności sezonowej.

Domyślam się, że możesz spróbować tego, w tym również przedziały ufności, ale nie jestem pewien, czy robienie tego jest tak proste.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.