Как перестать бояться и полюбить R. Часть 4. Установка Stan и rethinking
В моей обзорной серии про байесовскую статистику [1] мы говорили о том, что для получения марковских цепочек Монте-Карло MCMC [2] существует два инструмента JAGS и Stan. В тех статьях мы полагались на JAGS, а сегодня мы разберемся с тем, как работать со Stan.
Stan - это современная платформа для статистического моделирования и высокопроизводительных статистических вычислений [3]. Принцип работы Stan такой же как у JAGS, мы должны вручную определять модель используя довольно своеобразную нотацию. Такой подход даёт максимальную свободу, но требует усилий. Вместо этого мы будем работать с библиотекой rethinking [4], которая упрощает взаимодействие со Stan.
Первое, что понадобится сделать – это установить набор инструментов, используемый для сборки пакетов R из исходного кода RTools [5]. Скачиваем инсталлятор, устанавливаем с настройками по умолчанию.
После установки нам нужно будет внести изменения в системную переменную PATH. Открываем Start >> Edit system environment variables (или Win + R и вводим systempropertiesadvanced).
Добавляем две новые переменные, как это показано на скриншоте:
C:\rtools43\usr\bin C:\rtools43\mingw64\bin
Если вы следовали инструкциям по умолчанию, то у вас должны быть такие же пути, как у меня, вы всегда можете проверить это самостоятельно в проводнике.
Переходим в R. Наверняка вы помните, как я говорил, что большая часть библиотек размещена на CRAN [6]. Большая – это не все. Многие библиотеки живут за пределами CRAN, к примеру, на GitHub. Для того, чтобы получать к ним доступ нам потребуется установить библиотеку devtools
, а после мы установим Stan.
#Устанавливаем и подключаем devtools install.packages(“devtools”) library(devtools) #Скачиваем и устанавливаем Stan devtools::install_github("stan-dev/cmdstanr") library(cmdstanr) cmdstanr::check_cmdstan_toolchain(fix = TRUE) install_cmdstan()
Ричард МакЭлрит [7] – автор выдающейся книги Statistical Rethinking ("Статистическое переосмысление"), про которую я уже упоминал не раз [8] и буду говорить и дальше, также разработчик библиотеки rethinking
[4], которая позволяет удобно работать со Stan. При этом в составе библиотеки более широкий функционал, чем только работа с MCMC.
Установим rethinking
и другие библиотеки, которые понадобятся дальше для работы в байесовском фреймворке.
install.packages(c("coda","mvtnorm","loo","dagitty","shape")) devtools::install_github("rmcelreath/rethinking")
Настало время построить нашу первую байесовскую модель используя rethinking
и Stan. Для этого мы воспользуемся функцией ulam
, названной в честь Станислава Улама [9], одного из основоположников MCMC.
Предположим, что мы хотим проверить гипотезу о том, какой стаж характерен для сотрудников нашей компании. Пусть наши априорные представления будут равны среднему стажу в 30 месяцев и стандартному отклонению в 5 месяцев.
# Подключаем библиотеку rethinking library(rethinking) # Сгенирируем данные с помощью нормального распределения и запишем результат в датафрейм df <- rnorm(1000, 24, 6) |> as.data.frame() colnames(df) <- "tenure" # Определим модель model <- ulam( alist( tenure ~ dnorm(mu, sigma), # используем нормальное распределение для расчёта апостериорного распределения с параметрами mu и sigma mu ~ dnorm(30, 5), # наше априорное представление о стаже sigma ~ dexp(1) # наше априорное представление о вариативности в популяции. Используем экспоненциальное распределение с 1, как неопределённое представление. ), data = df, # датафрейм с данными chains = 4, # количество цепочек MCMC, которые считаются в параллели cores = 4, # количество ядер процессора, которые используем для параллельных вычислений iter = 2000, # число итераций по расчёту MCMC warmup = 1000 # сколько итераций закладываем на «разогрев» модели )
Про модели мы ещё будем говорить подробнее в будущем, поэтому не переживайте, если вам не понятно. Расчёт цепочек MCMC потребует какого-то времени, в зависимости от производительности вашей машины.
На двух из трех компьютеров, на которых я устанавливал все требуемые ресурсы, при запуске расчёта модели я получал ошибку про OneDrive. Не знаю, как это лечить правильно, но если вы столкнулись с таким же, то просто удалите ярлык OneDrive из документов.
# Пример ошибки с OneDrive Exit status: 2 Stderr: make: *** /c/Users/{myusername}/OneDrive: Is a directory. Stop.
После окончания расчёта мы можем посмотреть на результат модели.
precis(model) mean sd 5.5% 94.5% n_eff Rhat4 mu 24.51 0.19 24.18 24.82 2589 1 sigma 6.14 0.14 5.93 6.37 2411 1
Итак, модель нам говорит, что апостериорное среднее = 24.5 и стандартное отклонение = 6 с узкими 89% доверительным интервалом (credible interval).
- Ботвин А. Байесовский фреймворк и HR задачи. Часть 3 – MCMC
- https://ru.wikipedia.org/wiki/Марковская_цепь_Монте-Карло
- https://mc-stan.org/
- https://github.com/rmcelreath/rethinking
- https://cran.r-project.org/bin/windows/Rtools/rtools43/rtools.html
- https://cran.r-project.org/
- https://ru.wikipedia.org/wiki/Макэлрит_Ричард
- https://t.me/h0h1_hr_analytics/137
- https://ru.wikipedia.org/wiki/Улам_Станислав