Guest User

Untitled

a guest
Jan 23rd, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.29 KB | None | 0 0
  1. library(forecast)
  2. library(prophet)
  3. library(imputeTS)
  4. library(tidyverse)
  5. library(forecastHybrid)
  6. library(purrr)
  7. library(lubridate)
  8.  
  9. cpi0 <- read_csv("~/Downloads/cpi_weekly.csv")
  10.  
  11. glimpse(cpi0)
  12. class(cpi0)
  13.  
  14. colnames(cpi0) <- c("date", "actual")
  15. glimpse(cpi0)
  16.  
  17. ymd("2008-08-06") # 2008-08-06 как дата
  18. ymd("2008-08-06") + weeks(7)
  19. ymd("2008-08-06") + weeks(0:7)
  20.  
  21. clean_cpi <- tibble(date =
  22. ymd("2008-08-06") + weeks(0:(nrow(cpi0) - 1)))
  23. glimpse(cpi0)
  24. glimpse(clean_cpi)
  25.  
  26. # первая попытка склеить таблички
  27. clean_cpi <- left_join(clean_cpi, cpi0, by = "date")
  28. # облом так как дата в табличках в разных форматах
  29. # формат dttm (дата + время)
  30. # формат date (дата)
  31.  
  32. # пробуем перевести
  33. a <- cpi0$date[1]
  34. class(a)
  35. as.Date(a) %>% class()
  36.  
  37. # переводим один формат дат в другой
  38. cpi0 <- mutate(cpi0, date2 = as.Date(date))
  39. glimpse(cpi0)
  40.  
  41. # попытка склейки 2
  42. clean_cpi <- left_join(clean_cpi, cpi0,
  43. by = c(`date` = "date2"))
  44. glimpse(clean_cpi)
  45.  
  46.  
  47. # единица измерения = 1 год
  48. # циклов внутри года = 365.25/7
  49. yday(min(clean_cpi$date)) # день от начала года
  50.  
  51. cpi_ts <- ts(data = clean_cpi$actual,
  52. frequency = 365.25/7,
  53. start = 2008 + yday(min(clean_cpi$date))/365)
  54. cpi_ts
  55.  
  56.  
  57. # работаем с рядом :)
  58. statsNA(cpi_ts)
  59. plotNA.distribution(cpi_ts)
  60.  
  61. # заполнили пропуски
  62. cpi_ts_filled <- na.interpolation(cpi_ts)
  63. plotNA.distribution(cpi_ts_filled)
  64.  
  65. # визуализация
  66. ggtsdisplay(cpi_ts_filled)
  67.  
  68. # наивные прогнозы
  69.  
  70. # для конкретной подвыборки
  71. cpi_pre2017 <- window(cpi_ts_filled, end = 2016.999)
  72.  
  73. naive(cpi_pre2017, h = 1)
  74. snaive(cpi_pre2017, h = 1)
  75. # сезонный наивный прогноз не сработал так как
  76. # частота ряда была дробная и
  77. # взять дробное количество недель назад функция не смогла
  78.  
  79. week(min(clean_cpi$date))
  80.  
  81. cpi_ts_filled2 <- ts(cpi_ts_filled,
  82. freq = 52,
  83. start = c(2008, week(min(clean_cpi$date))))
  84.  
  85. # для конкретной подвыборки
  86. cpi2_pre2017 <- window(cpi_ts_filled2, end = c(2016, 52))
  87.  
  88. naive(cpi2_pre2017, h = 1)
  89. snaive(cpi2_pre2017, h = 1)
  90.  
  91. autoplot(f_naive0)
  92.  
  93. # смотрим, что там внутри списка с прогнозами
  94. f_naive0 <- naive(cpi2_pre2017, h = 10)
  95. str(f_naive0)
  96. f_naive0[["mean"]]
  97.  
  98.  
  99.  
  100. # ошибки прогнозов растущим окном
  101. e_naive <- tsCV(cpi_ts_filled2, naive, h = 1)
  102. e_snaive <- tsCV(cpi_ts_filled2, snaive, h = 1)
  103.  
  104. ggtsdisplay(e_naive)
  105. ggtsdisplay(e_snaive)
  106.  
  107. # пробуем ARIMA ручную
  108. # ARMA(1, 1)-SARMA(1,1)
  109.  
  110. model_11_11 <- Arima(cpi2_pre2017,
  111. order = c(1, 0, 1),
  112. seasonal = c(1, 0, 1))
  113. forecast(model_11_11, h = 10)
  114.  
  115. # упакуем нашу модель в одну функцию
  116. farima_11_11 <- function(y, h = 1) {
  117. model <- Arima(y,
  118. order = c(1, 0, 1),
  119. seasonal = c(1, 0, 1))
  120. future_y <- forecast(model, h = h)
  121. return(future_y)
  122. }
  123.  
  124. farima_11_11(cpi2_pre2017, h = 2)
  125.  
  126. # здесь можно принять ванну и выпить чашечку кофе!
  127. e_farima_11_11 <- tsCV(cpi_ts_filled2,
  128. farima_11_11, h = 1)
  129.  
  130. xfourier <- fourier(cpi_ts_filled, K = 2)
  131. ggtsdisplay(xfourier[, 1])
  132. ggtsdisplay(xfourier[, 2])
  133. ggtsdisplay(xfourier[, 3])
  134. ggtsdisplay(xfourier[, 4])
  135. yf <- apply(xfourier, MARGIN = 1, sum)
  136. ggtsdisplay(yf)
  137. ggtsdisplay(cpi_ts_filled)
  138.  
  139. # прогноз с помощью arima
  140. # с регрессорами в виде рядов Фурье
  141. farima_fourier <- function(y, h = 1) {
  142. model <- Arima(y,
  143. order = c(1, 0, 0),
  144. xreg = fourier(y, K = 10),
  145. seasonal = c(0, 0, 0))
  146. future_y <- forecast(model,
  147. xreg = fourier(y, K = 10, h = h),
  148. h = h)
  149. return(future_y)
  150. }
  151.  
  152. farima_fourier(cpi_pre2017, h = 1)
  153. e_farima_fourier <- tsCV(cpi_ts_filled,
  154. farima_fourier, h = 1)
  155.  
  156. ets_auto <- function(y, h = 1) {
  157. model <- ets(y)
  158. future_y <- forecast(model, h = h)
  159. return(future_y)
  160. }
  161.  
  162. ets_auto(cpi2_pre2017, h = 1)
  163.  
  164. e_ets_auto <- tsCV(cpi_ts_filled2,
  165. ets_auto, h = 1)
  166.  
  167. tbats_auto <- function(y, h = 1) {
  168. model <- tbats(y)
  169. future_y <- forecast(model, h = h)
  170. return(future_y)
  171. }
  172.  
  173. e_tbats_auto <- tsCV(cpi_ts_filled,
  174. tbats_auto, h = 1)
  175.  
  176.  
  177. # руками усреднили две модели
  178. e_naive_snaive <- (e_naive + e_snaive) / 2
  179.  
  180. # автоматическое усреднение 6 или меньше моделей
  181. ?hybridModel()
  182.  
  183. all_errors <- tibble(naive = coredata(e_naive),
  184. snaive = coredata(e_snaive),
  185. arima_fourier = coredata(e_farima_fourier),
  186. date = clean_cpi$date)
  187. MSE <- function(u) {
  188. return(mean(u^2, na.rm = TRUE))
  189. }
  190.  
  191. all_errors <- mutate(all_errors,
  192. snaive_fourier = (arima_fourier + snaive) / 2)
  193.  
  194. errors_subset <- all_errors %>% filter(date > ymd("2017-01-01"))
  195.  
  196. MSE(errors_subset$naive)
  197. MSE(errors_subset$snaive)
  198. MSE(errors_subset$arima_fourier)
  199. MSE(errors_subset$snaive_fourier)
Add Comment
Please, Sign In to add comment