R 包 caret 提供了一个方便的函数 createFolds ,它返回用于交叉验证的训练集索引列表:

set.seed(1)
require(caret)
x <- rnorm(10)
createFolds(x,k=5,returnTrain=TRUE)

$Fold1
[1]  1  2  5  6  7  8  9 10

$Fold2
[1]  1  3  4  5  6  8  9 10

$Fold3
[1]  1  2  3  4  5  7  8 10

$Fold4
[1] 1 2 3 4 6 7 8 9

$Fold5
[1]  2  3  4  5  6  7  9 10

我想创建一个类似的函数,但我想返回要在 time-series cross validation 中使用的索引列表。我找到了一些 example code in R ,但我想对事物进行更多的概括和功能化。这是我最初想到的:
createTSfolds <- function(y, Min=max(frequency(y),3)) {
    i <- seq(along=y)
    stops <- i[Min:(length(i)-1)]
    starts <- rep(1,length(stops))
    out <- mapply(seq,starts,stops)
    names(out) <- paste("Fold", gsub(" ", "0", format(seq(along = out))), sep = "")
    out
}
createTSfolds(x)

$Fold1
[1] 1 2 3

$Fold2
[1] 1 2 3 4

$Fold3
[1] 1 2 3 4 5

$Fold4
[1] 1 2 3 4 5 6

$Fold5
[1] 1 2 3 4 5 6 7

$Fold6
[1] 1 2 3 4 5 6 7 8

$Fold7
[1] 1 2 3 4 5 6 7 8 9

(Min 是拟合模型所需的最少观察次数)

该函数目前运行良好,但我想添加 Rob Hyndman discusses 的 2 个函数:
  • Windowing:而不是将训练集扩展回第一个
    观察,它向回延伸 n 个观察。
  • 可变预测范围:不是每次折叠向训练集添加 1 个索引,而是每次折叠向训练集添加 k。

  • 这是我实现窗口的方式:
    createTSfolds <- function(y, Min=max(frequency(y),3), lookback=NA) {
        i <- seq(along=y)
        stops <- i[Min:(length(i)-1)]
        if (is.na(lookback)) {
            starts <- as.list(rep(1,length(stops)))
            out <- mapply(seq,starts,stops)
        } else {
            starts <- stops-Min+1
            out <- mapply(seq,starts,stops)
            out <- split(t(out),1:nrow(t(out)))
        }
        names(out) <- paste("Fold", gsub(" ", "0", format(seq(along = out))), sep = "")
        out
    }
    createTSfolds(x,Min=4,lookback=4)
    

    我不知道如何实现可变预测范围,它看起来像这样:
    例如,如果 k=3:
    $Fold1
    [1] 1 2 3
    
    $Fold2
    [1] 1 2 3 4 5 6
    
    $Fold3
    [1] 1 2 3 4 5 6 7 8 9
    

    我正在寻找改进现有代码的方法,以及在每次折叠时向训练集添加变量增量的方法。

    谢谢

    最佳答案

    这是一种方法。它并不完全可靠,因为当 lookbackk 都存在时,我不确定您寻求的输出。如果这就是您要找的,请告诉我。

     createTSfolds2 <- function(y, Min = max(frequency(y), 3), lookback = NA, k = NA){
       out = llply(Min:(length(y) - 1), seq)
       if (!is.na(k)) {out = out[seq(1, length(out), k)]}
       if (!is.na(lookback)) {
         out = plyr::llply(out, function(z) z[(length(z) - lookback + 1):length(z)])
       }
       names(out) <- paste("Fold", gsub(" ", "0", format(seq(along = out))), sep = "")
       return(out)
     }
    
    createTSfolds2(x, Min = 3, lookback = NA, k = 3)
    
    $Fold1
    [1] 1 2 3
    
    $Fold2
    [1] 1 2 3 4 5 6
    
    $Fold3
    [1] 1 2 3 4 5 6 7 8 9
    
    createTSfolds2(x, Min = 3, lookback = 3, k = 3)
    
    $Fold1
    [1] 1 2 3
    
    $Fold2
    [1] 4 5 6
    
    $Fold3
    [1] 7 8 9
    

    关于r - 使用时间序列交叉验证模仿 createFolds,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7667295/

    10-12 19:51