在 R 中使用 map() 函数的特定交叉验证程序?

问题描述 投票:0回答:0

假设我有 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))
    }

r dictionary nested-lists
© www.soinside.com 2019 - 2024. All rights reserved.