Auto.arima mit täglichen Daten: Wie erfasst man die Saisonalität / Periodizität?

21

Ich rüste eine tägliche Zeitreihe mit einem ARIMA-Modell aus. Die Daten werden täglich vom 01.02.2010 bis zum 30.07.2011 erhoben und beziehen sich auf den Zeitungsverkauf. Da ein wöchentliches Verkaufsmuster festgestellt werden kann (die tägliche durchschnittliche Anzahl der verkauften Exemplare ist normalerweise von Montag bis Freitag gleich und steigt dann am Samstag und Sonntag an), versuche ich, diese "Saisonalität" zu erfassen. Ausgehend von den Verkaufsdaten "Daten" erstelle ich die Zeitreihen wie folgt:

salests<-ts(data,start=c(2010,1),frequency=365)

und dann benutze ich die Funktion auto.arima (.), um das beste ARIMA-Modell über das AIC-Kriterium auszuwählen. Das Ergebnis ist immer ein nicht-saisonales ARIMA-Modell, aber wenn ich ein SARIMAs-Modell mit der folgenden Syntax als Beispiel versuche:

sarima1<-arima(salests, order = c(2,1,2), seasonal = list(order = c(1, 0, 1), period = 7))

Ich kann bessere Ergebnisse erzielen. Gibt es irgendetwas falsches in der ts command / arima Spezifikation? Das Wochenmuster ist sehr stark, daher würde ich nicht mit so vielen Schwierigkeiten bei der Erfassung rechnen. Jede Hilfe wäre sehr nützlich. Vielen Dank, Giulia Deppieri

Aktualisieren:

Ich habe bereits einige Argumente geändert. Genauer gesagt wählt die Prozedur ARIMA (4,1,3) als bestes Modell, wenn ich es einstelle D=7, aber AIC und die anderen guten Anpassungsindizes und Prognosen verbessern sich überhaupt nicht. Ich vermute, es gibt einige Fehler aufgrund von Verwechslungen zwischen Saisonalität und Periodizität.?!

Auto.arima-Aufruf verwendet und Ausgabe erhalten:

modArima<-auto.arima(salests,D=7,max.P = 5, max.Q = 5)



 ARIMA(2,1,2) with drift         : 1e+20
 ARIMA(0,1,0) with drift         : 5265.543
 ARIMA(1,1,0) with drift         : 5182.772
 ARIMA(0,1,1) with drift         : 1e+20
 ARIMA(2,1,0) with drift         : 5137.279
 ARIMA(2,1,1) with drift         : 1e+20
 ARIMA(3,1,1) with drift         : 1e+20
 ARIMA(2,1,0)                    : 5135.382
 ARIMA(1,1,0)                    : 5180.817
 ARIMA(3,1,0)                    : 5117.714
 ARIMA(3,1,1)                    : 1e+20
 ARIMA(4,1,1)                    : 5045.236
 ARIMA(4,1,1) with drift         : 5040.53
 ARIMA(5,1,1) with drift         : 1e+20
 ARIMA(4,1,0) with drift         : 5112.614
 ARIMA(4,1,2) with drift         : 4953.417
 ARIMA(5,1,3) with drift         : 1e+20
 ARIMA(4,1,2)                    : 4960.516
 ARIMA(3,1,2) with drift         : 1e+20
 ARIMA(5,1,2) with drift         : 1e+20
 ARIMA(4,1,3) with drift         : 4868.669
 ARIMA(5,1,4) with drift         : 1e+20
 ARIMA(4,1,3)                    : 4870.92
 ARIMA(3,1,3) with drift         : 1e+20
 ARIMA(4,1,4) with drift         : 4874.095

 Best model: ARIMA(4,1,3) with drift        

Daher gehe ich davon aus, dass die Arima-Funktion verwendet werden sollte als:

bestOrder <- cbind(modArima$arma[1],modArima$arma[5],modArima$arma[2])
sarima1<-arima(salests, order = c(4,1,3))

ohne saisonale Komponentenparameter und Periodenspezifikationen. Daten und explorative Analysen zeigen, dass mit Ausnahme von August 2010 (wenn eine konstante Umsatzsteigerung zu verzeichnen ist) ungefähr dasselbe Wochenmuster für jede Woche berücksichtigt werden kann. Leider habe ich überhaupt keine Expertise in der Modellierung von Zeitreihen. Tatsächlich versuche ich diesen Ansatz, um eine alternative Lösung für andere parametrische und nicht parametrische Modelle zu finden, die ich versucht habe, für diese problematischen Daten zu passen. Ich habe auch viele abhängige numerische Variablen, aber sie haben bei der Erklärung der Antwortvariablen eine geringe Aussagekraft gezeigt: Zweifellos ist die Zeitkomponente der schwierigste Teil, den man modellieren kann. Darüber hinaus erwies sich die Konstruktion von Dummy-Variablen zur Darstellung von Monaten und Wochentagen als keine robuste Lösung.

Giulia
quelle

Antworten:

27

Bei wöchentlicher Saisonalität stellen Sie die Saisonperiode auf 7 ein.

salests <- ts(data,start=2010,frequency=7) 
modArima <- auto.arima(salests)

Beachten Sie, dass die Auswahl an saisonalen Unterschieden auto.arima()bis vor kurzem nicht sehr gut war. Wenn Sie v2.xx des forecastPakets verwenden, legen Sie D=1im Aufruf fest, dass auto.arima()saisonale Unterschiede erzwungen werden sollen . Wenn Sie v3.xx des forecastPakets verwenden, Dfunktioniert die automatische Auswahl viel besser (mithilfe eines OCSB-Tests anstelle eines CH-Tests).

Versuchen Sie nicht, den AIC für Modelle mit unterschiedlichem Differenzierungsgrad zu vergleichen. Sie sind nicht direkt vergleichbar. Sie können den AIC nur mit Modellen mit der gleichen Differenzierungsreihenfolge zuverlässig vergleichen.

Sie müssen das Modell nach dem Anruf nicht erneut anpassen auto.arima(). Es wird ein Arima-Objekt zurückgegeben, so als ob Sie arima()mit der ausgewählten Modellreihenfolge aufgerufen hätten .

Rob Hyndman
quelle
danke, dass du auf meinen blöden Fehler hingewiesen hast. Ich werde meine Antwort zurückziehen.
mpiktas
1
Vielen Dank für Ihre hilfreichen Vorschläge. Ich verwende die 2.19-Version des Vorhersagepakets, folge also Ihrem Rat und setze den D-Parameter im auto.arima () -Aufruf auf 1. Jetzt ist das beste Modell, das für die Salestserie ausgewählt wurde, ein ARIMA (1,0,0) mit einem Mittelwert ungleich Null. Soll ich die Angabe des Saisonalitätsteils für das beste zurückgegebene Modell erwarten, meine ich Werte für P, D, Q oder zumindest für D?
Giulia
2
Solange Ihre Daten eine andere Frequenz als 1 haben, werden saisonale ARIMA-Modelle berücksichtigt. Wenn ein nicht-saisonales Modell zurückgegeben wird, ist entweder die Saisonalität sehr schwach oder die Daten befinden sich nicht in einem Objekt mit einer Häufigkeit> 1.
Rob Hyndman
14

Das Problem bei der Anpassung der saisonalen ARIMA an die täglichen Daten besteht darin, dass die "saisonale Komponente" möglicherweise nur am Wochenende oder nur an Wochentagen ausgeführt wird, sodass insgesamt eine nicht signifikante "saisonale Komponente" vorhanden ist. Nun müssen Sie Ihren Datensatz mit 6 Dummys erweitern, die die Wochentage darstellen, und möglicherweise mit monatlichen Indikatoren, um die jährlichen Auswirkungen darzustellen. Berücksichtigen Sie nun Ereignisse wie z. B. Feiertage und schließen Sie alle Lead-, Contemoraneous- oder Lag-Effekte für diese bekannten Variablen ein. Nein, die Daten enthalten möglicherweise ungewöhnliche Werte (Impulse), Pegelverschiebungen oder lokale Zeittrends. Darüber hinaus können sich die Wochentag-Effekte im Laufe der Zeit geändert haben, z. B. gab es in den ersten 20 Wochen keinen Samstags-Effekt, in den letzten 50 Wochen jedoch einen Samstags-Effekt.

IrishStat
quelle
In diesem Fall (IrishStat) wäre das nicht Mixed Modeling Technique anstelle von ARIMA. Verzögerungen werden in ARIMA nur bei Box Jlung-Tests berücksichtigt. Auto.arima (kürzlich) behebt alles, einschließlich Skalierung von Daten, Saisonalitätsschwankungen (deshalb finde ich die besten p, d, q-Parameter).
Wackyanil
Es wird als Übertragungsfunktion bezeichnet und spiegelt einen synergistischen Ansatz wider (siehe autobox.com/pdfs/capable.pd, beginnend mit Folie 42). Auto.arima mag in einfachen Fällen funktionieren, ist aber meiner Meinung nach nicht allgemein genug. Wenn Sie einen Datensatz im Auge haben, stellen Sie eine neue Frage und fügen Sie sie ein.
IrishStat 18.11.15
@IrishStat meintest du ARIMA mit Intervention? Wochentag als Dummy-Variable? und ähnliche Dummy-Variablen für Feiertage?
Enthusiast
Ja, das wäre mein Ansatz für die täglichen Daten
IrishStat
0

Um die Reihenfolge der Saisonalität in meinen ts (tägliche Daten über 3 Jahre) zu bestimmen, habe ich diesen Code in Matlab verwendet:

s = 0; min = 1e + 07; n = Länge (x); für i = 1: 400 diff = x (i + 1: n) -x (1: ni); s (i) = Summe (abs (diff)); wenn (s (i)

Es gibt mir 365, was logisch ist.

nkabouche
quelle
1
Willkommen auf der Seite. Es ist mir nicht klar, wie dies die ursprüngliche Frage beantwortet, und es ist mir nicht klar, was der von Ihnen gepostete Code bewirkt, wenn ich ihn mir nur ansehe. Vielleicht könnten Sie die Antwort etwas erweitern?
Einar
1
Wie geht Ihre Lösung mit festen Auswirkungen auf den Wochentag, den Monatstag, die Monatswoche, den Monatstag sowie den Vor- und Nachlaufeffekten von Feiertagen um? , montag nach freitag, freitag vor montag, monatliche effekte, wocheneffekte, änderungen der wochentagseffekte im zeitverlauf, impulse, pegel- / schrittverschiebungen?
IrishStat
der Matlab-Code s = 0; min = 1e + 07; n = Länge (x); für i = 1: 400 diff = x (i + 1: n) -x (1: ni); s (i) = Summe (abs (diff)); if (s (i) <min) min = s (i); i end end
nkabouche