Я пытаюсь получить кадр данных с разными переменными и запустить линейную модель для каждой комбинации этих переменных, проверяя критерии выбора переменных в выборке и вне выборки.
Недавно я попросил помощи здесь ( Запустите линейную модель с набором переменных ) и разработал следующий код.Сначала я запускаю набор переменных моих переменных, затем запускаю линейные модели со всеми возможными комбинациями и рассчитываю прогнозирование 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", если кто-нибудь может помочь!