Разложение объекта зоопарка без периодической ошибки - PullRequest
0 голосов
/ 05 июня 2019

Я пытаюсь разложить дневные временные ряды на сезонную, трендовую и оставшуюся часть.Мы можем посмотреть на пример с акциями Google, предоставляемыми пакетом fpp2:

Загрузка библиотек

library(forecast)
library(lubridate) 
library(zoo)
library(fpp2)

Преобразование временного ряда пакета в числовой вектор

google <- as.numeric(goog)

На основе документации акции Google переходят с 2013-02-25 по 2017-02-23

googZ <- zoo(google, seq(from = as.Date("2013-02-25"), to = as.Date("2017-02-23"), by = "days"))

Ошибка при разложении (googZ): временной ряд не имеет или меньше 2 периодов

decompose(googZ)

Ошибка в разложении (googZ): временной ряд не имеет или меньше 2 периодов

Однако этот работает, и я не уверен, почему Google on не работает

autoplot(decompose(AirPassengers))
str(AirPassengers)

Я не понимаю, почему это происходит, поскольку мы четко и правильно определили наш временной ряд.Обратите внимание, что я использовал пакет zoo, потому что ts не может обрабатывать ежедневные временные ряды.Большое спасибо!

1 Ответ

2 голосов
/ 05 июня 2019

decompose требует

  • равномерно распределенных ts рядов
  • одинакового количества баллов за период, например, 365 баллов за год при условии, что год - один период
  • чтобы период составлял 1
  • чтобы точки внутри периода были отделены друг от друга, где delatt = 1 / частота и частота - это количество точек за период

DateОбъекты класса представлены как дни с начала эпохи (1 января 1970 г.).Из-за високосных годов Date объекты не имеют одинакового количества точек в год, разница между последовательными годами составляет 365 или 366, а не 1, и точки разделяются на 1, а не разделяются.

Чтомы можем принудительно вписать его в объект ts, это взять первые 365 дней в году (в високосные годы это снизится до 31 декабря), а затем использовать это.Обратите внимание, что компонент year объектов POSIXlt - это количество лет с 1900 года, поэтому мы должны добавить 1900 назад, а компонент yday равен 0 для 1 января, 1 для 2 января и так далее до 364 для невисокосный год и 365 для високосного года.

library(ggplot2)
library(zoo)

lt <- as.POSIXlt(time(goog2))
tt <- with(lt, ts(coredata(goog2[yday < 365]), 
  start = year[1] + 1900 + yday[1]/365, frequency = 365))
autoplot(decompose(tt))

, дающий:

screenshot

...