Подтвердить что ты не робот

Моделирование временных рядов 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). Я искал ответ на этом форуме и в другом месте, большинство примеров - ежемесячно, есть несколько вопросов по временным рядам, ни один из ответов не является прямым вперед - надеюсь, кто-то может помочь ответить на мои вопросы здесь.

4b9b3361

Ответ 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")