Поезд модели временных рядов в карете по группе - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть набор данных, подобный следующему

set.seed(503)
foo <- data.table(group = rep(LETTERS[1:6], 150),
                  y  = rnorm(n = 6 * 150, mean = 5, sd = 2),
                  x1 = rnorm(n = 6 * 150, mean = 5, sd = 10),
                  x2 = rnorm(n = 6 * 150, mean = 25, sd = 10),
                  x3 = rnorm(n = 6 * 150, mean = 50, sd = 10),
                  x4 = rnorm(n = 6 * 150, mean = 0.5, sd = 10),
                  x5 = sample(c(1, 0), size = 6 * 150, replace = T))

foo[, period := 1:.N, by = group]

Проблема: я хочу прогнозировать y на шаг вперед, для каждого group, используя переменные x1, ..., x5

Я хочу запустить несколько моделей в caret, чтобы решить, какую из них я буду использовать.

На данный момент, я запускаю его в цикле, используя временной интервал

window.length <- 115
timecontrol   <- trainControl(method          = 'timeslice',
                            initialWindow     = window.length,
                            horizon           = 1, 
                            selectionFunction = "best",
                            fixedWindow       = TRUE, 
                            savePredictions   = 'final')

model_list <- list()
for(g in unique(foo$group)){
  for(model in c("xgbTree", "earth", "cubist")){
    dat <- foo[group == g][, c('group', 'period') := NULL]
    model_list[[g]][[model]] <- train(y ~ . - 1,
                                      data = dat,
                                      method = model, 
                                      trControl = timecontrol)

  }
}

Тем не менее, я хотел бы запустить все группы одновременно, используя фиктивные переменные для идентификации каждой, как

dat <- cbind(foo,  model.matrix(~ group- 1, foo))
            y         x1       x2       x3            x4 x5 period groupA groupB groupC groupD groupE groupF
  1: 5.710250 11.9615460 22.62916 31.04790 -4.821331e-04  1      1      1      0      0      0      0      0
  2: 3.442213  8.6558983 32.41881 45.70801  3.255423e-01  1      1      0      1      0      0      0      0
  3: 3.485286  7.7295448 21.99022 56.42133  8.668391e+00  1      1      0      0      1      0      0      0
  4: 9.659601  0.9166456 30.34609 55.72661 -7.666063e+00  1      1      0      0      0      1      0      0
  5: 5.567950  3.0306864 22.07813 52.21099  5.377153e-01  1      1      0      0      0      0      1      0

Но все еще выполняется временной ряд с правильным порядком времени, используя timeslice.

Есть ли способ объявить переменную time в trainControl, поэтому мой прогноз one step ahead использует в этом случае еще шесть наблюдений для каждого раунда и отбрасывает первые 6 наблюдений?

Я могу сделать это, упорядочив данные и связавшись с аргументом horizon (учитывая n групп, упорядочьте по переменной времени и положите horizon = n), но это должно измениться, если количество групп изменится. И initial.window должно быть time * n_groups

timecontrol   <- trainControl(method          = 'timeslice',
                            initialWindow     = window.length * length(unique(foo$group)),
                            horizon           = length(unique(foo$group)), 
                            selectionFunction = "best",
                            fixedWindow       = TRUE, 
                            savePredictions   = 'final')

Есть ли другой путь?

...