Поєднання двох часових рядів шляхом усереднення точок даних


10

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

Скажімо, у мене є часові ряди 2001-2010 рр. З розривом на 2007 рік. Мені вдалося прогнозувати 2007 р., Використовуючи дані 2001-2007 рр. (Червона лінія - так це називається Yf ), і відмовити за допомогою даних 2008-2009 (світло синя лінія - назвіть це Yb ).

Я хотів би об'єднати точки даних Yf і Yb в імпутовану точку даних Y_i за кожен місяць. В ідеалі я хотів би отримати вагу w таку, щоб вона мінімізувала середньоквадратичну помилку передбачення (MSPE) Yi . Якщо це неможливо, як би я просто знайшов середнє значення між двома точками даних часових рядів?

Yi=wYf+(1w)Yb

Як короткий приклад:

tt_f <- ts(1:12, start = 2007, freq = 12)
tt_b <- ts(10:21, start=2007, freq=12)

tt_f
     Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2007   1   2   3   4   5   6   7   8   9  10  11  12
tt_b
     Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2007  10  11  12  13  14  15  16  17  18  19  20  21

Я хотів би отримати (просто показуючи усереднення ... Ідеально мінімізуючи MSPE)

tt_i
     Jan Feb Mar Apr May Jun  Jul  Aug  Sep  Oct  Nov  Dec
2007 5.5 6.5 7.5 8.5 9.5 10.5 11.5 12.5 13.5 14.5 15.5 16.5

введіть тут опис зображення


Яка модель прогнозування (arima, ets, деякі інші)? (+1) для пропозиції підходу, я колись думав про такий спосіб, але залишився в межах очікування-максимізації після інтерполяції. В принципі, період навчання може мати значення, щоб надати більшу вагу для моделі на основі більшої інформації (червоний прогноз на малюнку). Деякі критерії точності також можуть бути корисними для виготовлення ваг, щоб вони не були настільки детерміновано пов'язані з довжинами часових рядів.
Дмитро Челов

Вибачте, що не залишаєте модель прогнозування. Наведене вище - просто використання predictфункції пакету прогнозу. Однак я думаю, що я буду використовувати модель прогнозування HoltWinters для прогнозування та зворотної передачі. У мене є часові ряди, що мають менше <50 підрахунків, і я намагався прогнозувати регресію Пуассона - але чомусь дуже слабкі прогнози.
OSlOlSO

log(counts)t

Чи є у вас лише підрахунки чи якісь додаткові пов'язані часові ряди без NAзначень? Складається враження, що створення періоду навчання MSPE може ввести в оману, оскільки підпериоди добре описуються лінійними тенденціями, але у пропущений період десь відбувається падіння, і насправді це може бути будь-який момент. Зауважимо також, що оскільки прогнози є колінеарними в тренді, їх середнє значення введе два структурні перерви замість, здавалося б, одного.
Дмитро Челов

Вибачте за те, що повертаюся зараз @Dmitij. Про що це "перерва", про яку ви говорите? Я робив журнал (рахує) для регресії GLM. І є підмножина даних підрахунку, яка нараховує менше <6, що змушує мене використовувати їх. У мене є тільки рахунки. Якщо ви подивитесь на це питання, ви отримаєте уявлення про дані, які я маю. Вищезазначені показники стосуються лише групи "15up" AgeGroup. Якщо це має сенс?
OSlOlSO

Відповіді:


0

Якщо припустити, що ви маєте помилки прогнозу у квадраті для прогнозу та зворотного зв'язку, я рекомендував би це: Нехай w буде вектором довжини 12, нехай m - місяць, який вас цікавить.

w=rep(NA,12);
for(w in 1:12){
w[m]=SPE_Backcast[m]/(SPE_Backcast[m]+SPE_Forecast[m]);
}

Тепер w - вага для прогнозу, а 1-w - вага для зворотної передачі.


Здається, це має найвищу вагу найнижчого значення (до того, що негативні числа можуть мати вагу> 1). У чому справа? Також рядок другийs/w/m/
naught101

Як би ви отримали негативні помилки прогнозу в квадраті?
заборгували Йессен

3

t

Y^t:=E(Yt|Y1:r,Ys:n)
Yu:v:=[Yu,Yu+1,,Yv]uvr+1s1ntY^t|1:r,s:n

Y^tt

Коли модель часових рядів може бути розміщена у формі державного простору (СС), згладжування FI - це стандартна операція, заснована на фільтрації Калмана, і це можна зробити, наприклад, використовуючи доступні функції R. Вам просто потрібно вказати, що значення в проміжку відсутні. Алгоритм згладжування оцінює прихований стан який містить усю відповідну інформацію про для у проміжку. Моделі ARIMA можна поставити у формі SS.Y t tαtYtt

Цікаво, що згладжування FI може бути записане у вигляді комбінації двох фільтрів: одного вперед та одного назад, що веде до формули такого типу, який ви очікували, але для оцінки прихованого стану (прогноз і зворотний хід), але не для спостереження . Це відоме як фільтрація Rauch-Tung-Striebel .Y tαtYt

Принаймні, у мультиплікативних версіях процедури "спеціальної прогнозування", такі як Holt-Winters, покладаються на стохастичні моделі, що не мають простих алгоритмів FI, оскільки їх неможливо помістити у форму SS. Формула згладжування, ймовірно, може бути наближена за допомогою моделі SS, але набагато простіше, ніж використовувати моделі структурних часових рядів з перетвореннями журналу. Функції "KalmanSmooth", "tsSmooth" та "StructTS" пакету R статистика можуть зробити цю роботу. Ви повинні ознайомитись з книгами Гарві або Дурбіном та Куопманом, цитованими на довідкових сторінках R. Алгоритм згладжування може забезпечити умовну дисперсію для розрахунковоїYtі може бути використаний для побудови інтервалів згладжування, які зазвичай є більшими посередині зазору. Однак зауважте, що оцінка структурних моделей може бути складною.

AP <- log10(AirPassengers) 
## Fit a Basic Structural Model
fit <- StructTS(AP, type = "BSM")

## Fit with a gap
AP.gap <- AP
AP.gap[73:96] <- NA
fit.gap <- StructTS(AP.gap, type = "BSM", optim.control = list(trace = TRUE))

# plot in orginal (non-logged) scale
plot(AirPassengers, col = "black", ylab = "AirPass")
AP.missing <- ts(AirPassengers[73:96], start=1955, , freq=12)
lines(AP.missing, col = "grey", lwd = 1)

## smooth and sum 'level' and 'sea' to retrieve series
sm <- tsSmooth(fit.gap)
fill <- apply(as.matrix(sm[ , c(1,3)]), 1, sum)
AP.fill <- ts(fill[73:96], start=1955, , freq=12)
lines(10^AP.fill, col = "red", lwd = 1)

Згладжена заливка


2

Я вважаю цікавим ваш запропонований підхід щодо використання засобів переднього та заднього складу.

Одне, на що варто звернути увагу, це те, що в будь-якій системі, що демонструє хаотичну структуру, прогнози, ймовірно, будуть більш точними протягом коротших періодів. Це стосується не всіх систем, наприклад, маятниковий затухаючий макет може бути змодельований функцією з неправильним періодом; в цьому випадку всі середньострокові прогнози, ймовірно, будуть помилковими, тоді як довгострокові прогнози все будуть дуже точна, оскільки система сходить до нуля. Але, як мені здається, з графіка у питанні, мені здається, що це може бути розумним припущенням.

Це означає, що ми можемо краще покладатися більше на прогнозні дані на попередню частину відсутнього періоду, а більше на дані, що передаються в минулому. Найпростішим способом зробити це було б використання лінійно зменшуваної ваги для прогнозу, а зворотного для зворотної передачі:

> n <- [number of missing datapoints] 
> w <- seq(1, 0, by = -1/(n+1))[2:(n+1)]

Це дає невелику вагу відступу на першому елементі. Ви також можете використовувати n-1, без підписок наприкінці, якщо ви хочете використовувати лише значення прогнозу на першій інтерпольованій точці.

> w
 [1] 0.92307692 0.84615385 0.76923077 0.69230769 0.61538462 0.53846154
 [7] 0.46153846 0.38461538 0.30769231 0.23076923 0.15384615 0.07692308

У мене немає ваших даних, тож давайте спробуємо це на наборі даних AirPassenger у Р. Я просто видалю дворічний період біля центру:

> APearly <- ts(AirPassengers[1:72], start=1949, freq=12)
> APlate <- ts(AirPassengers[97:144], start=1957, freq=12)
> APmissing <- ts(AirPassengers[73:96], start=1955, freq=12)
> plot(AirPassengers)
# plot the "missing data" for comparison
> lines(APmissing, col="#eeeeee")
# use the HoltWinters algorithm to predict the mean:
> APforecast <- hw(APearly)[2]$mean
> lines(APforecast, col="red")
# HoltWinters doesn't appear to do backcasting, so reverse the ts, forecast, 
# and reverse again (feel free to edit if there's a better process)
> backwards <- ts(rev(APlate), freq=12)
> backcast <- hw(backwards)[2]$mean
> APbackcast <- ts(rev(backcast), start=1955, freq=12)
> lines(APbackcast, col='blue')
# now the magic: 
> n <- 24 
> w <- seq(1, 0, by=-1/(n+1))[2:(n+1)]
> interpolation = APforecast * w + (1 - w) * APbackcast
> lines(interpolation, col='purple', lwd=2)

І є ваша інтерполяція.

графічний вихід

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

Я гадаю, що ви можете спробувати це, включаючи довірчі інтервали, але я не впевнений у справедливості робити це так просто.

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