Vorhersage von stündlichen Zeitreihen mit täglicher, wöchentlicher und jährlicher Periodizität

12

Hauptbearbeitung: Ich möchte mich bisher bei Dave & Nick für ihre Antworten bedanken. Die gute Nachricht ist, dass ich die Schleife zum Laufen gebracht habe (Prinzip aus Prof. Hydnmans Beitrag zur Chargenprognose). So konsolidieren Sie die ausstehenden Abfragen:

a) Wie erhöhe ich die maximale Anzahl von Iterationen für auto.arima? Es scheint, dass auto.arima bei einer großen Anzahl von exogenen Variablen die maximale Anzahl von Iterationen erreicht, bevor es zu einem endgültigen Modell konvergiert. Bitte korrigieren Sie mich, wenn ich das falsch verstehe.

b) Eine Antwort von Nick hebt hervor, dass meine Vorhersagen für stündliche Intervalle nur aus diesen stündlichen Intervallen abgeleitet werden und nicht durch Ereignisse früher am Tag beeinflusst werden. Mein Instinkt aus dem Umgang mit diesen Daten sagt mir, dass dies nicht oft ein bedeutendes Problem verursachen sollte, aber ich bin offen für Vorschläge, wie ich damit umgehen soll.

c) Dave hat darauf hingewiesen, dass ich einen viel ausgefeilteren Ansatz zur Identifizierung von Vorlauf- / Verzögerungszeiten für meine Prädiktorvariablen benötige. Hat jemand Erfahrung mit einem programmatischen Ansatz in R? Ich gehe natürlich davon aus, dass es Einschränkungen geben wird, aber ich möchte dieses Projekt so weit wie möglich vorantreiben, und ich bezweifle nicht, dass dies auch anderen hier von Nutzen sein muss.

d) Neue Abfrage, die jedoch vollständig mit der jeweiligen Aufgabe zusammenhängt - berücksichtigt auto.arima die Regressoren bei der Auswahl von Aufträgen?

Ich versuche, Besuche in einem Geschäft vorherzusagen. Ich benötige die Fähigkeit, bewegte Feiertage, Schaltjahre und sporadische Ereignisse (im Wesentlichen Ausreißer) zu berücksichtigen. Auf dieser Grundlage stelle ich fest, dass ARIMAX meine beste Wahl ist, indem ich exogene Variablen verwende, um zu versuchen, die multiple Saisonalität sowie die oben genannten Faktoren zu modellieren.

Die Daten werden stündlich 24 Stunden aufgezeichnet. Dies erweist sich aufgrund der Anzahl der Nullen in meinen Daten als problematisch, insbesondere zu Tageszeiten, in denen nur sehr wenige Besuche stattfinden, manchmal gar keine, wenn das Geschäft gerade eröffnet wurde. Auch die Öffnungszeiten sind relativ unregelmäßig.

Außerdem ist die Rechenzeit enorm, wenn eine vollständige Zeitreihe mit mehr als 3 Jahren historischer Daten prognostiziert wird. Ich dachte mir, dass es schneller werden würde, wenn jede Stunde des Tages als separate Zeitreihe berechnet würde, und wenn ich dies zu geschäftigen Stunden des Tages teste, scheint dies eine höhere Genauigkeit zu ergeben, erweist sich jedoch erneut als Problem mit frühen / späteren Stunden, die dies nicht tun. t regelmäßig Besuche erhalten. Ich glaube, der Prozess würde von der Verwendung von auto.arima profitieren, aber es scheint nicht möglich zu sein, auf einem Modell zu konvergieren, bevor die maximale Anzahl von Iterationen erreicht ist (daher wird eine manuelle Anpassung und die Maxit-Klausel verwendet).

Ich habe versucht, mit 'fehlenden' Daten umzugehen, indem ich eine exogene Variable für Besuche = 0 erstellt habe. Auch dies funktioniert hervorragend für geschäftigere Tageszeiten, wenn keine Besuche stattfinden, wenn das Geschäft für diesen Tag geschlossen ist. In diesen Fällen scheint die exogene Variable dies erfolgreich zu handhaben, um eine Prognose für die Zukunft zu erstellen, ohne die Auswirkungen des Tages zu berücksichtigen, der zuvor geschlossen wurde. Ich bin mir jedoch nicht sicher, wie ich dieses Prinzip anwenden soll, um die ruhigeren Zeiten vorherzusagen, zu denen das Geschäft geöffnet ist, aber nicht immer Besuche erhält.

Mit Hilfe des Beitrags von Professor Hyndman über die Batch-Vorhersage in R versuche ich, eine Schleife für die Vorhersage der 24er-Serie einzurichten, aber sie scheint nicht für 13 Uhr vorherzusagen und kann nicht herausfinden, warum. Ich erhalte "Fehler in optim (init [Maske], armafn, method = optim.method, hessian = TRUE ,: nicht endlicher Finite-Differenz-Wert [1]", aber da alle Reihen gleich lang sind und ich im Wesentlichen benutze Dieselbe Matrix, ich verstehe nicht, warum dies geschieht. Dies bedeutet, dass die Matrix nicht den vollen Rang hat, nein? Wie kann ich dies bei diesem Ansatz vermeiden?

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

Ich würde mich über konstruktive Kritik an der Art und Weise, wie ich das mache, und über jede Hilfe, die dazu beiträgt, dass dieses Skript funktioniert, sehr freuen. Mir ist bekannt, dass andere Software verfügbar ist, aber ich bin streng auf die Verwendung von R und / oder SPSS hier beschränkt ...

Außerdem bin ich in diesen Foren sehr neu - ich habe versucht, eine möglichst vollständige Erklärung zu liefern, meine bisherigen Forschungen zu demonstrieren und auch ein reproduzierbares Beispiel zu liefern; Ich hoffe, dies ist ausreichend, aber bitte lassen Sie mich wissen, ob ich noch etwas zur Verbesserung meines Beitrags bereitstellen kann.

EDIT: Nick schlug vor, dass ich zuerst die täglichen Summen verwende. Ich sollte hinzufügen, dass ich dies getestet habe und die exogenen Variablen Prognosen erstellen, die die tägliche, wöchentliche und jährliche Saisonalität erfassen. Dies war einer der anderen Gründe, warum ich dachte, jede Stunde als separate Serie vorherzusagen, obwohl, wie Nick auch erwähnte, meine Vorhersage für 16 Uhr an einem bestimmten Tag nicht durch frühere Stunden am Tag beeinflusst wird.

EDIT: 09/08/13, das Problem mit der Schleife hatte einfach mit den ursprünglichen Bestellungen zu tun, die ich zum Testen verwendet hatte. Ich hätte dies früher erkennen sollen und es dringender machen müssen, auto.arima zu verwenden, um mit diesen Daten zu arbeiten - siehe Punkt a) & d) oben.

krcooke
quelle
Außerdem habe ich versucht, Fourier zu verwenden, um die Saisonalität zu gewährleisten, aber den gleichen Fehler zurückgegeben: "Fehler in optim (init [Maske], armafn, method = optim.method, hessian = TRUE ,: nicht endlicher Finite-Differenz-Wert [1]" Selbst wenn es als eigenständige Matrix ohne andere exogene Variablen verwendet wird.
Könnte
Könnten Sie die Daten erneut hochladen?
MyHeadHurts

Antworten:

4

Leider ist Ihre Mission zum Scheitern verurteilt, da Sie auf R und SPSS beschränkt sind. Sie müssen die Struktur der Lead- und Lag-Beziehung für jedes der Ereignisse / Feiertage / exogenen Variablen identifizieren, die möglicherweise ins Spiel kommen. Sie müssen mögliche Zeittrends erkennen, die SPSS nicht kann. Sie müssen tägliche Trends / Vorhersagen in jede der stündlichen Prognosen einbeziehen, um eine konsolidierte, abgestimmte Prognose bereitzustellen. Sie müssen sich mit der Änderung von Parametern und der Änderung der Varianz befassen. Hoffe das hilft. Wir modellieren diese Art von Daten seit Jahren automatisch, natürlich vorbehaltlich optionaler benutzerdefinierter Steuerelemente.

EDIT: Auf Wunsch von OP präsentiere ich hier eine typische Analyse. Ich nahm eine, wenn die geschäftigeren Stunden und entwickelte ein tägliches Modell. In einer vollständigen Analyse würden alle 24 Stunden und auch ein tägliches Modell entwickelt, um die Prognosen in Einklang zu bringen. Es folgt eine unvollständige Liste des Modells Geben Sie hier die Bildbeschreibung ein. Zusätzlich zu den signifikanten Regressoren (beachten Sie, dass die tatsächliche Lead- und Lag-Struktur weggelassen wurde) gab es Indikatoren, die die Saisonalität, Pegelverschiebungen, täglichen Auswirkungen, Änderungen der täglichen Auswirkungen und ungewöhnliche Werte widerspiegeln, die nicht mit der Vorgeschichte übereinstimmen. Die Modellstatistiken sind Geben Sie hier die Bildbeschreibung ein. Eine Darstellung der Prognosen für die nächsten 360 Tage ist hier dargestellt Geben Sie hier die Bildbeschreibung ein. Das Diagramm Ist / Anpassung / Prognose fasst die Ergebnisse übersichtlich zusammenGeben Sie hier die Bildbeschreibung einWenn man mit einem enorm komplexen Problem konfrontiert ist (wie dieses!), Muss man mit viel Mut, Erfahrung und Computerproduktivitätshilfen auftauchen. Teilen Sie Ihrem Management einfach mit, dass das Problem lösbar ist, jedoch nicht unbedingt mithilfe primitiver Tools. Ich hoffe, dies ermutigt Sie, Ihre Bemühungen fortzusetzen, da Ihre vorherigen Kommentare sehr professionell waren und auf persönliche Bereicherung und Lernen ausgerichtet waren. Ich würde hinzufügen, dass man den erwarteten Wert dieser Analyse kennen und diesen als Richtlinie verwenden muss, wenn man zusätzliche Software in Betracht zieht. Vielleicht brauchen Sie eine lautere Stimme, um Ihre "Direktoren" auf eine praktikable Lösung für diese herausfordernde Aufgabe hinzuweisen.

Nachdem ich die täglichen Gesamtzahlen und jedes der 24-Stunden-Modelle überprüft habe, würde ich definitiv widerspiegeln, dass die Anzahl der Besuche in einem ernsthaften Rückgang liegt! Diese Art der Analyse durch einen potenziellen Käufer würde einen Nichtkauf nahe legen, während ein Verkäufer klug wäre, seine Bemühungen um den Verkauf des Geschäfts auf der Grundlage dieser sehr negativen Prognose zu verdoppeln.

IrishStat
quelle
Hallo Dave, vielen Dank, dass du dir die Zeit genommen hast, meine Frage zu lesen und zu antworten. Ich verstehe, dass Ihre Software über alle Alternativen hinausgeht, aber für mich vorerst leider keine Option ist. Wenn Sie die Fähigkeiten von R kennen, können Sie mir einen Rat geben, um das zu verbessern, was ich bereits getan habe?
Herzliche
@krcooke Sie können die Kreuzkorrelation zwischen Besuchen und alternativen Hinweisen / Verzögerungen um jeden Ihrer Regressoren untersuchen, um die entsprechende Antwort zu ermitteln. Ich stimme Nick voll und ganz zu, dass einige Regressoren für einige Stunden nützlich sein könnten, für andere jedoch nicht. Sie können jede Stunde separat modellieren. Das Erkennen der 4 Arten von Ausreißern (Puls, Pegelverschiebung, saisonaler Puls und Zeittrends) ist in SAS nicht verfügbar, wenn Sie Ursachen haben und in SPSS wahrscheinlich nicht verfügbar sind. Ich habe Ihre Daten heruntergeladen und verwende AUTOBOX Wir sind immer auf der Suche nach "harten Daten" wie Ihren, um unsere Analysen zu verbessern.
IrishStat
Hallo Dave, ich werde sehen, was ich im Zusammenhang mit der Analyse der Regressoren tun kann. Ich hatte das Gefühl, dass die von mir verwendeten Regressoren sehr "Standard" waren und wahrscheinlich alle diese Geschäfte betreffen würden. Ich habe das Jubiläums-Feiertagswochenende als Beispiel in Nicks Kommentar verwendet. Dies würde höchstwahrscheinlich von der Verwendung von Regressoren profitieren, aber ich habe dies vorerst nicht aufgenommen. Und ich bin sehr gespannt, was Sie mit den Daten machen können! Danke noch einmal.
Krcooke
7
" Leider ist Ihre Mission zum Scheitern verurteilt, da Sie auf R und SPSS beschränkt sind. " - Dieser Kommentar geht leider zu weit; Jede Turing-vollständige Sprache kann jeden Algorithmus implementieren, der in einer anderen geschrieben ist, auch wenn er nur durch Umlegen von Schaltern im Maschinencode programmierbar ist und vollständig in Lego implementiert ist. Es gibt keine Berechnung, die in einer implementiert werden kann, die in einer anderen nicht durchgeführt werden kann. Wenn Sie keine magischen Eigenschaften für AUTOBOX beanspruchen, glaube ich, was Sie wahrscheinlich damit meinen, etwas wie "bereits als Funktionen in der Vanille-Distribution verfügbar" als Unterschied zu sagen.
Glen_b -Reinstate Monica
@Glen_b Was ich vielleicht gesagt habe, ist, dass die Feuerkraft in den Vanilleverteilungen, die Sie verwenden, nicht ausreicht, um das vorliegende Problem zu lösen, es sei denn, Sie haben viel Zeit, um neue Prozeduren zu schreiben.
IrishStat
10

Dies ist nicht mehr als ein Bündel von Kommentaren, aber es wird zu lang für dieses Format sein. Ich bin nicht mehr als ein Zeitreihen-Amateur, aber ich habe einige einfache Vorschläge.

  1. Möglicherweise haben Sie hier Aufträge, aber ich denke, dies muss etwas verbessert werden, was Sie erwarten und was für Sie am wichtigsten ist. Die Vorhersage von Besuchen ist leider ein unscharfes Ziel. Angenommen, es ist 16 Uhr, und Sie möchten Besuche eine Stunde im Voraus prognostizieren. Benötigen Sie wirklich ein Supermodel, das eine Behandlung der gesamten vorherigen Serie enthält? Dies muss aus einer Betrachtung der tatsächlichen praktischen und / oder wissenschaftlichen Ziele resultieren, die von Ihren Vorgesetzten oder einem Kunden festgelegt werden können oder die möglicherweise Ihre eigenen als Forscher sind. Ich vermute, es ist wahrscheinlicher, dass unterschiedliche Modelle für unterschiedliche Zwecke benötigt werden.

  2. Das Trennen von Stundenreihen scheint von der Idee getrieben zu sein, die Berechnung zu reduzieren, ohne sehr viel darüber nachzudenken, wie viel Sinn es macht. Die Implikation ist also, dass Sie Informationen von heute nicht (nicht) verwenden, um vorherzusagen, was um 16 Uhr passiert, sondern nur alle vorherigen Beobachtungen um 16 Uhr? Es scheint mir, dass viel durchgesprochen werden muss.

  3. Sie sind offensichtlich ein Lernender in Zeitreihen (und ich stelle mich auf eine Stufe), aber kein Lernender sollte mit einem so großen Problem beginnen. Ja wirklich! Sie haben viele Daten, Sie haben Periodizitäten auf mehreren Skalen, Sie haben Unregelmäßigkeiten bei Öffnungszeiten und Feiertagen, Sie haben exogene Variablen: Sie haben ein sehr schwieriges Problem ausgewählt. (Was ist auch mit Trends?) Es ist leicht zu sagen, aber es ist offensichtlich bisher vorbei: Sie müssen möglicherweise zuerst an sehr vereinfachten Versionen des Problems arbeiten und ein Gefühl dafür bekommen, wie einfachere Modelle angepasst werden können. Es funktioniert offensichtlich nicht gut, alles in ein großes, kompliziertes Modell zu integrieren, und es scheint etwas radikal Einfacheres erforderlich zu sein oder die Erkenntnis, dass das Projekt möglicherweise zu ehrgeizig ist.

Nick Cox
quelle
Hallo Nick, 1- In der Tat bin ich unter Befehl! Ziel ist es, zu versuchen, ein Modell so zu erstellen, dass es nicht wesentlich überprognostiziert (was zu verschwendeten Arbeitsstunden führt) oder unterprognostiziert wird (damit die Mitarbeiter nicht überfordert werden). 2- Ich hatte darüber nachgedacht, werde aber tiefer graben, um zu verstehen, was ich auf diese Weise gewinne / verliere. Prognosen als eine Serie schienen, wie Sie es ausdrückten, einem „Supermodel“ zu ähneln. 3- Ich bin mir bewusst, dass dies extrem schwierig ist und dass ich im Moment über meinem Gewicht stehe, bin aber völlig offen für eine einfachere Lösung, die auch hier für mich funktionieren wird. Vielen Dank für deine Gedanken, Nick.
Krcooke
In Bezug auf einfachere Lösungen konnte ich exponentielle Glättungstechniken nicht so anwenden, dass das Jubiläumswochenende im letzten Jahr dazu führt, dass dieses Jahr (derselbe Zeitraum) überprognostiziert wird. Aufgrund der Art der beteiligten Ausreißer hatte ich das Gefühl, unbedingt exogene Variablen verwenden zu müssen. Hast du noch andere Ideen, die ich erforschen könnte?
krcooke
Ich kann nur sagen, was ich tun würde, wenn ich befohlen wäre und genau die Informationen hätte, die Sie hier geben. Mein Instinkt wäre es, zuerst die täglichen Summen zu aggregieren und mit diesen zu arbeiten. Das ist schwer genug. Es ist viel einfacher, hier kritisch zu sein ...
Nick Cox
Hallo Nick, meine Schuld, ich hätte schon sagen sollen, dass ich das versucht habe. Mit täglichen Summen erschienen die Ergebnisse vernünftig. Vernünftig ist das Schlüsselwort, denn wie Sie und Dave bereits festgestellt haben, gibt es hier weit mehr zu beachten. Wenn es von Interesse ist, kann ich die täglichen Daten erneut ausführen und zeigen, dass sie die wöchentliche, monatliche und jährliche Saisonalität erfassen. Deshalb habe ich mir damals überlegt, jede Stunde als tägliche Serie vorherzusagen.
Krcooke
Eines der Probleme, die ich hatte, wie im ersten Beitrag erwähnt, ist, dass auto.arima vor der Konvergenz maximale Iterationen erreicht, weshalb ich mit Arima () ziemlich verallgemeinerte Parameter verwende. Jede Anleitung, wie ich dies überwinden kann, wäre sehr dankbar!
Krcooke