计算所有可能子集的样本外误差

时间:2018-12-06 21:51:49

标签: r model linear-regression data-modeling powerset

我试图获取一个具有不同变量的数据框,并对这些变量的每种组合运行一个线性模型,以测试样本内和样本外变量选择标准。

我最近在这里(Run linear model in a powerset of variables)寻求帮助,并开发了以下代码。首先,我运行变量的幂集,然后运行具有所有可能组合的线性模型,并计算MAE和RMSE预测,在过去12个月中领先一步。最后,我结合AIC,BIC(均在样本中),MAE和RMSE来创建标准索引。

代码对于少量变量可以正常工作,但是当我添加滞后(所以我现在有10个变量-每个滞后作为不同的变量添加到我的csv数据中)时,它花了太长时间运行,最终我停止了(我等了一个小时)。这是有道理的,因为它必须运行约13k的回归(因为它运行1000个不同的变量组合以及12个针对MAE和RMSE计算的提前预测)。

我现在的问题是如何从功率集中预选元素,因此在运行结果之前,可以将其范围缩小到100-200个变量组合。另一个可能的解决方案是使用回归运行12个周期来计算MAE和RMSE。我也欢迎其他解决方案!

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()内部删除了attach函数,现在它的运行速度更快。但是我仍然想知道如果有人可以帮助的话,如何从向量“ vars”中预选择变量!

0 个答案:

没有答案