Включение априорной информации в Ridge Regression (RAPM) в R
Я сейчас использую R
glmnet
пакет для запуска взвешенной регрессии гребня на хоккейных данных. У меня есть разреженная матрица с фиктивными переменными, обозначающими, находится ли игрок на льду, играя в атаке или защите в данную смену, в дополнение к нескольким другим прогнозирующим факторам, таким как преимущество дома на льду. У меня есть вектор весов, который представляет собой длину каждой смены. Моя целевая переменная - это вектор скоростей выстрелов в заданную смену.
В
glmnet
звонок выглядит следующим образом:
glmnet(y = shot_rates, x = dummy_matrix, weights = shift_length, lambda = previously_obtained_lambda)
(Лямбда получается путем перекрестной проверки того же набора данных, что также выполняется с помощью
glmnet
.)
На данный момент распределение полностью гауссово, и каждая переменная-предиктор смещена в сторону нуля. Я хочу включить предварительную информацию (предыдущие средства) для каждой фиктивной переменной и, возможно, установить отдельные значения лямбда для каждой из них, но я не уверен, как я это делаю. Я считаю, что могу использовать штрафные факторы, чтобы настроить лямбды для каждой переменной, чтобы мы могли отложить это на время и сосредоточиться на предыдущих средствах.
Я изучил использование
bayesglm
package и реализация 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,
)