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.
Antworten:
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 . 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 . Eine Darstellung der Prognosen für die nächsten 360 Tage ist hier dargestellt . Das Diagramm Ist / Anpassung / Prognose fasst die Ergebnisse übersichtlich zusammenWenn 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.
quelle
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.
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.
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.
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.
quelle