我对 glmnet 中的标准化感到非常困惑。
我有 500 个变量(化学品),每个变量都有 3 个估计水平,这意味着我实际上在数据集中有 1500 个变量(X)。现在我想排除对结果(Y)没有重要作用的化学物质,所以我使用 glmnet 来选择它们。
我正在训练我的数据并尝试按如下方式应用 glmnet:
a <- seq(0.1,0.9,0.05)
search <- foreach(i=a, .combine = rbind, .packages = 'glmnet') %dopar%{
cv <- cv.glmnet(mdlX, mdlY, family = 'binomial', nfold = 10, type.measure = 'auc', parallel = TRUE, alpha = i, standardize = TRUE)
data.frame(cvm = cv$cvm[cv$lambda == cv$lambda.min], lambda.min = cv$lambda.min, alpha = i)}
cv3 <- search[search$cvm == min(search$cvm),]
md3 <- glmnet(mdlX, mdlY, family = 'binomial', alpha = cv3$alpha, lambda = cv3$lambda.min, standardize = TRUE)
我读到默认值是standardize = TRUE
if family = 'gaussian'
,所以我将它添加到我的代码中。但随后,表明系数将按原始比例返回。
所以我的问题是:
如果变量(化学品)有不同的单位,我还应该Scale(X)
在standardize = TRUE
cv.glmnet 和 glmnet 中做些什么?因为最后,我用它来通过变量包含概率来选择我需要的变量:
Result <- apply(coeff_df,2,function(x) {sum(x!=0)/5*100})
先感谢您!
(我也在Cross Validated上发帖,但如果违反规则,我会删除它!)