La façon la moins stupide de prévoir une courte série temporelle multivariée

16

J'ai besoin de prévoir les 4 variables suivantes pour la 29e unité de temps. J'ai environ 2 ans de données historiques, où 1 et 14 et 27 sont tous la même période (ou période de l'année). Au final, je fais une décomposition de style Oaxaca-Blinder sur , w d , w c et p .Wwwcp

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

Je crois que peut être approximé par p w d + ( 1 - p ) w c plus erreur de mesure, mais vous pouvez voir que W dépasse toujours considérablement cette quantité en raison de déchets, d'erreur d'approximation ou de vol.Wpw+(1-p)wcW

Voici mes 2 questions.

  1. Ma première pensée a été d'essayer une autorégression vectorielle sur ces variables avec 1 décalage et une variable de temps et de période exogène, mais cela semble être une mauvaise idée étant donné le peu de données dont je dispose. Existe-t-il des méthodes de séries chronologiques qui (1) fonctionnent mieux face à la «micro-numérosité» et (2) pourraient exploiter le lien entre les variables?

  2. D'un autre côté, les modules des valeurs propres pour le VAR sont tous inférieurs à 1, donc je ne pense pas avoir à me soucier de la non-stationnarité (bien que le test de Dickey-Fuller suggère le contraire). Les prévisions semblent pour la plupart conformes aux projections d'un modèle univarié flexible avec une tendance temporelle, à l'exception de etW , qui sont plus faibles. Les coefficients sur les décalages semblent pour la plupart raisonnables, bien qu'ils soient pour la plupart insignifiants. Le coefficient de tendance linéaire est significatif, de même que certains des mannequins de la période. Y a-t-il encore des raisons théoriques de préférer cette approche plus simple au modèle VAR?p

Divulgation complète: j'ai posé une question similaire sur Statalist sans réponse.

Dimitriy V. Masterov
la source
Bonjour, pourriez-vous donner un peu plus de contexte sur la décomposition que vous souhaitez faire, car je ne l'ai pas vue appliquée aux données de séries chronologiques?
Michelle
Je décompose le changement en composants de la manière suivante: W-W=p(w-w)+(1-p)(wC-wC)+(w-wC)(p-p)+(ϵ-ϵ), où les nombres premiers désignent la valeur actuelle des variables.
Dimitriy V. Masterov
hmmm, que diriez-vous d'exclure les valeurs aberrantes d'abord, avant la régression?
athos
De quel niveau de précision avez-vous besoin? Je demande parce que comme vous le savez, vous pouvez utiliser des modèles ARIMA et obtenir un MSE très bas. Cependant, étant donné que ces modèles sont généralement ajustés en utilisant le maximum de vraisemblance, il est presque certain que vous vous équiperez. Les modèles bayésiens sont robustes lorsqu'ils traitent avec peu de données, mais je pense que vous obtiendrez un MSE d'un ordre de grandeur supérieur à celui des modèles ARIMA.
Robert Smith

Réponses:

2

Je comprends que cette question est posée ici depuis des années, mais les idées suivantes peuvent néanmoins être utiles:

  1. S'il existe des liens entre les variables (et que la formule théorique ne fonctionne pas aussi bien), l'ACP peut être utilisée pour rechercher des dépendances (linéaires) de manière systématique. Je montrerai que cela fonctionne bien pour les données fournies dans cette question.

  2. Étant donné qu'il n'y a pas beaucoup de données (112 chiffres au total), seuls quelques paramètres du modèle peuvent être estimés ( par exemple, l' ajustement des effets saisonniers complets n'est pas une option), et essayer un modèle personnalisé peut être logique.

Voici comment je ferais une prévision, en suivant ces principes:

Étape 1. Nous pouvons utiliser PCA pour révéler les dépendances dans les données. Utilisation de R, avec les données stockées dans 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,234w-1.152wc-8.842p.)

Faire de l’APC consistait à trouver un 4×4matrice orthogonale. L'espace de ces matrices est à 6 dimensions, nous avons donc estimé 6 paramètres. (Puisque nous n'utilisons vraiment que PC1 ci-dessous, cela peut être moins de paramètres "efficaces".)

Étape 2. Il y a une tendance claire dans PC1:

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

tendance de PC1

Je crée une copie des partitions PC avec cette tendance supprimée:

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

Le traçage des scores des autres PC ne révèle aucune tendance claire, je les laisse donc inchangés.

Les scores PC étant centrés, la tendance passe par le centre de masse de l'échantillon PC1 et l'ajustement de la tendance ne correspond qu'à l'estimation d'un paramètre.

Étape 3. Un diagramme de dispersion de paire ne montre aucune structure claire, donc je modélise les PC comme étant indépendants:

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

paire de nuages ​​de points de PC après avoir supprimé la tendance

Étape 4. Il y a une périodicité claire dans PC1, avec un décalage 13 (comme suggéré par la question). Cela peut être vu de différentes manières. Par exemple, l'autocorrélation du décalage 13 apparaît comme étant significativement différente de 0 dans un corrélogramme:

> acf(y2[,1])

ACF de PC1 après avoir retiré la dérive

(La périodicité est visuellement plus frappante lors du traçage des données avec une copie décalée.)

Étant donné que nous voulons maintenir le nombre de paramètres estimés faible et que le corrélogramme montre le décalage 13 comme le seul décalage avec une contribution significative, je modéliserai PC1 comme yt+13(1)=α13yt(1)+σεt+13, où le εtsont indépendants et standard normalement distribués (c'est-à-dire qu'il s'agit d'un processus AR (13) avec la plupart des coefficients fixés à 0). Un moyen simple d'estimerα13 et σutilise la lm()fonction:

> 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

Comme test de plausibilité, je trace les données fournies (noir), ainsi qu'une trajectoire aléatoire de mon modèle pour PC1 (bleu), s'étalant sur un an:

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

une trajectoire simulée pour PC1

Le morceau de chemin bleu et simulé ressemble à une continuation raisonnable des données. Les corrélogrammes pour PC2 et PC3 ne montrent aucune corrélation significative, donc je modélise ces composants comme du bruit blanc. PC4 montre des corrélations, mais contribue si peu à la variance totale qu'il semble ne pas valoir la peine d'être modélisé, et je modélise également cette composante sous forme de bruit blanc.

Ici, nous avons ajusté deux autres paramètres. Cela nous amène à un total de neuf paramètres dans le modèle (y compris l'ACP), ce qui ne semble pas absurde lorsque nous avons commencé avec des données composées de 112 nombres.

Prévoir. Nous pouvons obtenir une prévision numérique en omettant le bruit (pour obtenir la moyenne) et en inversant l'ACP:

> 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

Les bandes d'incertitude peuvent être obtenues soit analytiquement soit simplement en utilisant Monte Carlo:

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")
}

bandes d'incertitude pour la prévision

Le graphique montre les données réelles pour W, ainsi que des bandes d'incertitude de 60% (trois lignes internes) et de 95% (deux lignes externes) pour une prévision utilisant le modèle ajusté.

jochen
la source
1
Approche intéressante. Permettez-moi de digérer cela un peu.
Dimitriy V. Masterov