Ważna edycja: Chciałbym jak dotąd podziękować Dave'owi i Nickowi za ich odpowiedzi. Dobrą wiadomością jest to, że dostałem pętlę do pracy (zasada zapożyczona z postu prof. Hydnmana na temat prognozowania partii). Aby skonsolidować zaległe zapytania:
a) Jak zwiększyć maksymalną liczbę iteracji dla auto.arima - wydaje się, że przy dużej liczbie zmiennych egzogenicznych auto.arima osiąga maksymalne iteracje przed zbiegnięciem się na ostateczny model. Proszę mnie poprawić, jeśli nie rozumiem tego.
b) Jedna odpowiedź od Nicka podkreśla, że moje prognozy dla przedziałów godzinowych pochodzą wyłącznie z tych przedziałów godzinowych i nie mają na nie wpływu wcześniejsze zdarzenia w ciągu dnia. Mój instynkt, od czynienia z tymi danymi, mówi mi, że nie powinno to często powodować znaczącego problemu, ale jestem otwarty na sugestie, jak sobie z tym poradzić.
c) Dave zauważył, że potrzebuję znacznie bardziej wyrafinowanego podejścia do identyfikowania czasów wyprzedzenia / opóźnienia otaczających moje zmienne predykcyjne. Czy ktoś ma jakieś doświadczenie z programowym podejściem do tego w języku R? Oczywiście spodziewam się, że będą pewne ograniczenia, ale chciałbym posunąć ten projekt tak daleko, jak to tylko możliwe i nie mam wątpliwości, że musi on być przydatny także dla innych tutaj.
d) Nowe zapytanie, ale w pełni związane z danym zadaniem - czy auto.arima bierze pod uwagę regresory przy wyborze zamówień?
Staram się prognozować wizyty w sklepie. Potrzebuję umiejętności rozliczania się z przeprowadzkami, latami przestępczymi i sporadycznymi zdarzeniami (zasadniczo wartościami odstającymi); na tej podstawie uznaję, że ARIMAX jest moim najlepszym wyborem, wykorzystując zmienne egzogeniczne do próby modelowania wielokrotności sezonowości, a także wyżej wymienionych czynników.
Dane są rejestrowane 24 godziny w odstępach godzinnych. Jest to problematyczne ze względu na liczbę zer w moich danych, szczególnie w porach dnia, w których liczba odwiedzin jest bardzo mała, czasem żadna wcale po otwarciu sklepu. Ponadto godziny otwarcia są względnie zmienne.
Ponadto czas obliczeniowy jest ogromny w przypadku prognozowania jako jednego pełnego szeregu czasowego zawierającego ponad 3 lata danych historycznych. Doszedłem do wniosku, że przyspieszy to obliczanie każdej godziny dnia jako osobnych szeregów czasowych, a podczas testowania tego w bardziej obciążonych godzinach dnia wydaje się uzyskiwać większą dokładność, ale znów okazuje się, że staje się problemem z wczesnymi / późniejszymi godzinami, które nie powodują konsekwentnie otrzymuj wizyty. Sądzę, że proces skorzystałby z użycia auto.arima, ale wydaje się, że nie jest w stanie zsynchronizować się z modelem przed osiągnięciem maksymalnej liczby iteracji (stąd użycie ręcznego dopasowania i klauzuli maxit).
Próbowałem poradzić sobie z „brakującymi” danymi, tworząc zmienną egzogeniczną, gdy odwiedziny = 0. Ponownie, działa to świetnie w przypadku bardziej obciążonych porach dnia, gdy jedynym czasem braku odwiedzin jest zamknięcie sklepu na dany dzień; w tych przypadkach zmienna egzogeniczna wydaje się z powodzeniem radzić sobie z prognozowaniem naprzód, nie uwzględniając wpływu dnia, który był wcześniej zamknięty. Nie jestem jednak pewien, jak zastosować tę zasadę w odniesieniu do przewidywania spokojniejszych godzin, w których sklep jest otwarty, ale nie zawsze są odwiedzane.
Przy pomocy postu profesora Hyndmana o prognozowaniu wsadowym w R próbuję stworzyć pętlę do prognozowania serii 24, ale wydaje się, że nie chcę przewidywać od 13:00 i nie mogę zrozumieć, dlaczego. Otrzymuję komunikat „Błąd w optimum (init [maska], armafn, method = optim.method, hessian = TRUE,: nieskończona wartość różnicy skończonej [1]”), ale ponieważ wszystkie serie mają równą długość i zasadniczo używam ta sama matryca, nie rozumiem, dlaczego tak się dzieje. Oznacza to, że matryca nie ma pełnej rangi, nie? Jak mogę tego uniknąć w tym podejściu?
https://www.dropbox.com/s/26ov3xp4ayig4ws/Data.zip
date()
#Read input files
INPUT <- read.csv("Input.csv")
XREGFDATA <- read.csv("xreg.csv")
#Subset time series data from the input file
TS <- ts(INPUT[,2:25], f=7)
fcast <- matrix(0, nrow=nrow(XREGFDATA),ncol=ncol(TS))
#Create matrix of exogenous variables for forecasting.
xregf <- (cbind(Weekday=model.matrix(~as.factor(XREGFDATA$WEEKDAY)),
Month=model.matrix(~as.factor(XREGFDATA$MONTH)),
Week=model.matrix(~as.factor(XREGFDATA$WEEK)),
Nodata=XREGFDATA$NoData,
NewYearsDay=XREGFDATA$NewYearsDay,
GoodFriday=XREGFDATA$GoodFriday,
EasterWeekend=XREGFDATA$EasterWeekend,
EasterMonday=XREGFDATA$EasterMonday,
MayDay=XREGFDATA$MayDay,
SpringBH=XREGFDATA$SpringBH,
SummerBH=XREGFDATA$SummerBH,
Christmas=XREGFDATA$Christmas,
BoxingDay=XREGFDATA$BoxingDay))
#Remove intercepts
xregf <- xregf[,c(-1,-8,-20)]
NoFcast <- 0
for(i in 1:24) {
if(max(INPUT[,i+1])>0) {
#The exogenous variables used to fit are the same for all series except for the
#'Nodata' variable. This is to handle missing data for each series
xreg <- (cbind(Weekday=model.matrix(~as.factor(INPUT$WEEKDAY)),
Month=model.matrix(~as.factor(INPUT$MONTH)),
Week=model.matrix(~as.factor(INPUT$WEEK)),
Nodata=ifelse(INPUT[,i+1] < 1,1,0),
NewYearsDay=INPUT$NewYearsDay,
GoodFriday=INPUT$GoodFriday,
EasterWeekend=INPUT$EasterWeekend,
EasterMonday=INPUT$EasterMonday,
MayDay=INPUT$MayDay,
SpringBH=INPUT$SpringBH,
SummerBH=INPUT$SummerBH,
Christmas=INPUT$Christmas,
BoxingDay=INPUT$BoxingDay))
xreg <- xreg[,c(-1,-8,-20)]
ARIMAXfit <- Arima(TS[,i],
order=c(0,1,8), seasonal=c(0,1,0),
include.drift=TRUE,
xreg=xreg,
lambda=BoxCox.lambda(TS[,i])
,optim.control = list(maxit=1500), method="ML")
fcast[,i] <- forecast(ARIMAXfit, xreg=xregf)$mean
} else{
NoFcast <- NoFcast +1
}
}
#Save the forecasts to .csv
write(t(fcast),file="fcasts.csv",sep=",",ncol=ncol(fcast))
date()
Byłbym w pełni wdzięczny za konstruktywną krytykę sposobu, w jaki to robię i wszelką pomoc w uruchomieniu tego skryptu. Wiem, że jest dostępne inne oprogramowanie, ale jestem ściśle ograniczony do używania R i / lub SPSS tutaj ...
Ponadto jestem bardzo nowy na tych forach - starałem się przedstawić możliwie pełne wyjaśnienie, zademonstrować wcześniejsze badania, które przeprowadziłem, a także dać powtarzalny przykład; Mam nadzieję, że to wystarczy, ale daj mi znać, jeśli mogę jeszcze coś ulepszyć w swoim poście.
EDYCJA: Nick zasugerował, że najpierw używam sum dziennych. Powinienem dodać, że to przetestowałem, a zmienne egzogeniczne generują prognozy, które uwzględniają dzienną, tygodniową i roczną sezonowość. Był to jeden z innych powodów, dla których myślałem o przewidywaniu każdej godziny jako osobnej serii, jednak, jak wspomniał Nick, na moją prognozę na godzinę 16:00 w danym dniu nie będą miały wpływu wcześniejsze godziny w ciągu dnia.
EDYCJA: 09/08/13, problem z pętlą dotyczył po prostu oryginalnych zamówień, których użyłem do testowania. Powinienem był to zauważyć wcześniej i pilniej próbuję użyć auto.arima do pracy z tymi danymi - patrz punkt a) id) powyżej.