繁体   English   中英

在 R 中将先验信息纳入岭回归 (RAPM)

[英]Incorporating Prior Information in a Ridge Regression (RAPM) in R

我目前正在使用 R 的glmnet package 对曲棍球数据进行加权岭回归。 我有一个带有虚拟变量的稀疏矩阵,除了一些其他预测变量(例如主场冰优势)之外,该矩阵表示球员在给定轮换中是在冰上进攻还是防守。 我有一个权重向量,它是每个班次的长度。 我的目标变量是在给定班次中发生的射速向量。

glmnet调用如下:

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

(Lambda 是通过对同一数据集的交叉验证获得的,这也是使用glmnet完成的。)

截至目前,分布完全是高斯分布,每个预测变量都偏向于均值为零。 我希望为每个虚拟变量合并先验信息(先验方法),并可能为每个虚拟变量设置单独的 lambda 值,但我不确定我是如何做到的。 我相信我可以使用penalty.factors 来调整每个变量的lambdas,这样我们就可以暂时把它放在一边,专注于之前的方法。

我已经研究过使用bayesglm package 并实现prior.means,但我的问题有两个:它很慢,它不接受稀疏矩阵,这使得事情变得非常慢。 作为参考,我的虚拟变量矩阵包含大约 600,000 行和大约 2,000 列。

我如何有效地将先前的手段纳入我的分析? 在此先感谢您的任何建议。

好的,所以根据评论,原则上贝叶斯方法似乎对你来说是可以的,这是我所知道的唯一让先验不以 0 为中心的正则化方法。你还提到速度是一个问题,这就是为什么我会建议使用 Stan 拟合 model,这通常比其他贝叶斯方法快得多。 此外,brms 和 Stan 拥有绝对精彩的文档,比您通常在 R 中找到的其他统计软件包有用得多。

brms是一个非常有用的 package ,它允许以lme4的语法拟合 Stan 模型。

brms中,可以为截距和每个自变量指定先验,如下所示:

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

这段代码将一个正态分布的先验放在了一个平均值为 0 和 sd 为 5 的 incercept 上,以及一个平均值为 0 和 sd 为 1 的每个 beta 系数上的先验。 如果您希望每个 beta 系数具有不同的先验,您可以像这样指定它:

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")
)

此代码更改为两个假设的 beta 系数中的每一个设置了特定的先验,请注意我是如何做到的,因此它们不再以 0 为中心。

然后,您可以将这些先验合并到 model 中,如下所示

modelfit <- brm(
  formula = outcome_variable ~ first_predictor + second_predictor, 
  data = df,
  prior = model_priors,
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM