Пакет 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 (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")
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.