0

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

glmnet调用如下:

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

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

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

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

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

4

1 回答 1

0

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

brms是一个非常有用的包,它允许以类似的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 为中心。

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

modelfit <- brm(
  formula = outcome_variable ~ first_predictor + second_predictor, 
  data = df,
  prior = model_priors,
)
于 2020-11-26T23:28:38.243 回答