При прогнозировании удобно представить временной ряд как комбинацию трех компонент : тренд, сезонность и случайная компонента. В результате получаем две модели временного ряда :
аддитивная модель Yt = Tt + St +et.
мультипликативная Yt = Tt*St*et.
Функция decompose из пакета stats делает такое разложение. Применим ее для нашего месячного временного ряда, рассмотрим отдельно аддитивную и мультипликативную модель.
ts_month_dec_ad <- decompose(ts_month,type = "additive")
ts_month_dec_mult <- decompose(ts_month,type = "multiplicative")
Рассмотрим структуру полученных объектов.
аддитивная модель Yt = Tt + St +et.
мультипликативная Yt = Tt*St*et.
Функция decompose из пакета stats делает такое разложение. Применим ее для нашего месячного временного ряда, рассмотрим отдельно аддитивную и мультипликативную модель.
ts_month_dec_ad <- decompose(ts_month,type = "additive")
ts_month_dec_mult <- decompose(ts_month,type = "multiplicative")
Рассмотрим структуру полученных объектов.
str(ts_month_dec_ad)
## List of 6
## $ x : Time-Series [1:60] from 2015 to 2020: 14472 7045 10279 9084 10825 ...
## $ seasonal: Time-Series [1:60] from 2015 to 2020: 3063 -3696 -948 -1618 -897 ...
## $ trend : Time-Series [1:60] from 2015 to 2020: NA NA NA NA NA ...
## $ random : Time-Series [1:60] from 2015 to 2020: NA NA NA NA NA ...
## $ figure : num [1:12] 3063 -3696 -948 -1618 -897 ...
## $ type : chr "additive"
## - attr(*, "class")= chr "decomposed.ts"
## $ x : Time-Series [1:60] from 2015 to 2020: 14472 7045 10279 9084 10825 ...
## $ seasonal: Time-Series [1:60] from 2015 to 2020: 3063 -3696 -948 -1618 -897 ...
## $ trend : Time-Series [1:60] from 2015 to 2020: NA NA NA NA NA ...
## $ random : Time-Series [1:60] from 2015 to 2020: NA NA NA NA NA ...
## $ figure : num [1:12] 3063 -3696 -948 -1618 -897 ...
## $ type : chr "additive"
## - attr(*, "class")= chr "decomposed.ts"
str(ts_month_dec_mult)
## List of 6
## $ x : Time-Series [1:60] from 2015 to 2020: 14472 7045 10279 9084 10825 ...
## $ seasonal: Time-Series [1:60] from 2015 to 2020: 1.306 0.628 0.906 0.836 0.91 ...
## $ trend : Time-Series [1:60] from 2015 to 2020: NA NA NA NA NA ...
## $ random : Time-Series [1:60] from 2015 to 2020: NA NA NA NA NA ...
## $ figure : num [1:12] 1.306 0.628 0.906 0.836 0.91 ...
## $ type : chr "multiplicative"
## - attr(*, "class")= chr "decomposed.ts"
## $ x : Time-Series [1:60] from 2015 to 2020: 14472 7045 10279 9084 10825 ...
## $ seasonal: Time-Series [1:60] from 2015 to 2020: 1.306 0.628 0.906 0.836 0.91 ...
## $ trend : Time-Series [1:60] from 2015 to 2020: NA NA NA NA NA ...
## $ random : Time-Series [1:60] from 2015 to 2020: NA NA NA NA NA ...
## $ figure : num [1:12] 1.306 0.628 0.906 0.836 0.91 ...
## $ type : chr "multiplicative"
## - attr(*, "class")= chr "decomposed.ts"
Функция decompose возвращает
список из шести объектов:
x : временной ряд
seasonal: оценка сезонных коэффициентов (матрица по годам)
trend : это оценка тренда ряда, можно видеть, что первые и последние шесть
наблюдений отсутствуют в связи с использованием двухстороннего скользящего
среднего, число пропущенных значений определяется порядком скользящего
среднего.
random : это оценка нерегулярной компоненты, этот не что иное, как остальная
часть серии без двух предыдущих компонентов.
figure : оценка сезонных коэффициентов (вектор)
type : это тип разложения, либо аддитивная (по умолчанию), либо
мультипликативная модель.
Сравним заданные при
формировании временного ряда сезонные коэффициенты и полученные после
декомпозиции мультипликативной модели. Для этого создадим датафрейм из входных
(in) и
выходных после декомпозиции СК (out) и выведем столбчатый график.
df_sc <- data.frame(ind=as.factor(rep(c('in','out'),c(12,12))),
month=as.factor(rep((1:12),2)),
sc=c(sc_month,ts_month_dec_mult$figure))
ggplot(df_sc, aes(x = month, y = sc, fill = ind)) +
geom_col(position = "dodge", colour = "black") +
scale_fill_brewer(palette = "Pastel1")+
geom_text(aes(label = round(sc,2)), vjust = 1.0,
size = 3,colour = "black",position = position_dodge(.9))+
xlab('Месяц')+ylab('Сезонный коэффициент')
month=as.factor(rep((1:12),2)),
sc=c(sc_month,ts_month_dec_mult$figure))
ggplot(df_sc, aes(x = month, y = sc, fill = ind)) +
geom_col(position = "dodge", colour = "black") +
scale_fill_brewer(palette = "Pastel1")+
geom_text(aes(label = round(sc,2)), vjust = 1.0,
size = 3,colour = "black",position = position_dodge(.9))+
xlab('Месяц')+ylab('Сезонный коэффициент')
Как видно по графику, функция хорошо выделила сезонные коэффициенты, наибольшее различие наблюдается в январе и связано это с тем, что в январе продолжительные каникулы с повышающими дневными сезонными коэффициентами. В дальнейшем ее можно использовать для оперативного анализа и сравнения временных рядов с точки зрения различий в сезонности, направления и наклона тренда, по величине случайной компоненты оценить стабильность показателя и степень влияния случайных факторов (это может стать причиной дополнительного анализа с целью выявления этих факторов).
Класс полученного при декомпозиции объекта можно также посмотреть с помощью функции class()
class(ts_month_dec_ad)
## [1]
"decomposed.ts"
class(ts_month_dec_mult)
## [1] "decomposed.ts"
Класс decomposed.ts легко визуализируется с
помощью функции plot
plot(ts_month_dec_ad)
plot(ts_month_dec_mult)
Разложение временных
рядов до их компонентов является одним из основных методов анализ временных
рядов. Использование этого метода помогает при выборе модели и метода
прогнозирования, что , в конечном счете, и является основной задачей работы с
временными рядами.
Комментариев нет:
Отправить комментарий