Найменш дурний спосіб прогнозувати короткий багатоваріантний часовий ряд


16

Мені потрібно прогнозувати наступні 4 змінні на 29-ту одиницю часу. У мене є приблизно 2 роки історичних даних, де 1 і 14 і 27 - це той самий період (або час року). Зрештою, я роблю декомпозицію стилю Oaxaca-Blinder на , , та .Wшгшcp

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

Я вважаю, що можна наблизити по плюс помилка вимірювання, але ви можете бачити, що завжди значно перевищує цю кількість через відходи, помилку наближення або крадіжку.Wpшг+(1-p)шcW

Ось мої 2 запитання.

  1. Першою моєю думкою було спробувати векторну авторегресію на цих змінних з 1 затримкою та екзогенною змінною часу та періоду, але це здається поганою ідеєю, враховуючи, наскільки мало даних у мене. Чи існують якісь часові ряди методів, які (1) краще справлятимуться в умовах "мікрочислення" та (2) зможуть використовувати зв'язок між змінними?

  2. З іншого боку, модулі власних значень для VAR всі менше 1, тому я не думаю, що мені потрібно турбуватися про нестаціонарність (хоча тест Діккі-Фуллера пропонує інше). Прогнози, здається, здебільшого відповідають прогнозам гнучкої універсальної моделі з часовою тенденцією, за винятком і , які нижчі. Коефіцієнти на відставання здаються переважно розумними, хоча вони здебільшого незначні. Коефіцієнт лінійної тенденції є вагомим, як і деякі манекени періоду. Все-таки, чи є якісь теоретичні причини віддати перевагу цьому більш простому підходу над моделлю VAR?Wp

Повне розкриття інформації: я задавав аналогічне запитання щодо " Статаліста", не маючи відповіді.


Привіт, ви могли б дати ще якийсь контекст навколо розкладу, який ви хочете зробити, оскільки я не бачив, щоб він застосовувався до даних часових рядів?
Мішель

Я розбиваю зміну на компоненти таким чином: W'-W=p'(шD'-шD)+(1-p')(шС'-шС)+(шD-шС)(p'-p)+(ϵ'-ϵ), де прайми позначають поточне значення змінних.
Мастеров Димитрій Васильович

хммм, а як щодо того, щоб спочатку виключити людей, що пережили, до регресії?
athos

Який рівень точності вам потрібен? Я прошу, бо, як ви знаєте, ви можете використовувати моделі ARIMA і отримувати дуже низький рівень MSE. Однак, оскільки ці моделі зазвичай підходять із максимальною вірогідністю, майже впевнено, що вам подобається. Байєсівські моделі є надійними при роботі з невеликими даними, але я думаю, ви отримаєте на MSE на порядок вище, ніж у моделях ARIMA.
Роберт Сміт

Відповіді:


2

Я розумію, що це питання сидить тут уже роками, але все ж такі корисні ідеї можуть бути корисними:

  1. Якщо існують зв’язки між змінними (і теоретична формула працює не так добре), PCA можна використовувати для системного пошуку (лінійних) залежностей. Я покажу, що це добре працює для даних даних у цьому запитанні.

  2. Враховуючи, що даних не так багато (загалом 112 номерів), можна оцінити лише декілька параметрів моделі ( наприклад, встановлення повних сезонних ефектів не є можливим), а спробувати власну модель може мати сенс.

Ось як я зробив прогноз, дотримуючись цих принципів:

Крок 1. Ми можемо використовувати PCA для виявлення залежностей у даних. Використовуючи R, з даними, що зберігаються у 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,234шг-1.152шc-8.842p

4×4

Крок 2. Існує чітка тенденція в PC1:

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

тенденція PC1

Я створюю копію результатів на ПК із видаленою тенденцією:

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

Складання балів інших ПК не виявляє чітких тенденцій, тому я залишаю їх незмінними.

Оскільки показники ПК по центру, тенденція проходить через центр маси зразка PC1, а відповідна тенденція відповідає лише оцінці одного параметра.

Крок 3. Ділянка розсіювання пар не має чіткої структури, тому я моделюю ПК як незалежні:

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

пару розкидайте сюжет ПК після зняття тренду

Крок 4. Існує чітка періодичність у PC1 із відставанням 13 (як це запропоновано запитанням). Це можна побачити по-різному. Наприклад, автокореляція відставання 13 виявляється значно відрізняється від 0 у корелограмі:

> acf(y2[,1])

ACF PC1 після зняття дрейфу

(Періодичність є візуально більш вражаючою при побудові даних разом зі зміщеною копією.)

ут+13(1)=α13ут(1)+σεт+13εтα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

Як тест на правдоподібність, я будую наведені дані (чорні) разом із випадковою траєкторією моєї моделі для PC1 (синій), починаючи з року на майбутнє:

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

симульована траєкторія для PC1

Синій, імітований фрагмент шляху виглядає як розумне продовження даних. Корелограми для PC2 та PC3 не показують суттєвих кореляцій, тому я моделюю ці компоненти як білий шум. PC4 показує кореляції, але так мало сприяє загальній дисперсії, що, здається, не варто моделювати, і я також моделюю цей компонент як білий шум.

Тут ми встановили ще два параметри. Це підводить нас до дев'яти параметрів у моделі (включаючи PCA), що не здається абсурдним, коли ми починали з даних, що складаються з 112 чисел.

Прогноз. Ми можемо отримати числовий прогноз, відкинувши шум (щоб отримати середнє значення) та скасувати PCA:

> 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

Діапазони невизначеності можна отримати або аналітично, або просто, використовуючи Монте-Карло:

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

смуги невизначеності для прогнозу

W


1
Цікавий підхід. Дозвольте мені трохи переварити це.
Мастеров Димитрій Васильович
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.