Я пытаюсь выполнить Elastic Net в R для нескольких переменных одновременно. У меня есть 15 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
, б. все оптимальные 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)
Мы используем ввод x, y для glmnet
вместо интерфейса формулы и используем data[,i]
и data[,-i]
для подмножества каждого столбца.
см. редактирование - возвращение кадра данных альфы и лямбдамина
Кажется, это дало результаты, есть ли способ создать фрейм данных, содержащий только значения
alpha
?