循环运行Arima模型后,如何将MAE结果合并为单个数据框?
解决循环计算MAE并合并为数据框的问题
首先看你的原代码,核心问题是你虽然初始化了alladvancedfit数据框,但循环里并没有把每次计算的MAE结果存储进去——每次循环只是覆盖了inSampleAdvancedFitMAE这个变量,最后自然只保留了最后一次的计算值。下面给你三种可行的修正方案,每种都能帮你把7个MAE结果整合到同一个数据框里:
方案一:直接给预初始化的数据框赋值
这种方式最贴合你原本的思路,利用已经创建好的7行数据框,通过循环索引定位行来存储结果:
AllModel <- AllData[c(2:8)] alladvancedfit <- data.frame(matrix(, nrow=7, ncol=1)) # 给列命名,让结果更易读 colnames(alladvancedfit) <- "MAE" # 用索引循环,同时定位数据框的行 for (i in seq_along(AllModel)) { Model <- AllModel[[i]] advancedfit.model <- Arima(AllData$x1, order=c(0,1,2), xreg=Model) alladvancedfit[i, "MAE"] <- mean(abs(advancedfit.model$residuals)) } # 给行添加变量名(对应v1-v7),方便对应每个变量的MAE rownames(alladvancedfit) <- colnames(AllModel)
方案二:先收集到向量再转数据框
如果不想提前初始化数据框,也可以先把所有MAE结果存到一个向量里,循环结束后再转换成结构化的数据框:
AllModel <- AllData[c(2:8)] mae_vector <- c() for (Model in AllModel) { advancedfit.model <- Arima(AllData$x1, order=c(0,1,2), xreg=Model) mae_val <- mean(abs(advancedfit.model$residuals)) mae_vector <- c(mae_vector, mae_val) } # 转换成带变量名的完整数据框 alladvancedfit <- data.frame( Variable = colnames(AllModel), MAE = mae_vector, row.names = NULL )
方案三:正确使用rbind合并
你之前尝试rbind失败,大概率是因为直接把单个数值和数据框合并了——rbind要求合并的对象结构一致。只要把每次的MAE包装成单行数据框,就能正常合并:
AllModel <- AllData[c(2:8)] alladvancedfit <- data.frame() for (Model in AllModel) { advancedfit.model <- Arima(AllData$x1, order=c(0,1,2), xreg=Model) mae_val <- mean(abs(advancedfit.model$residuals)) # 把单个MAE值包装成一行的数据框再合并 alladvancedfit <- rbind(alladvancedfit, data.frame(MAE = mae_val)) } rownames(alladvancedfit) <- colnames(AllModel)
注意:这种
rbind循环的方式在数据量很大时效率偏低,小数据集用没问题,大数据集更推荐前两种方案。
运行任意一种代码后,你都会得到类似这样的结构化结果:
| Variable | MAE |
|---|---|
| v1 | 61.01004 |
| v2 | 61.23916 |
| v3 | 60.78099 |
| v4 | 61.15394 |
| v5 | 61.16968 |
| v6 | 61.30191 |
| v7 | 61.00637 |
内容的提问来源于stack exchange,提问作者aua
相关产品推荐
相关产品推荐

