在R中参数化命名对象实现按INDEX分组运行forecast库时间序列模型
R语言分组运行时间序列模型的实现方案
方法1:for循环生成带INDEX后缀的独立对象(完全匹配你的命名需求)
直接通过assign()函数动态生成带对应序号后缀的对象,代码如下:
# 加载必要包 library(forecast) # 遍历INDEX 1到10 for (i in 1:10) { # 筛选当前分组数据 ts_obj <- dataset[dataset$INDEX == i, ] ts_obj <- ts(ts_obj$y, frequency = 12) n_obj <- length(ts_obj) # 拆分训练集测试集 train_obj <- ts(ts_obj[1:(n_obj - 12)], frequency = 12) test_obj <- ts_obj[(n_obj - 11):n_obj] # 模型预测+计算准确率 for_obj <- forecast(train_obj, model = arima, h = 12) acc_obj <- accuracy(for_obj, test_obj) # 动态生成带后缀的对象存入全局环境 assign(paste0("ts_", i), ts_obj) assign(paste0("n_", i), n_obj) assign(paste0("train_", i), train_obj) assign(paste0("test_", i), test_obj) assign(paste0("for_", i), for_obj) assign(paste0("acc_", i), acc_obj) }
运行完成后你就可以直接调用ts_1、for_5、acc_10这类对象使用。
方法2:列表存储方案(更推荐)
生成大量零散独立对象后续调用、批量处理时效率很低,更建议将结果统一存在列表中,代码如下:
library(forecast) # 初始化空列表存储结果 ts_list <- list() train_list <- list() test_list <- list() for_list <- list() acc_list <- list() for (i in 1:10) { ts_list[[i]] <- dataset[dataset$INDEX == i, ] ts_list[[i]] <- ts(ts_list[[i]]$y, frequency = 12) n <- length(ts_list[[i]]) train_list[[i]] <- ts(ts_list[[i]][1:(n - 12)], frequency = 12) test_list[[i]] <- ts_list[[i]][(n - 11):n] for_list[[i]] <- forecast(train_list[[i]], model = arima, h = 12) acc_list[[i]] <- accuracy(for_list[[i]], test_list[[i]]) } # 调用示例:取INDEX=3的准确率结果 acc_list[[3]]
注意事项
- 如果你用的是自动选择最优阶数的ARIMA模型,将代码里的
model = arima替换为model = auto.arima即可 - 运行前请确保你的
dataset中存在名为INDEX的列,且取值覆盖1到10的整数
内容的提问来源于stack exchange,提问作者Jaqen79
相关产品推荐
相关产品推荐

