Моделирование временных рядов R на еженедельных данных с использованием объекта ts()
Я пытаюсь выполнить моделирование и прогнозирование временных рядов с использованием R на основе еженедельных данных, как показано ниже -
biz week Amount Count
2006-12-27 973710.7 816570
2007-01-03 4503493.2 3223259
2007-01-10 2593355.9 1659136
2007-01-17 2897670.9 2127792
2007-01-24 3590427.5 2919482
2007-01-31 3761025.7 2981363
2007-02-07 3550213.1 2773988
2007-02-14 3978005.1 3219907
2007-02-21 4020536.0 3027837
2007-02-28 4038007.9 3191570
2007-03-07 3504142.2 2816720
2007-03-14 3427323.1 2703761
...
2014-02-26 99999999.9 1234567
о моих данных, как видно выше, каждую неделю помечен в первый день недели (моя неделя начинается в среду и заканчивается по вторникам).
когда я создаю объект ts, я попробовал
ts <- ts(df, frequency=52, start=c(2007,1))
проблема у меня:
1). в течение некоторого года может быть 53 недели, поэтому частота = 52 не будет работать в течение этих лет;
2). моя начальная неделя/дата - 2006-12-27, как мне задать начальный параметр? start=c(2006,52) or start=c(2007,1)
так как неделя 2006-12-27 действительно пересекает границу года
Кроме того, для моделирования лучше иметь полную стоимость данных за год (скажем, за 2007 год, если у меня есть только данные за один год в год, лучше ли я использовать 2007, вместо этого, чтобы начать с 2008 года. а как насчет 2014 года, так как еще не полный год, я должен использовать то, что у меня есть для модели, или нет? В любом случае у меня все еще есть вопрос о том, включать ли эти недели в границу года, например, 2006-12-27, включить его как wk 1 для 2007 или последней недели 2006 года?
3). когда я использую ts <- ts(df, frequency=52, start=c(2007,1))
, а затем печатаю его, я получил результаты, показанные ниже, поэтому вместо 2007.01, 2007.02, 2007.52...., я получил 2007.000, 2007.019,.... который он получает от 1/52 = 0,019, что математически корректно, но не очень легко интерпретировать, есть ли способ обозначить его как дату как таковой, например, фрейм данных или по меньшей мере 2007 wk1, 2007 wk2...
=========
Time Series:
Start = c(2007, 1)
End = c(2014, 11)
Frequency = 52
Amount Count
2007.000 645575.4 493717
2007.019 2185193.2 1659577
2007.038 1016711.8 860777
2007.058 1894056.4 1450101
2007.077 2317517.6 1757219
2007.096 2522955.8 1794512
2007.115 2266107.3 1723002
4). моя цель состоит в том, чтобы смоделировать эти еженедельные данные, а затем попытаться разложить его, чтобы увидеть сезонный компонент, кажется, что мне нужно использовать функцию ts() для преобразования в ts-объект, тогда я могу использовать функцию разложения(), я попробовал функцию xts(), и я получил сообщение об ошибке "временные ряды не имеют или не менее двух периодов". Я думаю, причина в том, что xts() не позволит мне указать частоту?
xts <- xts(df,order.by=businessWeekDate)
5). Я искал ответ на этом форуме и в другом месте, большинство примеров - ежемесячно, есть несколько вопросов по временным рядам, ни один из ответов не является прямым
вперед - надеюсь, кто-то может помочь ответить на мои вопросы здесь.
Ответы
Ответ 1
Использование нецелых частот работает достаточно хорошо и совместимо с большинством моделей (auto.arima, ets,...). Для даты начала я просто использую удобные функции в lubridate. Важность здесь должна быть последовательной при работе с несколькими временными рядами потенциально разных дат начала и окончания.
library(lubridate)
ts(df$Amount,
freq=365.25/7,
start=decimal_date(ymd("2006-12-27")))
Ответ 2
Сначала убедитесь, что ваши данные имеют ровно 52 данных в год. Для этого определите годы с 53 данными и удалите тот, который менее важен для вашего шаблона сезонности (например, не удаляйте неделю в декабре, если вы хотите проверить сезонность рождественских продаж (!)
Xts - это хороший формат, поскольку он более гибкий, однако все инструменты для декомпозиции и прогнозирования обычно работают с ts, поскольку они требуют фиксированного количества данных за цикл.
относительно вашего вопроса о неполных годах. это не должно быть проблемой. R не знает, когда январь или декабрь, поэтому год может начинаться и заканчиваться в любое время.
Ответ 3
Что касается вашего 4-го вопроса, я думаю, что ошибка связана с тем, что у вас есть только один период данных (52 недели), и вам может понадобиться еще 52 недели для завершения двух периодов.
Ответ 4
ur ответьте на вопрос 3. Он не дает w1, w2, но уверен, что дает недели в правильном порядке. Это часть моего кода
fit <- auto.arima(sales)
fcast<-forecast(fit,h=13)
dfcast<-data.frame(fcast)
b<-data.frame(seq(as.Date(maxdate+7), by = "week", length.out = input$ahead))
ffcast<-as.data.frame(cbind(b,dfcast$Point.Forecast,dfcast$Lo.95,dfcast$Hi.95))
names(ffcast)<-c("Week","Forecast","Lo-95","Hi-95")