Пакет rmen (Russian Macroeconomic Nowcasting) предназначен для прогнозирования в реальном времени показателей российской экономики с помощью методов машинного обучения. База данных для предсказаний создается и регулярно обновляется с помощью пакета rmedb. Пользователь может выбрать любой подходящий для регрессии метод машинного обучения из доступных в пакете caret (см. список доступных моделей) или создать собственный метод (см. руководство по созданию метода).

Установка

Установите R, Rstudio и вспомогательный пакет devtools так, как это описано в руководстве \link[rmedb]{User Guide}. Если devtools успешно установлен, скачайте архив r params$archive_name и распакуйте его.

Установите пакет rmedb с помощью функции install_local из пакета devtools (в R для обращения напрямую к функциям пакета используется ::), в аргументе path указав путь к файлу r params$tar_gz_archive_name, который находится в распакованном архиве:

devtools::install_local(path = "C:/PATH/TO/TAR.GZ")

Для пользователей Windows: В R при разделении имён директорий используется /

Если вы устанавливаете пакет из Rstudio, вам предложат скачать или обновить пакеты, неоходимые для работы. Подтвердите обновления в соответствии с текстом на экране.

После выполнения кода в случае успешной установки пакета вы получите в выводе консоли примерно следующие строки (возможно, вы найдете эти строки не в самом конце вывода):

```{eval=FALSE} building package indices testing if installed package can be loaded from temporary location arch - i386 arch - x64 testing if installed package can be loaded from final location arch - i386 arch - x64 testing if installed package keeps a record of temporary installation path * DONE (rmen)

# Пример использования

Создание прогноза происходит в несколько шагов.
На первом шаге необходимо создать объект класса `nowcast`. Предположим, что нашей целью является предсказание реального ВВП в текущем квартале. В качестве предикторов будут использоваться индекс промышленного производства и безработица. Начнем с того, что найдем тикеры в пакете `rmedb` для используемых переменных. Используем поиск в таблице в `Rstudio`:
```r
View(rmedb::show.variables())

Тикеры реального ВВП, ИПП и безработицы - это gdp_real, ipi, unemployment соответственно. Используя найденные тикеры, создадим объект класса nowcast с помощью функции new. Для предсказаний мы будем использовать метод случайного леса (rf в пакете caret).

library(rmen)
gdp_nowcast <- new("nowcast", # название класса, неизменно
    target = "gdp_real", # тикер целевой переменной (ВВП)
    name = "GDP Nowcast with Random Forest", # пользовательское
                                            # название прогноза
    start_date = "2000-01-01", # дата, наблюдения ранее которой не будут
    # использоваться (можно использовать только формат "YYYY-mm-dd")
    nowcast_date = Sys.Date(), # дата, относительно которой строится прогноз -
    # сегодняшний день (в настоящий момент функционал,
    # связанный с этим параметров, не полный,
    # поэтому не рекомендуется изменять дефолтное значение)
    oos_test = FALSE,# нужно ли делать тестовый out-of-sample прогноз (можно будет получить оценку качества прогноза, но время расчетов будет сильно увеличено)
    test_start_date = "2015-01-01", # если oos_test=TRUE, используется как дата, начиная с которой составляется тестовая выборка
    horizon = 1, # горизонт прогнозирования в единицах времени,
    # которые соответствуют периодичности целевой переменной
    # (для реального ВВП - кварталы). Если последнее доступное наблюдение относится к периоду
    # t, то прогнозируется значение в периоде времени t+horizon.

    target_deseason = "logdiff", # способ удаления сезонности
    # у целевой переменной. В настоящее время поддерживается три типа:
    # level (без удаления сезонности),
    # diff (разность к соответствующему периоду прошлого года),
    # logdiff (разность логарифмов к соответствующему периоду прошлого года)

    predictors =  list(# list, состоящий из list для каждого предиктора
      list(
      ticker = "ipi",# тикер ИПП
  lag = 0, # количество используемых лагов
  deseason = "logdiff"),# способ удаления сезонности
  list(
      ticker = "unemployment", # тикер безработицы
  lag = c(0,1), # количdevество используемых лагов
  deseason = "diff"# способ удаления сезонности
    )
  ),methods = # list, состоящий  из list для каждого метода
    list( # внутри list для специфического метода должно быть 4 элемента:
      # name, train, trControl, tunegrid.
      # Подробно про содержание трех последних элементов
      # смотрите документацию пакета caret

      list(name="RF", # пользовательское название метода
    train=list(method ="rf", # аргументы, передаваемые в функцию train пакета caret
       tuneLength=4, 
    metric = "RMSE"),
    trControl= list("method" = "repeatedcv", # аргументы,
                    # передаваемые в функцию trControl пакета caret
    number= 2,
    repeats= 2,
    search= "random"),
    tungerid=list("mtry" = c(1,3) # аргументы, 
                  # передаваемые в функцию tunegrid пакета caret
   ))
    )
    )

Применим к созданному объекту метод collect.data, который получит из базы данных пакета rmedb данные в соответствии с указанной спецификацией. В результате в созданном объекте появятся три новых элемента: X, yи dates (обратиться к ним можно через \@). Посмотрим на собранные данные.

gdp_nowcast <- collect.data(gdp_nowcast)
print(head(gdp_nowcast@X))
print(head(gdp_nowcast@y))
print(head(gdp_nowcast@dates))

Убедившись, что данные успешно собраны, применим метод fit для обучения модели случайного леса.

gdp_nowcast <-fit(gdp_nowcast)

Посмотрим на обученную модель (результаты обучения каждой модели доступны для детального анализа при желании):

print(gdp_nowcast@fit)

Посмотрим на полученное предсказание:

print(gdp_nowcast@pred)

Сохранение аргументов в JSON

При регулярном обновлении прогнозов может быть удобно сделать список аргументов отдельно от скрипта, в котором они используются. Для этого подходит формат JSON (Java Script Object Notation). Внутри файла с расширением .json находится object (аналог словаря в Python), ограниченный фигурными скобками. Внутри object находятся элементы с именем. Имя и элемент разделяются :, разные элементы разделяются ,. Имя элемента всегда является строковой переменной и записывается в кавычках. Помимо строк, элементами могут быть числа, логические значения, вложенные object и массивы (array), которые состоят из однородных элементов без имен: ```{eval=FALSE} {"ticker":"cpi", "value":4.5, "date":"2021-08-21", "num_array":[ 2,3,6,4.7 ], "logical_array":[ true,false,true ], "one_elem_array":["str_value"], "nested_list":{"name":"value"} }

Конфигурация методов прогнозирования может быть сохранена и отредактирована в таком формате. Для работы с JSON подойдет как блокнот, так и [онлайн-редактор](https://jsoneditoronline.org/). 

Редактируя JSON, вы можете добавить изменить любые аргументы, добавить новые методы прогнозирования, способы кросс-валидации или расширить список предикторов, а после сохранить JSON-файл отдельно для проведения экспериментов. Чтобы запустить процесс прогнозирования, воспользуйтесь функцией `run.from.json`, указав `input` - путь к JSON-файлу.




```r
run.from.json(input = "examples/cpi_example.json")

Результом ее выполнения будет list такой же длины, какую имеет объект первого уровня внутри JSON-файла (в нашем примере это 1). Внутри list будут находиться объекты класса nowcast, содержашие в себе использованные данные (@X), результаты обучения моделей (@fit) и полученые прогнозы (@pred). Вы можете сохранить результаты, прописав путь к файлу с расширением .Rda или .RData:

run.from.json(input = "examples/cpi_example.json", output = "examples/example_out.Rda")

а после прочитать сохраненный файл внутри R: (он станет доступен как list под именем result)

load("examples/example_out.Rda")
print(result[[1]]@pred)

или записать полученные прогнозы в виде .csv:

export.nowcast.to.csv(input="examples/example_out.Rda", output = "examples/prediction.csv")
print(read.csv("examples/prediction.csv"))

В файле examples/full_model.json, собраны спецификации для обучения моделей по 27 ключевым переменным. Можно получить и сохранить предсказания для всех переменных с помощью функции run.from.json (процесс обучения займет много времени):

load("examples/full_model.json", 
     output = "full_model_out.Rda")


mkhlgrv/rmen documentation built on Dec. 21, 2021, 7:06 p.m.