169 похожих чатов

Добрый день! Подскажите, пожалуйста. Пытаюсь сделать прогноз на скользящем окне,

на одну точку вперед. Как сделать циклом- придумал, но он работает очень медленно. Можно это как-то векторизовать?

 

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] сделать что-то более читаемое или и так считается норм?

5 ответов

9 просмотров

Завтра вам постараюсь дать пример. Я тоже строю десятки моделей (был кейс с сотнями и т.д.) с помощью подбора порядка модели в рамках auto.arima. Вещь нужная, но тяжелая. Тут векторизация может быть, если её писать на пониженном уровне абстракции. В самой либе такого нет... Векторизация работает на более примитивных операциях, где, просто, циклы написаны на более низком уровне (C, например, который в базе). Я использую параллельное исполнение (multi core). И ещё, есть нюансы с ограничениями по порядку модели, их надо указать, если хочется побыстрее. По поводу 2). Надо проверить (я не у компа) , но, выглядит так, что %>%$('mean') %>%[(1) подобное должно работать.

Попробуйте это: https://cran.r-project.org/web/packages/greybox/vignettes/ro.html

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

Dm Kb
arima - это по сути регрессия на лагах... хотя алг...

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

Igor Yegin
Регрессия на лагах — это AR, ARIMA сложнее описыва...

Да, конечно, там ещё регрессия на остатках и сезонность, но в любом случае это OLS

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
Карта сайта