Расчет ошибки выборки для всех возможных подмножеств - PullRequest
0 голосов
/ 07 декабря 2018

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

Недавно я попросил помощи здесь ( Запустите линейную модель с набором переменных ) и разработал следующий код.Сначала я запускаю набор переменных моих переменных, затем запускаю линейные модели со всеми возможными комбинациями и рассчитываю прогнозирование MAE и RMSE на один шаг вперед за последние 12 месяцев.Наконец, я создаю индекс критериев с комбинацией AIC, BIC (оба в выборке), MAE и RMSE.

Код отлично работает для небольшого числа переменных, но когда я добавил лаги (так что теперь у меня было 10 переменных - каждая лага была добавлена ​​в мои данные CSV в качестве другой переменной), это заняло слишком много времени, чтобыбеги и в итоге я его остановил (я ждал один час).Имеет смысл, так как он должен выполнить около 13 тыс. Регрессий (поскольку он запускает 1000 различных комбинаций переменных плюс 12-шаговые прогнозы для вычислений MAE и RMSE).

Мой вопрос сейчас заключается в том, как я могу предварительно выбрать элементы из блока питания, чтобы я мог сузить его до 100-200 комбинаций переменных, прежде чем запускать результаты.Другим возможным решением было бы вычисление MAE и RMSE с запуском регрессии в течение 12 периодов.Я также открыт для разных решений!

names <- c("Var1", "Var2", "Var3", ... "Var10") #10 variables + 3 seasonal dummies that are added later 

vars <- ggm::powerset(names, sort = TRUE, nonempty = TRUE)

results <- data.frame(AIC_lm_fit =  vector("numeric"), 
                  BIC_lm_fit = vector("numeric"),
                  MAE_lm_fit = vector("numeric"),
                  RMSE_lm_fit = vector("numeric"),
                  model = vector("character"))


for (j in 1:length(vars)){
  lm_fit <- lm(livres ~ ., data = cp[,c("livres", "dq1", "dq2", "dq3", 
   vars[[j]])])

e <- vector("numeric")
 for(teste in 1:12){
    fim0 <- nrow(cp)-teste
    fim1<-fim0+1
    fim2<-fim1+1
    fim3<-nrow(cp)

    cp1<-cp[1:fim0,]
   # attach(as.data.frame(cp1)) -> removed
    cp2<- cp_exp[fim1:fim2,]
   # attach(as.data.frame(cp2)) ->remved

     lm_fit <- lm(livres ~ ., data = as.data.frame(cp1[,c("livres", "dq1", "dq2", "dq3", vars[[j]])]))

    fc <- forecast(lm_fit, newdata = as.data.frame(cp2[,c("dq1", "dq2", "dq3", vars[[j]])]))
    e[teste] <- fc$mean[1] - cp[fim3, "livres"]
}

  results <- rbind(results,
               data.frame(AIC_lm_fit =  AIC(lm_fit),
                          BIC_lm_fit = BIC(lm_fit),
                          MAE_lm_fit = sqrt(mean(e^2)),
                          RMSE_lm_fit = mean(abs(e)),
                          model = toString(vars[[j]])))
 }

attach(results)
results$criteria <- (0.15*(AIC_lm_fit-min(AIC_lm_fit))/sqrt(var(AIC_lm_fit)) 
   + (0.15*(BIC_lm_fit-min(BIC_lm_fit))/sqrt(var(BIC_lm_fit))
   + 0.35*((RMSE_lm_fit - RMSE_lm_fit)/sqrt(var(RMSE_lm_fit))) 
   + 0.35*((MAE_lm_fit - min(MAE_lm_fit))/sqrt(var(MAE_lm_fit))))) 

Редактировать: я удалил функцию присоединения изнутри for (), и теперь она работает намного быстрее.Но я все еще хотел бы знать, как я могу предварительно выбрать переменные из моего вектора "vars", если кто-нибудь может помочь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...