R语言循环创建带命名Arima模型变量报错及解决方案咨询
嘿,我来帮你搞定这个问题~你遇到的报错是因为在R里直接把paste生成的字符串当作变量名来赋值是行不通的,R没法识别这种形式的赋值目标。下面给你两种可行的解决办法,其中第二种更推荐哦:
方案1:用assign函数创建命名变量
R里有个专门的assign()函数,可以通过字符串来创建并赋值变量。另外你要注意,原来用paste()生成的变量名会带有空格(比如"M 0 0 0"),这在R里是不合法的变量名,所以得用paste0()或者paste(..., sep="")来生成无空格的合法名称。修正后的代码如下:
# 生成参数组合 a <- c(0,1,2,3,4) b <- c(0,1,2,3,4) c <- c(0,1,2,3,4) comb <- expand.grid(a, b,c) # 定义Arima非季节性参数(改成向量更简洁直观) arima_order <- c(2,1,4) # 循环创建变量 c.n_vars <- nrow(comb) for (i in 1:c.n_vars) { # 生成合法的变量名,无空格 var_name <- paste0("M", comb[i,1], comb[i,2], comb[i,3]) # 使用assign创建变量并赋值模型 assign(var_name, Arima(y, order = arima_order, seasonal = list(order = c(comb[i,1], comb[i,2], comb[i,3]), period = 12))) }
运行这段代码后,你就能在全局环境里找到M000、M100这类命名的变量了,每个变量对应一个ARIMA模型。
方案2:用列表存储模型(更推荐)
在R里,管理多个同类对象(比如一堆ARIMA模型),用列表比散落在环境里的单个变量要方便得多——你可以批量操作所有模型(比如提取AIC、批量预测),还不会污染全局环境。具体代码如下:
# 生成参数组合 a <- c(0,1,2,3,4) b <- c(0,1,2,3,4) c <- c(0,1,2,3,4) comb <- expand.grid(a, b,c) # 定义Arima非季节性参数 arima_order <- c(2,1,4) # 创建空列表用于存储所有模型 arima_models <- list() # 循环填充列表,用模型名作为列表元素的名称 for (i in 1:nrow(comb)) { model_name <- paste0("M", comb[i,1], comb[i,2], comb[i,3]) arima_models[[model_name]] <- Arima(y, order = arima_order, seasonal = list(order = c(comb[i,1], comb[i,2], comb[i,3]), period = 12)) }
之后要调用某个模型的话,直接用arima_models[["M000"]]或者arima_models$M000就行。如果要批量提取所有模型的AIC,只需要一行代码:
sapply(arima_models, function(model) model$aic)
是不是比一个个变量去操作高效很多?
内容的提问来源于stack exchange,提问作者redondo
相关产品推荐
相关产品推荐

