Включение априорной информации в Ridge Regression (RAPM) в R

Я сейчас использую R glmnetпакет для запуска взвешенной регрессии гребня на хоккейных данных. У меня есть разреженная матрица с фиктивными переменными, обозначающими, находится ли игрок на льду, играя в атаке или защите в данную смену, в дополнение к нескольким другим прогнозирующим факторам, таким как преимущество дома на льду. У меня есть вектор весов, который представляет собой длину каждой смены. Моя целевая переменная - это вектор скоростей выстрелов в заданную смену.

В glmnet звонок выглядит следующим образом:

glmnet(y = shot_rates, x = dummy_matrix, weights = shift_length, lambda = previously_obtained_lambda)

(Лямбда получается путем перекрестной проверки того же набора данных, что также выполняется с помощью glmnet.)

На данный момент распределение полностью гауссово, и каждая переменная-предиктор смещена в сторону нуля. Я хочу включить предварительную информацию (предыдущие средства) для каждой фиктивной переменной и, возможно, установить отдельные значения лямбда для каждой из них, но я не уверен, как я это делаю. Я считаю, что могу использовать штрафные факторы, чтобы настроить лямбды для каждой переменной, чтобы мы могли отложить это на время и сосредоточиться на предыдущих средствах.

Я изучил использование bayesglmpackage и реализация Prior.means, но у меня две проблемы с ним: он медленный сам по себе и не принимает разреженные матрицы, что значительно замедляет работу. Для справки, моя матрица фиктивных переменных содержит примерно 600000 строк и примерно 2000 столбцов.

Как я могу эффективно использовать предыдущие средства в моем анализе? Спасибо заранее за любые предложения.

1 ответ

Хорошо, поэтому, исходя из комментария, кажется, что в принципе байесовский подход вас устраивает, и это единственный известный мне способ, чтобы упорядочивающие априорные значения не были сосредоточены на 0. Вы также упомянули, что скорость была проблемой, поэтому я бы рекомендуют подбирать модель с использованием Стэна, который обычно намного быстрее, чем другие байесовские методы. Кроме того, у brms и Stan есть прекрасная документация, которая намного полезнее, чем та, которую вы обычно находите для других статистических пакетов в R.

brms это очень полезный пакет, который позволяет устанавливать модели Stan в lme4-подобный синтаксис.

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

model_priors <- c(
  prior(normal(0, 5), class = "Intercept"),
  prior(normal(0, 1), class = "b")
)

Этот код ставит априор нормального распределения со средним значением 0 с sd 5 для incercept, а также с априорным значением 0 и sd 1 для каждого коэффициента бета. Если вы хотите, чтобы каждый бета-коэффициент имел свой собственный априор, вы можете указать его следующим образом:

model_priors <- c(
  prior(normal(0, 5), class = "Intercept"),
  prior(normal(0.5, 1), class = "b", coef = "first_predictor"),
  prior(normal(-0.5, 1), class = "b", coef = "second_predictor")
)

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

Затем вы можете включить эти приоры в модель примерно так

modelfit <- brm(
  formula = outcome_variable ~ first_predictor + second_predictor, 
  data = df,
  prior = model_priors,
)
Другие вопросы по тегам