提问人:entropy 提问时间:3/27/2023 最后编辑:entropy 更新时间:3/27/2023 访问量:33
在 R 中使用 map() 函数的特定交叉验证过程?
Specific cross-validation procedure using map() function in R?
问:
假设我有 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”) 的最佳变量子集列表。现在,我想从训练集 (dat) 列表中选择最佳变量子集。selected$Training1930$s0
我尝试了以下方法:
dat |> map(~subset(.x, select = map_depth(selected, 2, ~.)))
它返回错误,如下所示:
其中错误(!as.logical(j)): 不能强制“list”对象键入“logical”
此外,我尝试编写一个函数,该函数适用于特定的训练集和 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)
}
目的是对每个训练集(训练 1 和训练 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))
}
答: 暂无答案
上一个:需要嵌套列表中的唯一嵌套列表
评论
select
subset
map_depth(selected, 2, ~.)
select/subset