Size: a a a

R (язык программирования)

2021 January 27

DK

Dm Kb in R (язык программирования)
Анатолий
Добрый день! Подскажите, пожалуйста. Пытаюсь сделать прогноз на скользящем окне, на одну точку вперед. Как сделать циклом- придумал, но он работает очень медленно. Можно это как-то векторизовать?

 

slide.arima <- function(x, window=36) {

  result <- rep(-999, length(x))
 result[1:window] <- NA
 for (i in (window+1):length(x)){

    result[i] <- (x[(i-window):(i-1)] %>% ts(frequency = 12) %>% auto.arima() %>%  forecast(h=1))$mean[1]  
}

  return(result)

}

x <- sin(1:100)

system.time(slide.arima(x))

пользователь      система       прошло

      122.63         0.01       122.73

 

И второй вопрос: выражение ( %>% … %>%...)$mean[1] выглядит как-то неправильно. Можно ли вместо скобок и $mean[1] сделать что-то более читаемое или и так считается норм?
arima - это по сути регрессия на лагах... хотя алгоритм простой, выявление лучшей модели требует перебора всех вариантов. По умолчанию, стоит параметр nmodels = 94. Это значит, что строится 94 модели и выбирается лучшая. Поэтому на циклах вы много не оптимизируете. Придется либо уменьшать количество перебираемых моделей, либо смотреть другие реализации arima, либо использовать параллельные вычисления. Для красивого выбора элемента используйте purrr::pluck(), далее код:


x <- sin(1:100)
#оригинальная функция с pluck() для читаемости
slide.arima <- function(x, window = 36) {
 #x <- sin(1:100)
 result <- rep(-999, length(x))
 result[1:window] <- NA
 for (i in (window + 1):length(x)){
   
   result[i] <- x[(i-window):(i-1)] %>%
                   ts(frequency = 12) %>%
                   forecast::auto.arima() %>%
                   forecast::forecast(h=1) %>%
                   purrr::pluck("mean")
 }
 
 return(result)
}
system.time(res1 <- slide.arima(x))
# пользователь      система       прошло
# 98.916        9.435      112.950

#функция на векторизованными циклами и параллельными вычислениями
future::plan(future::multisession, workers = 2)
slide_arima <- function(x, window = 36){
 
 window_begin <- 1:(length(x) - window)
 window_end <- window:(length(x) - 1)
 
 get_forecast <- function(vec){
   ts(x[vec], frequency = 12) %>%
     forecast::auto.arima() %>%
     forecast::forecast(., h = 1) %>%
     purrr::pluck("mean")
 }
 
 res <- map2(.x = window_begin, .y = window_end, ~.x:.y) %>%
   furrr::future_map_dbl(~get_forecast(.))
 
 rep(NA, window) %>% append(res)
}
system.time(res2 <- slide_arima(x))
# пользователь      система       прошло
# 0.406        0.053       59.573

res1 == res2
источник
2021 January 28

IY

Igor Yegin in R (язык программирования)
Dm Kb
arima - это по сути регрессия на лагах... хотя алгоритм простой, выявление лучшей модели требует перебора всех вариантов. По умолчанию, стоит параметр nmodels = 94. Это значит, что строится 94 модели и выбирается лучшая. Поэтому на циклах вы много не оптимизируете. Придется либо уменьшать количество перебираемых моделей, либо смотреть другие реализации arima, либо использовать параллельные вычисления. Для красивого выбора элемента используйте purrr::pluck(), далее код:


x <- sin(1:100)
#оригинальная функция с pluck() для читаемости
slide.arima <- function(x, window = 36) {
 #x <- sin(1:100)
 result <- rep(-999, length(x))
 result[1:window] <- NA
 for (i in (window + 1):length(x)){
   
   result[i] <- x[(i-window):(i-1)] %>%
                   ts(frequency = 12) %>%
                   forecast::auto.arima() %>%
                   forecast::forecast(h=1) %>%
                   purrr::pluck("mean")
 }
 
 return(result)
}
system.time(res1 <- slide.arima(x))
# пользователь      система       прошло
# 98.916        9.435      112.950

#функция на векторизованными циклами и параллельными вычислениями
future::plan(future::multisession, workers = 2)
slide_arima <- function(x, window = 36){
 
 window_begin <- 1:(length(x) - window)
 window_end <- window:(length(x) - 1)
 
 get_forecast <- function(vec){
   ts(x[vec], frequency = 12) %>%
     forecast::auto.arima() %>%
     forecast::forecast(., h = 1) %>%
     purrr::pluck("mean")
 }
 
 res <- map2(.x = window_begin, .y = window_end, ~.x:.y) %>%
   furrr::future_map_dbl(~get_forecast(.))
 
 rep(NA, window) %>% append(res)
}
system.time(res2 <- slide_arima(x))
# пользователь      система       прошло
# 0.406        0.053       59.573

res1 == res2
Регрессия на лагах — это AR, ARIMA сложнее описывается
источник

DK

Dm Kb in R (язык программирования)
Igor Yegin
Регрессия на лагах — это AR, ARIMA сложнее описывается
Да, конечно, там ещё регрессия на остатках и сезонность, но в любом случае это OLS
источник

IY

Igor Yegin in R (язык программирования)
ARIMA же не подгоняется OLS
источник

IY

Igor Yakubovskiy in R (язык программирования)
Оценки коэффициентов - это ols
А выбор регрессоров - через acf, pacf и критерии информационные
источник

IY

Igor Yegin in R (язык программирования)
Igor Yakubovskiy
Оценки коэффициентов - это ols
А выбор регрессоров - через acf, pacf и критерии информационные
Коэффициенты ARIMA в принципе не оцениваются OLS, если присутствует ненулевая MA-часть. Обычно используют метод максимального правдоподобия
источник

IY

Igor Yakubovskiy in R (язык программирования)
ARIMA(0,0,1)
источник

IY

Igor Yakubovskiy in R (язык программирования)
оценилась МНК
источник

IY

Igor Yakubovskiy in R (язык программирования)
рандомный скрин  из Носко В.П.
источник

IY

Igor Yegin in R (язык программирования)
Igor Yakubovskiy
рандомный скрин  из Носко В.П.
источник

AB

Alexey Burnakov in R (язык программирования)
Igor Yegin
Коэффициенты ARIMA в принципе не оцениваются OLS, если присутствует ненулевая MA-часть. Обычно используют метод максимального правдоподобия
Да, тоже читал когда-то, что метод оценки кефов - максимизация ф-ии правдоподобия.
источник

AB

Alexey Burnakov in R (язык программирования)
Анатолий
Спасибо,  это сработало.

По п.1 переписать автоариму самому это точно мне не по силам. Я то думал использовать её как-то векторно, а не в цикле.  Но видимо проблема именно в тяжести самой аримы. ХолтВинтерс в таком цикле работает мгновенно.
На примеры посмотрю с удовольствием.
А можете еще раз пояснить, пож., что такое векторно в вашем понимании, в этом контексте. Чем это лучше, напр., параллельно исполнения?

По поводу "тяжести" функции. Там не столько сама ARIMA тяжела (ну, она тоже не совсем "легка"), сколько перебор (иногда) десятков моделей аримы. Это же авто арима. Вот он и тормозит. Могу подсказать, как настроить аргументы этой функции перебора для менее тормозных вычислений
источник

AS

Alexey Seleznev in R (язык программирования)
Друзья, опубликовал видео о пакете lgr, который предназначен для логгирования.

Тайм коды:
1. Корневой логгер в lgr (0:47)
2. Структура объектов пакета lgr (1:52)
3. Инициализация записей в журналы (3:45)
4. Создание своих логгеров (5:03)
5. Уровни критичности событий и детализация логгеров (7:35)
6. Как событие попадает в журнал (15:24)
7. JSON обработчик (17:19)
8. Запись логов в базы данных (21:19)
9. Как добавить фильтр в логгер или обработчик (27:49)
10. Совместное использование пакета lgr с конструкцией tryCatch (31:03)
11. Обработка ошибок случившихся при инициализации записи события в журналы функция defaultexceptionhandler() (37:54)

https://youtu.be/xA8YGxQH1Ws
YouTube
Логирование процесса выполнения скриптов на языке R (пакеты lgr / lgrExtra)
Описание:
В этом видео мы разберёмся с тем, как фиксировать ход выполнения R скриптов в журналах. Такими журналами могут быть обычные текстовые файлы, json файлы или базы данных.

В R есть множество пакетов реализующих логирование, в данном случае мы рассмотрим один из наиболее новых и функциональных - lgr и его расширение lgrExtra.

|===========================================|
Материалы:
Код - https://github.com/selesnow/publications/blob/master/code_example/logger_lesson/lgr1.R
Ссылка на статью по теме: https://habr.com/ru/post/529118/

|===========================================|
Тайм коды:
1. Корневой логер в lgr (0:47)
2. Структура объектов пакета lgr (1:52)
3. Инициализация записей в журналы (3:45)
4. Создание своих логеров (5:03)
5. Уровни критичности событий и детализация логеров (7:35)
6. Как событие попадает в журнал (15:24)
7. JSON обработчик (17:19)
8. Запись логов в базы данных (21:19)
9. Как добавить фильтр в логер или обработчик (27:49)
10. Совместное использование пакета lgr с конструкцией…
источник

IY

Igor Yakubovskiy in R (язык программирования)
да, ок тогда )
видимо ARMA (ARIMA(p, 0, q)) только МНК может оцениться
источник

ВП

Владимир Попукайло... in R (язык программирования)
Alexey Seleznev
Друзья, опубликовал видео о пакете lgr, который предназначен для логгирования.

Тайм коды:
1. Корневой логгер в lgr (0:47)
2. Структура объектов пакета lgr (1:52)
3. Инициализация записей в журналы (3:45)
4. Создание своих логгеров (5:03)
5. Уровни критичности событий и детализация логгеров (7:35)
6. Как событие попадает в журнал (15:24)
7. JSON обработчик (17:19)
8. Запись логов в базы данных (21:19)
9. Как добавить фильтр в логгер или обработчик (27:49)
10. Совместное использование пакета lgr с конструкцией tryCatch (31:03)
11. Обработка ошибок случившихся при инициализации записи события в журналы функция defaultexceptionhandler() (37:54)

https://youtu.be/xA8YGxQH1Ws
YouTube
Логирование процесса выполнения скриптов на языке R (пакеты lgr / lgrExtra)
Описание:
В этом видео мы разберёмся с тем, как фиксировать ход выполнения R скриптов в журналах. Такими журналами могут быть обычные текстовые файлы, json файлы или базы данных.

В R есть множество пакетов реализующих логирование, в данном случае мы рассмотрим один из наиболее новых и функциональных - lgr и его расширение lgrExtra.

|===========================================|
Материалы:
Код - https://github.com/selesnow/publications/blob/master/code_example/logger_lesson/lgr1.R
Ссылка на статью по теме: https://habr.com/ru/post/529118/

|===========================================|
Тайм коды:
1. Корневой логер в lgr (0:47)
2. Структура объектов пакета lgr (1:52)
3. Инициализация записей в журналы (3:45)
4. Создание своих логеров (5:03)
5. Уровни критичности событий и детализация логеров (7:35)
6. Как событие попадает в журнал (15:24)
7. JSON обработчик (17:19)
8. Запись логов в базы данных (21:19)
9. Как добавить фильтр в логер или обработчик (27:49)
10. Совместное использование пакета lgr с конструкцией…
не хочется придираться, но опечатка на стоп-кадре в слове скриптОв и лоГГирование...
источник

AS

Alexey Seleznev in R (язык программирования)
Владимир Попукайло
не хочется придираться, но опечатка на стоп-кадре в слове скриптОв и лоГГирование...
На скорую руку слепил превьюху, спасибо, сейчас поправлю
источник

ВП

Владимир Попукайло... in R (язык программирования)
Alexey Seleznev
На скорую руку слепил превьюху, спасибо, сейчас поправлю
👍
источник

IS

Ivan Struzhkov in R (язык программирования)
Все добра!
Скажите - а чем делать лемитизацию? была библа от яндекса - но не обновленная к R 4.0
Есть рекомендации?
источник

БА

Байкулов Антон... in R (язык программирования)
Ребята, есть вопрос: А какой библиотекой можно проанализировать две фразы и оценить совпадают ли в них слова?
источник

БА

Байкулов Антон... in R (язык программирования)
Типо "коновал" и "конь" - совпадают на 67%
источник