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.