问题描述
我正在尝试在 R 中同时为多个变量执行弹性网络。我有 15 个 Xi,我想找到使用每个变量作为回归量的弹性网络模型。对于一个 Xi,我可以执行
遵循并获得最优的 alpha
和 lambda
与以下
A<-matrix(rnorm(36),nrow=10,ncol = 15)
colnames(A) <- c("X1","X2","X3","X4","X5","X6","X7","X8","X9","X10","X11","X12","X13","X14","X15")
A #random data
library(glmnetUtils)
library(glmnet)
library(coefplot)
set.seed(1234)
# Train model.
fit <- cva.glmnet(X1 ~ .,data=A)
# Get alpha.
get_alpha <- function(fit) {
alpha <- fit$alpha
error <- sapply(fit$modlist,function(mod) {min(mod$cvm)})
alpha[which.min(error)]
}
# Get all parameters.
get_model_params <- function(fit) {
alpha <- fit$alpha
lambdamin <- sapply(fit$modlist,`[[`,"lambda.min")
error <- sapply(fit$modlist,function(mod) {min(mod$cvm)})
best <- which.min(error)
data.frame(alpha = alpha[best],lambdamin = lambdamin[best])
}
get_model_params(fit)
我想对所有 Xi 同时执行此过程,并能够创建 2 个包含 a.所有最优min.lambda
,b。所有最优 alpha
,以及一个包含使用最优 alpha
和 min.lambda
生成的系数的列表。有人可以帮我做吗?
解决方法
您需要在所有行组合上循环该函数:
loop <- function(data) {
#make an output dataframe
output <- as.data.frame(matrix(NA,nrow = ncol(data),ncol = 2))
colnames(output) <- c('alpha','lambdaMin')
#loop over each column
for(i in 1:ncol(data)) {
fit <- cva.glmnet(data[,-i],data[,i])
#set the ith row to be the output
output[i,] = get_model_params(fit)
}
output
}
loop(A)
我们使用 glmnet
的 x,y 输入而不是公式接口,并使用 data[,i]
和 data[,-i]
对每列进行子集化。