假设我有 N 个训练集都放在一个名为 dat 的列表中:
dat <- map(tscv$train, ~subset(data, select = .x))
此外,对于每个训练集,我使用 glmnet 运行套索。对于每个训练集,我使用了 100 个 lambda 值。对于每个训练集,我有 100 个不同的变量子集,通过以下方式获得:
selected <- map(dat, ~coef.glmnet(glmnet(.x[ , names(Xlagged)],
.x[ , "errs"], alpha = 1, lambda = lambdas)))
“选定”是列表列表。例如,
selected$Training1930$s0
将返回特定训练集 (Training1930) 和特定正则化参数 ("s0") 的最佳变量子集列表。现在,我想从训练集列表 (dat) 中选择最好的变量子集。
我试过以下方法:
dat |> map(~subset(.x, select = map_depth(selected, 2, ~.)))
返回错误如下:
其中的错误(!as.logical(j)): 不能强制“列表”对象键入“逻辑”
此外,我尝试编写一个函数,它适用于特定的训练集和 lambda:
a <- function(nom, s){
return(dat[[nom]][, selected[[nom]][[s]]])
}
mylist <- list()
for(s in names(selected$Training1638)) {
mylist[[s]] <- print(map(names(dat), ~a(.x, s)))
}
上面的代码似乎解决了我的问题。但是,我不想使用 for 循环。还有其他解决方法吗?
可重现代码:
tscv <- list()
tscv[["train"]] <- list()
tscv[["train"]][["Training1"]] <- c(1,2,3,4)
tscv[["train"]][["Training2"]] <- c(1,2,3,4,5)
set.seed(1)
full_data <- data.frame(replicate(10,rnorm(10)))
dat <- map(tscv$train, ~full_data[.x, ])
# Lasso selected features for each train set for 10 different lambdas:
selected = list(list(list()))
for (i in paste("s", 1:10, sep = "")) {
selected[["Training1"]][[i]] <- sample(paste("X", 1:10, sep = ""), 3, rep = TRUE)
selected[["Training2"]][[i]] <- sample(paste("X", 1:10, sep = ""), 3, rep = TRUE)
}
目的是对每个训练集进行子集化(Training1和Training 2) 根据基于每个 lambda 的套索选择变量:
dat |> map(~subset(.x, select = map_depth(selected, 2, ~.)))
x[j] 中的错误:无效的下标类型 'list'
a <- function(nom, s){
return(dat[[nom]][, selected[[nom]][[s]]])
}
# The code below solves my problem and works ok, but I want to avoid for loop:
mylist <- list()
for(s in names(selected$Training1)) {
mylist[[s]] <- map(names(dat), ~a(.x, s))
}