R: десезонализация временного ряда

Мы можем использовать следующий код для построения и разложения временных рядов в R:

# Monthly Airline Passenger Numbers 1949-1960
data(AirPassengers)
data = data.frame(AirPassengers)
data

#Transform to time series
ts.data1 = ts(data=as.vector(t(data['AirPassengers'])), start = c(1949), end = c(1960), frequency=12)
#Plot seasonality, trend

plot(stl(ts.data1, "periodic"))
plot(ts.data1)

decomposed <- stl(ts.data1, s.window="periodic")
seasonal <- decomposed$time.series[,1]
trend   <- decomposed$time.series[,2]
remainder <- decomposed$time.series[,3]

#Show seasonal effect
seasonal

Теперь возникает мой вопрос: для того, чтобы десезонализировать, я могу просто напечатать

# deseasonalize time sereis
ts.data1 <- ts.data1 - seasonal
ts.data1
plot(ts.data1)

вычесть сезонные значения?

Я понял, что в другом наборе данных вычитание сезонных значений вызвало отрицательные значения. Вот почему я подумал, что лучше использовать фактор или что-то еще.

Примечание: я бы предпочел не использовать пакет "deseasonalize".

1 ответ

Решение

Да, это будет работать.

Или просто используйте seasadj функция в forecast пакет. Однако с AirPassengers данные, аддитивное разложение, такое как приведенное в stl это не хороший выбор. Вы можете сначала взять логи, а потом это даст разумные результаты.

library(forecast)
library(ggplot2)

decomp <- stl(log(AirPassengers), s.window="periodic")
ap.sa <- exp(seasadj(decomp))
autoplot(cbind(AirPassengers, SeasonallyAdjusted=ap.sa)) +
  xlab("Year") + ylab("Number of passengers (thousands)")

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

Другие вопросы по тегам