[英]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.