问题描述
我正在尝试在 R 中同时执行多个弹性网络。我有一个 10x15 的矩阵,每列称为 Xi,例如X1,X2,...,X15 并执行弹性网络以获得最优的 alpha
和 lambda
参数。然后我将 alpha
值保存在我的环境中名为 alphas
的数据框中,如下所示
alpha
1 0.001
2 0.000
3 0.000
4 0.064
5 0.729
6 0.729
7 1.000
8 0.001
9 0.000
10 0.000
11 0.001
12 0.000
13 0.000
14 0.064
15 0.729
我的目标是使用我已经找到的相应 alpha 执行多个 cv.glmnet
(每个 Xi 一个)。例如将 alpha=0.001
用于 Xi 等的 cv.glmnet
模型。如何替换以下代码中的 alpha 值以使用所有获得的 alpha 值?
data<-matrix(rnorm(36),nrow=10,ncol = 15)
colnames(data) <- c("X1","X2","X3","X4","X5","X6","X7","X8","X9","X10","X11","X12","X13","X14","X15")
data #random data
library(glmnet)
library(coefplot)
A <- as.matrix(data)
set.seed(1234)
results <- lapply(seq_len(ncol(A)),function(i) {
list(
cvfit = cv.glmnet(A[,-i],A[,i],standardize = TRUE,type.measure = "mse",nfolds = 10,alpha = 1)
)
})
解决方法
如果我们想做多个集合,使用相同的列索引序列来对alpha进行子集,因为alphaset的length
与matrix
的列数相同 'A'
alphaset <- c( 0.001,0.064,0.729,1.0,0.001,0.729)
lst_out <- lapply(seq_len(ncol(A)),function(i) {
list(
cvfit = cv.glmnet(A[,-i],A[,i],standardize = TRUE,type.measure = "mse",nfolds = 10,alpha = alphaset[i])
)
})
,
另一种选择是使用 for
循环。
alpha <- c(0.001,0.000,1.000,0.729)
cvfit <- vector("list",length(alpha))
names(cvfit) <- paste0("cvfit for alpha=",alpha)
for(k in 1:length(alpha))
for(i in 1:ncol(A))
cvfit[[k]][[i]] <- list(cv.glmnet(A[,alpha = alpha[k]))