【问题标题】:Simultaneously elastic net regressions同时弹性净回归
【发布时间】:2021-04-01 12:38:54
【问题描述】:

我正在尝试在 R 中同时为多个变量执行 Elastic Net。我有 15 个 Xi,我想找到使用每个变量作为回归量的弹性网络模型。对于一个 Xi 我可以执行 跟随并获得最优的alphalambda如下

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,以及使用最优alphamin.lambda 生成的系数列表。有人可以帮我做吗?

【问题讨论】:

    标签: r loops apply glmnet regularized


    【解决方案1】:

    您需要在所有行组合上循环该函数:

    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] 对每一列进行子集化。

    【讨论】:

    • 这似乎产生了结果,有没有办法生成一个只包含 alpha 值的数据框?
    • 查看编辑 - 返回 alpha 和 lambdamin 的数据帧
    猜你喜欢
    • 2016-08-10
    • 2014-05-09
    • 2017-07-04
    • 2016-05-22
    • 1970-01-01
    • 2016-10-11
    • 1970-01-01
    • 1970-01-01
    • 2018-03-14
    相关资源
    最近更新 更多