簡體   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