Использование R

Многие примеры и статьи на этом сайте активно используют язык программирования «R».

R для Windows можно скачать отсюда. Устанавливать R рекомендуется в корневой каталог, что-нибудь типа «C:\R\».

R для Mac находится на этой странице.

R для Linux обычно можно установить используя репозитории вашего дистрибутива. Я пользуюсь Debian-based дистрибутивами, в которых стандартная команда для установки R выглядит так:

sudo apt install r-base

Набирать это нужно в терминале.

Прелесть R заключается в следующем:

  1. Эта программа бесплатна (распространяется под лицензией GPL),
  2. Под эту программу написано много пакетов для решения большого спектра задач. Все они так же бесплатны.
  3. Программа очень гибкая: размеры любых векторов и матриц могут изменяться по желанию пользователя, данные не имеют жёсткую структуру. Это свойство оказывается крайне полезным в случае с прогнозированием, когда исследователю нужно дать прогноз на произвольный срок.

Последнее свойство особенно актуально, так как другие статистические пакеты (такие как SPSS, Eviews, Stata) предполагают, что нас может интересовать только анализ данных, которые имеют фиксированную структуру (например, все данные в рабочем файле должны быть одинаковой периодичности с одинаковыми датами начала и конца).

Впрочем, R — это не самая дружелюбная программа. На время работы с ней забудьте про мышку — практически все самые важные действия в ней выполняются с использованием командной строки. Однако для того чтобы сделать жизнь чуть легче, а саму программу чуть более приветливой, есть программа-frontend (внешний интерфейс) под названием RStudio. Скачать её можно отсюда. Устанавливается она после того, как уже установлен сам R. В RStudio много удобных инструментов и приятный интерфейс, тем не менее анализ и прогнозирование в нём всё так же осуществляются с использованием командной строки.

Давайте попробуем взглянуть на эту замечательную программу.

Знакомство с RStudio

Интерфейс RStudio выглядит следующим образом:

Общий вид RStudio

Общий вид RStudio

В правом верхнем углу в RStudio указано имя проекта (которое пока что у нас «None» — то есть отсутствует). Если нажать на эту надпись и выбрать «New Project» (новый проект), то нам предложат создать проект. Для базовых целей прогнозирования достаточно выбрать «New Directory» (новая папка для проекта), «Empty Project» (пустой проект), а затем — ввести название проекта и выбрать директорию, в которой его сохранить. Включите воображение и попробуйте придумать название сами :).

Работая с одним проектом, вы всегда сможете обратиться к сохранённым в нём данным, командам и скриптам.

В левой части окна RStudio располагается консоль. Именно в неё мы и будем вписывать различные команды. Например, напишем следующую:

x <- rnorm(100,0,1)

Эта команда сгенерирует 100 случайных величин из нормального распределения с нулевым математическим ожиданием и единичной дисперсией, после чего создаст вектор под названием «x» и запишет полученные 100 величин в него. Символ «<-» эквивалентен символу «=» и показывает какое значение присвоить нашей переменной, стоящей слева. Иногда вместо него удобней использовать символ «->», правда наша переменная в таком случае должна стоять справа. Например, следующий код создаст объект «y» абсолютно идентичный объекту «x»:

x -> y

Эти векторы теперь появились в правой верхней части экрана, под закладкой, которая у меня озаглавлена «Environment»:

Изменения в закладке "Environment"

Изменения в закладке "Environment"

В этой части экрана будут отображаться все объекты, которые мы сохраняем во время сессии. Например, если мы создадим такую вот матрицу:

\( A = \begin{pmatrix} 1 & 1 \\ 0 & 1 \end{pmatrix} \)

такой вот командой:

A <- matrix(c(1,0,1,1),2,2)

то она появится в закладке «Environment»:

Матрица. Появление.

Матрица. Появление.

Любая функция, которую мы используем, требует, чтобы мы задали некоторые значения определённым параметрам. В функции matrix() есть следующие параметры:

  • data – вектор с данными, который должен быть записан в матрицу,
  • nrow – число строк в матрице,
  • ncol – число столбцов в матрице,
  • byrow — логический параметр. Если «TRUE» (истина), то наполнение матрицы будет осуществляться по строкам (слева направо, строка за строкой). По умолчанию этот параметр имеет значение «FALSE» (ложь),
  • dimnames — лист с именами строк и столбцов.

Некоторые из этих параметров имеют значения по умолчанию (например, byrow=FALSE), в то время как другие могут быть опущены (например, dimnames).

Одна из фишек «R» заключается в том, что к любой функции (например, к нашей matrix()) можно обратиться, задавая значения на прямую:

A <- matrix(data=c(1,0,1,1),nrow=2,ncol=2)

а можно и так, как мы сделали это ранее — соблюдая последовательность и опуская названия параметров.

Для того, чтобы увидеть содержание любого объекта, находящегося в закладке «Environment», достаточно напечатать его название в консоли:

A

Другой вариант — это нажать на имя объекта в закладке «Environment».

Если вам нужно почитать подробней о какой-либо функции, можно воспользоваться следующей командой:

?matrix

где matrix — это название интересующей нас функции. RStudio специально для вас в таком случае откроет панель «Help» с описанием:

Матрица. Помощь

Матрица. Помощь

Найти помощь по функции можно так же, набрав название функции в окне «поиск» (иконка с линзой) в закладке «Help».

В случае, если вы не помните точно, как пишется название функции или какие в ней используются параметры, достаточно начать писать её название в консоли и нажать кнопку «Tab»:

Матрица. Помощь 2

Матрица. Помощь 2

Помимо всего этого в RStudio можно писать скрипты. Они могут понадобиться вам в том случае, если вам нужно написать программу либо вызвать последовательность функций. Создаются скрипты используя кнопку с плюсиком в верхнем левом углу (в выпадающем меню нужно выбрать «R Script»). В открывшемся после этого окне вы сможете писать любые функции и комментарии. Например, если мы хотим построить линейный график по ряду x, это можно сделать следующим образом:

plot(x)
lines(x)

Первая функция строит простейший точечный график, а вторая функция добавляет поверх точек линии, соединяющие точки последовательно. Если выделить эти две команды и нажать «Ctrl+Enter», то они будут выполнены, в результате чего RStudio откроет закладку «Plot» в правом нижнем углу и отобразит в ней построенный график.

Простейший график в RStudio

Простейший график в RStudio

Если все набранные команды нам ещё понадобятся в будущем, то этот скрипт можно сохранить (дискетка в левом верхнем углу).

В случае, если вам нужно обратиться к команде, которую вы уже набирали когда-то в прошлом, в правой верхней части экрана есть закладка «History». В ней можно найти и выбрать любую интересующую вас команду и двойным нажатием вставить её в консоль. В самой консоли можно обращаться к предыдущим командам, используя кнопки «Up» (вверх) и «Down» (вниз) на клавиатуре. Сочетание клавиш «Ctrl+Up» позволяет в консоли показать список всех последних команд.

Вообще в RStudio много всяких полезных сочетаний клавиш, которые значительно облегчают работу с программой. Подробней о них можно почитать тут.

Как я уже упомянул ранее для R существует множество пакетов. Все они расположены на сервере CRAN и для установки любого из них нужно знать его название. Установка и обновление пакетов осуществляется с помощью закладки «Packages». Перейдя на неё и нажав на кнопку «Install», мы увидим примерно следующее меню:

Установка пакетов в RStudio

Установка пакетов в RStudio

Наберём в открывшемся окне: forecast - это пакет, написанный Робом Хайндманом (Rob J. Hyndman), содержащий кучу полезных для нас функций. Нажмём кнопку «Install» (установить), после чего пакет «forecast» будет установлен.

Как вариант мы можем установить любой пакет, зная его название, с помощью команды в консоли:

install.packages("smooth")

при условии, что он, конечно же, есть в репозитории CRAN. smooth - это пакет, функции в котором разрабатываю и поддерживаю я.

Некоторые пакеты доступны только в исходных кодах на сайтах типа github.com и требуют, чтобы их перед этим собрали. Для сборки пакетов под Windows может понадобиться программа Rtools.

Чтобы использовать какой-либо из установленных пакетов, его нужно подключить. Для этого его надо найти в списке и отметить галочкой либо использовать команду в консоли:

library(forecast)

В Windows может проявиться одна неприятная проблема: некоторые пакет легко скачиваются и собираются, но ни в какую не устанавливаются. R в этом случае пишет что-то типа: "Warning: unable to move temporary installation...". Всё, что нужно сделать в этом случае - добавить папку с R в исключения в антивирусе (либо выключить его на время установки пакетов).

После загрузки пакета, нам будут доступны все входящие в него функции. Например, функция tsdisplay(), использовать которую можно так:

tsdisplay(x)

Она построит нам три графика, которые мы обсудим в главе «Инструментарий прогнозиста».

Помимо пакета forecast я достаточно часто для различных примеров использую пакет Mcomp. Он содержит ряды данных из базы «M-Competition». Поэтому рекомендую вам его тоже установить.

Очень часто нам будут нужны не просто наборы данных, а данные класса «ts» (временной ряд). Для того, чтобы из любой переменной сделать временной ряд, нужно выполнить следующую команду:

x <- ts(x,start=c(1984,1),frequency=12)

Здесь параметр start позволяет указать дату, с которого начинается наш временной ряд, а frequency задать частоту данных. Число 12 в нашем примере указывает на то, что мы имеем дело с месячными данными. В результате выполнения этой команды мы трансформируем наш вектор «x» во временной ряд месячных данных, начинающийся с января 1984-го года.

Это основные элементы R и RStudio, которые нам понадобятся.

P.S. Журнал "Хакер" опубликовал неплохую статью о работе с R. Рекомендую к прочтению.

P.P.S. Достаточно хорошее руководство по R опубликовано на сайте QSAR4U Павлом Полищуком.

P.P.P.S. Много информации об R представлено на официальном сайте.

P.P.P.P.S. А ещё на сайте Coursera есть курсы по R.

Самостоятельная работа

А вот вам задания для самостоятельного выполнения в R. Выполните следующие команды, посмотрите, что получится и попробуйте понять, почему так получилось:

(41/3 + 78/4)*2
2^3+4
1/0
0/0
max(1,min(-2,5),max(2,pi))
sqrt(3^2+4^2)
exp(2)+3i
log(1024)
log(1024, base=2)
c(1:3)
c(1:5)*2 + 4
x <- 10 + c(1:10)*0.5 + rnorm(10,0,2)
x
mean(x)
var(x)
x <- ts(x,start=c(2010,2),frequency=4)

Comments (15):

  1. Иван, здравствуйте.

    Подскажите как использовать в качестве исходного источника временного ряда данные из csv файла в котором две колонки Дата и Количество. Допустим я импортировал файл в R Studio под именем TS1, затем пишу следующий код:
    TS1<-ts(TS1, frequency = 1, start = c(2017,1,1) )
    После этого кода у меня получается временной ряд в котором остается колонка количество, а колонка Дата просто нумеруется от 2017 до конца набора записей, почему не преобразует в запись вида
    01.01.2017
    02.01.2017
    03.01.2017
    ……….
    ?

    • Приветствую!

      Для того, чтобы даты из первой колонки преобразовались в требуемый формат, нужно использовать пакет xts и поразбираться с тем, как работать с функцией xts() — в помоще в R есть толковые примеры.

      Что касается ts(), то она работает несколько иначе. frequency=1 означает, что у нас годовые данные, а start использует только первые два элемента вектора. Кроме того start=c(2017,1) по сути означает февраль 2017 — расчёт там начинается с нуля. То есть ts(TS1, frequency=365, start=c(2017,0)) преобразует TS1 в матрицу ts, в которой будет что-то типа дневных данных, начинающихся с 1 января 2017. Но к первой колонке в матрице это не будет иметь никакого отношения.

      Как-то так.

  2. Всё славно, уважаемый Иван Сергеевич. Но, скачав forecast, написанный Робом Хайндманом, я столкнулся с проблемой. Ввожу
    > tsdisplay(x)
    и получаю:
    Error in tsdisplay(x) : could not find function «tsdisplay»
    И что?
    Статья даёт хорошее введение, но где продолжение банкета?

    • Глубокоуважаемый Сергей Геннадьевич,
      Убедитесь, пожалуйста, в том, что пакет Роба подключён. Для этого нужно набрать:
      library(forecast)

      К сожалению, это надо набирать каждый раз как вы начинаете работу с R.

      Надеюсь, это решит проблему.

  3. Иван Сергеевич, это другое дело! Графики получилось и всё чудесно.
    Включить программу можно, как я понял, и в правой нижней части окна в разделе «Files», поставив галочку, как Вы и учили. И я уже расслабился, но…
    Но в разделе «Packages» я не нашёл пакета «Mcomp» и закачать его не смог. Это первое.
    Второе — как мне узнать те методы и модели, которые зашиты в пакете Роба и других пакетах? Должна же быть какая-то подсказка или гид по этим программам!
    Или ответы на все эти вопросы я должен найти на Курсере?

    • Для того, чтобы посмотреть на доступные функции, можно либо нажать на название пакета в закладке «packages», либо набрать в консоле название пакета с вопросительным знаком перед ним. Например, для пакета «forecast»:
      ?forecast

      У некоторых пакетов есть так же дополнительная документация, которая доступна на сайте CRAN (но до неё иногда бывает тяжело добраться). Например, вот документация по пакету smooth: https://cran.r-project.org/web/packages/smooth/vignettes/smooth.html
      По пакету forecast доступно следующее: https://cran.r-project.org/web/packages/forecast/vignettes/JSS2008.html

  4. Был неправ, погорячился, вспылил.
    Пакет нашёлся и закачался.

  5. Добрый день, Иван!

    Подскажите, пожалуйста, как работает функция forecast Роба Хайндмана на основе ARIMA модели? Изначально мне казалось, что прогноз строится как условное мат. ожидание по оцененным коэффициентам AR-части. Буду признателен, если подскажете где можно почитать о работе этой функции в пакете (ссылка https://cran.r-project.org/web/packages/forecast/vignettes/JSS2008.html недоступна, pdf-мануал (https://cran.r-project.org/web/packages/forecast/forecast.pdf) не содержит нужной информации. Заранее спасибо!

    • Здравствуйте, Сергей Владимирович!

      Точно не знаю, как это сделано, но, думаю, на основе классической методологии Бокса-Дженкинса. Вообще auto.arima() использует функцию arima() из пакета stats, так что надо копать в эту сторону (можно, например, начать с документации функции https://stat.ethz.ch/R-manual/R-devel/library/stats/html/arima.html ).

  6. Как работает auto.arima понятно (строил отдельно собственную функцию, подбирающую модель по Боксу-Дженкинсу — результаты схожи). Вопрос какой алгоритм зашит в функцию forecast (в Вашем пакете smooth используете эту функцию:{«forecast.smooth {smooth}. R Documentation. Forecasting time series using smooth functions. Description. This function is created in order for the package to be compatible with Rob Hyndman’s «forecast» package})? Потому что прогноз на период t+1 строится не как: y^hat_(t+1) = E(y_(t+1) | y_(t)).

    • Вообще, forecast() — это не функция, а метод. Надо анализировать функцию forecast.Arima() из пакета Роба. Я не знаю, как это сделано у него, надо лезть в код (вот он: https://github.com/robjhyndman/forecast/blob/master/R/arima.R ). У меня это сделано на основе модели пространства состояний, но там свои особенности…
      Но вообще, прогноз на шаг вперёд должен учитывать не только AR, но и MA, так как прошлые ошибки на такой горизонт обычно ещё доступны.

  7. Иван, здравствуйте!
    После проведения всех операций по инструкции возникает следующая проблема: R не видит ни одной из функций из установленного пакета.

    package ‘forecast’ successfully unpacked and MD5 sums checked

    The downloaded binary packages are in
    C:\Users\NIKITA\AppData\Local\Temp\RtmpsfWMst\downloaded_packages
    > library (forecast)
    package ‘forecast’ is in use
    Далее пытаюсь использовать функцию для построения прогноза :

    Ошибка в forecast.lm(lm(y ~ t + I(t^2), data = df), data.frame(t = c(17, :
    не могу найти функцию «forecast.lm»

    Подскажите, с чем может быть связано и как можно попробовать решить?

    • В продолжение: пытался последовать совету по переносу zip файла из временного хранилища во второй адрес по функции libpaths, не помогло

    • Здравствуйте, Никита!

      forecast.lm() — это метод, и я не уверен, что он реализован в пакете forecast. Возможно, вам нужна функция predict(). Как вариант, попробуйте использовать forecast(), без lm на конце — возможно, метод по умолчанию справится с задачей.

      Альтернатива — попробуйте использовать tslm() из пакета forecast — она позволяет добавлять тренды.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *