Am wenigsten dumm, eine kurze multivariate Zeitreihe vorherzusagen

16

Ich muss die folgenden 4 Variablen für die 29. Zeiteinheit prognostizieren. Ich habe historische Daten im Wert von ungefähr 2 Jahren, wobei 1 und 14 und 27 alle den gleichen Zeitraum (oder die gleiche Jahreszeit) darstellen. Am Ende mache ich eine Oaxaca-Blinder-Zerlegung von , w d , w c und p .Wwdwcp

time    W               wd              wc               p
1       4.920725        4.684342        4.065288        .5962985
2       4.956172        4.73998         4.092179        .6151785
3       4.85532         4.725982        4.002519        .6028712
4       4.754887        4.674568        3.988028        .5943888
5       4.862039        4.758899        4.045568        .5925704
6       5.039032        4.791101        4.071131        .590314
7       4.612594        4.656253        4.136271        .529247
8       4.722339        4.631588        3.994956        .5801989
9       4.679251        4.647347        3.954906        .5832723
10      4.736177        4.679152        3.974465        .5843731
11      4.738954        4.759482        4.037036        .5868722
12      4.571325        4.707446        4.110281        .556147
13      4.883891        4.750031        4.168203        .602057
14      4.652408        4.703114        4.042872        .6059471
15      4.677363        4.744875        4.232081        .5672519
16      4.695732        4.614248        3.998735        .5838578
17      4.633575        4.6025          3.943488        .5914644
18      4.61025         4.67733         4.066427        .548952
19      4.678374        4.741046        4.060458        .5416393
20      4.48309         4.609238        4.000201        .5372143
21      4.477549        4.583907        3.94821         .5515663
22      4.555191        4.627404        3.93675         .5542806
23      4.508585        4.595927        3.881685        .5572687
24      4.467037        4.619762        3.909551        .5645944
25      4.326283        4.544351        3.877583        .5738906
26      4.672741        4.599463        3.953772        .5769604
27      4.53551         4.506167        3.808779        .5831352
28      4.528004        4.622972        3.90481         .5968299

Ich glaube, dass durch p w d + ( 1 - p ) w c plus Messfehler approximiert werden kann, aber Sie können sehen, dass W diese Menge aufgrund von Verschwendung, Approximationsfehler oder Diebstahl immer erheblich überschreitet.Wpwd+(1-p)wcW

Hier sind meine 2 Fragen.

  1. Mein erster Gedanke war, eine Vektorautoregression für diese Variablen mit einer Verzögerung von 1 und einer exogenen Zeit- und Periodenvariablen zu versuchen, aber das scheint angesichts der geringen Datenmenge eine schlechte Idee zu sein. Gibt es Zeitreihenmethoden, die (1) angesichts der "Mikro-Numerosität" eine bessere Leistung erbringen und (2) die Verbindung zwischen den Variablen ausnutzen können?

  2. Andererseits sind die Moduli der Eigenwerte für die VAR alle kleiner als 1, so dass ich mir keine Sorgen über die Nichtstationarität machen muss (obwohl der Dickey-Fuller-Test etwas anderes vorschlägt). Die Vorhersagen scheinen größtenteils mit Projektionen eines flexiblen univariaten Modells mit einem Zeittrend übereinzustimmen, mit Ausnahme von und p , die niedriger sind. Die Koeffizienten auf den Verzögerungen scheinen größtenteils vernünftig zu sein, obwohl sie größtenteils unbedeutend sind. Der lineare Trendkoeffizient ist ebenso signifikant wie einige der Periodendummys. Gibt es dennoch theoretische Gründe, diesen einfacheren Ansatz dem VAR-Modell vorzuziehen?Wp

Vollständige Offenlegung: Ich habe eine ähnliche Frage zu Statalist ohne Antwort gestellt.

Dimitriy V. Masterov
quelle
Hallo zusammen, könnten Sie etwas mehr Kontext zu der gewünschten Zerlegung angeben, da ich nicht gesehen habe, dass sie auf Zeitreihendaten angewendet wird?
Michelle
W-W=p(wD-wD)+(1-p)(wC-wC)+(wD-wC)(p-p)+(ϵ-ϵ), wobei Primzahlen den aktuellen Wert der Variablen bezeichnen.
Dimitriy V. Masterov
hmmm, wie wäre es, zuerst die Ausreißer auszuschließen, bevor die Regression einsetzt?
Athos
Welche Präzision benötigen Sie? Ich frage, weil Sie, wie Sie wissen, ARIMA-Modelle verwenden und eine sehr niedrige MSE erhalten können. Da diese Modelle jedoch in der Regel mit maximaler Wahrscheinlichkeit passen, ist es fast sicher, dass Sie überanpassen werden. Bayes'sche Modelle sind robust im Umgang mit kleinen Daten, aber ich denke, Sie werden eine MSE erhalten, die eine Größenordnung höher ist als bei ARIMA-Modellen.
Robert Smith

Antworten:

2

Ich verstehe, dass diese Frage schon seit Jahren hier steht, aber dennoch können die folgenden Ideen nützlich sein:

  1. Wenn es Verknüpfungen zwischen Variablen gibt (und die theoretische Formel nicht so gut funktioniert), kann PCA verwendet werden, um systematisch nach (linearen) Abhängigkeiten zu suchen. Ich werde zeigen, dass dies für die angegebenen Daten in dieser Frage gut funktioniert.

  2. Da nicht viele Daten vorliegen (insgesamt 112 Zahlen), können nur einige Modellparameter geschätzt werden ( z. B. ist das Anpassen vollständiger saisonaler Effekte keine Option), und es kann sinnvoll sein, ein benutzerdefiniertes Modell zu verwenden.

Nach diesen Grundsätzen würde ich eine Prognose erstellen:

Schritt 1. Wir können PCA verwenden, um Abhängigkeiten in den Daten aufzudecken. Mit R, mit den Daten gespeichert in x:

> library(jvcoords)
> m <- PCA(x)
> m
PCA: mapping p = 4 coordinates to q = 4 coordinates

                              PC1         PC2          PC3          PC4
standard deviation     0.18609759 0.079351671 0.0305622047 0.0155353709
variance               0.03463231 0.006296688 0.0009340484 0.0002413477
cum. variance fraction 0.82253436 0.972083769 0.9942678731 1.0000000000

W=0,234wd-1,152wc-8,842p

4×4

Schritt 2. In PC1 ist ein klarer Trend zu erkennen:

> t <- 1:28
> plot(m$y[,1], type = "b", ylab = "PC1")
> trend <- lm(m$y[,1] ~ t)
> abline(trend)

Trend von PC1

Ich erstelle eine Kopie der PC-Partituren, wobei dieser Trend entfernt wurde:

> y2 <- m$y
> y2[,1] <- y2[,1] - fitted(trend)

Die Darstellung der Scores der anderen PCs zeigt keine eindeutigen Trends, daher lasse ich diese unverändert.

Da die PC-Scores zentriert sind, verläuft der Trend durch den Massenschwerpunkt der PC1-Stichprobe und die Anpassung des Trends entspricht nur der Schätzung eines Parameters.

Schritt 3. Ein Paar-Streudiagramm zeigt keine klare Struktur, daher modelliere ich die PCs als unabhängig:

> pairs(y2, asp = 1, oma = c(1.7, 1.7, 1.7, 1.7))

Paarstreudiagramm von PCs nach Entfernen des Trends

Schritt 4. PC1 weist eine eindeutige Periodizität mit einer Verzögerung von 13 auf (wie in der Frage vorgeschlagen). Dies kann auf verschiedene Arten gesehen werden. Beispielsweise zeigt sich, dass die Autokorrelation von Lag 13 in einem Korrelogramm signifikant von 0 abweicht:

> acf(y2[,1])

ACF von PC1 nach Entfernen der Drift

(Die Periodizität ist optisch auffälliger, wenn die Daten zusammen mit einer verschobenen Kopie geplottet werden.)

Da wir die Anzahl der geschätzten Parameter niedrig halten wollen und das Korrelogramm die Verzögerung 13 als einzige Verzögerung mit einem signifikanten Beitrag anzeigt, werde ich PC1 als modellierenyt+13(1)=α13yt(1)+σεt+13εtα13σlm()

> lag13 <- lm(y2[14:28,1] ~ y2[1:15,1] + 0)
> lag13

Call:
lm(formula = y2[14:28, 1] ~ y2[1:15, 1] + 0)

Coefficients:
y2[1:15, 1]  
     0.6479  

> a13 <- coef(lag13)
> s13 <- summary(lag13)$sigma

Als Plausibilitätsprüfung zeichne ich die angegebenen Daten (schwarz) zusammen mit einer zufälligen Flugbahn meines Modells für PC1 (blau) auf, die ein Jahr in die Zukunft reicht:

t.f <- 29:41
pc1 <- m$y[,1]
pc1.f <- (predict(trend, newdata = data.frame(t = t.f))
          + a13 * y2[16:28, 1]
          + rnorm(13, sd = s13))
plot(t, pc1, xlim = range(t, t.f), ylim = range(pc1, pc1.f),
     type = "b", ylab = "PC1")
points(t.f, pc1.f, col = "blue", type = "b")

eine simulierte Flugbahn für PC1

Der blaue, simulierte Pfad sieht aus wie eine sinnvolle Fortsetzung der Daten. Die Korrelogramme für PC2 und PC3 zeigen keine signifikanten Korrelationen, daher modelliere ich diese Komponenten als weißes Rauschen. PC4 zeigt zwar Korrelationen, trägt aber so wenig zur Gesamtvarianz bei, dass es sich nicht zu modellieren lohnt, und ich modelliere diese Komponente auch als weißes Rauschen.

Hier haben wir zwei weitere Parameter angepasst. Dies bringt uns zu insgesamt neun Parametern im Modell (einschließlich der PCA), was nicht absurd erscheint, als wir mit Daten aus 112 Zahlen angefangen haben.

Prognose. Wir können eine numerische Vorhersage erhalten, indem wir das Rauschen weglassen (um den Mittelwert zu erhalten) und die PCA umkehren:

> pc1.f <- predict(trend, newdata = data.frame(t = t.f)) + a13 * y2[16:28, 1]
> y.f <- data.frame(PC1 = pc1.f, PC2 = 0, PC3 = 0, PC4 = 0)
> x.f <- fromCoords(m, y.f)
> rownames(x.f) <- t.f
> x.f
          W       wd       wc         p
29 4.456825 4.582231 3.919151 0.5616497
30 4.407551 4.563510 3.899012 0.5582053
31 4.427701 4.571166 3.907248 0.5596139
32 4.466062 4.585740 3.922927 0.5622955
33 4.327391 4.533055 3.866250 0.5526018
34 4.304330 4.524294 3.856824 0.5509898
35 4.342835 4.538923 3.872562 0.5536814
36 4.297404 4.521663 3.853993 0.5505056
37 4.281638 4.515673 3.847549 0.5494035
38 4.186515 4.479533 3.808671 0.5427540
39 4.377147 4.551959 3.886586 0.5560799
40 4.257569 4.506528 3.837712 0.5477210
41 4.289875 4.518802 3.850916 0.5499793

Unsicherheitsbänder können entweder analytisch oder einfach unter Verwendung von Monte Carlo erhalten werden:

N <- 1000 # number of Monte Carlo samples
W.f <- matrix(NA, N, 13)
for (i in 1:N) {
    y.f <- data.frame(PC1 = (predict(trend, newdata = data.frame(t = t.f))
              + a13 * y2[16:28, 1]
              + rnorm(13, sd = s13)),
              PC2 = rnorm(13, sd = sd(y2[,2])),
              PC3 = rnorm(13, sd = sd(y2[, 3])),
              PC4 = rnorm(13, sd = sd(y2[, 4])))
    x.f <- fromCoords(m, y.f)
    W.f[i,] <- x.f[, 1]
}
bands <- apply(W.f, 2,
               function(x) quantile(x, c(0.025, 0.15, 0.5, 0.85, 0.975)))
plot(t, x$W, xlim = range(t, t.f), ylim = range(x$W, bands),
     type = "b", ylab = "W")
for (b in 1:5) {
    lines(c(28, t.f), c(x$W[28], bands[b,]), col = "grey")
}

Unsicherheitsbänder für die Prognose

Das Diagramm zeigt die tatsächlichen Daten für W

jochen
quelle
1
Interessanter Ansatz. Lass mich das ein bisschen verdauen.
Dimitriy V. Masterov