我试图获取一个具有不同变量的数据框,并对这些变量的每种组合运行一个线性模型,以测试样本内和样本外变量选择标准。
我最近在这里(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”中预选择变量!