如何在R中循环生成模型并解包传入model函数?
在R中循环生成TSLM模型并批量传入fpp3的model函数
问题核心
你尝试循环生成不同K值的TSLM模型并批量拟合,但之前的代码存在两个关键问题:
- 直接将字符串传入
TSLM(),未转换为公式对象 - 未正确使用列表解包方法将命名模型列表传入
model()函数
修正后的实现代码
1. 加载依赖与数据
library(fpp3) library(rlang) # 用于!!!解包,可选但推荐 # 准备数据 gas <- us_gasoline %>% filter(year(Week) <= 2004)
2. 循环生成命名模型列表
这里提供两种写法,效果一致:
写法1:for循环(直观)
mods <- list() for (i in 1:9) { # 将字符串转换为公式对象 model_formula <- as.formula(paste0("Barrels ~ trend() + fourier(K = ", i, ")")) # 为模型命名(和手动定义格式一致,如fourier1、fourier2) mods[[paste0("fourier", i)]] <- TSLM(model_formula) }
写法2:purrr函数式编程(简洁)
mods <- purrr::map(1:9, function(k) { model_formula <- as.formula(paste0("Barrels ~ trend() + fourier(K = ", k, ")")) TSLM(model_formula) }) %>% setNames(paste0("fourier", 1:9)) # 批量设置模型名称
3. 批量拟合模型
提供两种解包方式,任选其一即可:
方式1:!!!解包(tidyverse风格,推荐)
fit <- gas %>% model(!!!mods)
方式2:do.call(基础R写法)
# 需将data作为第一个参数,与模型列表合并后传入 fit <- do.call(model, c(list(data = gas), mods))
验证结果
可以用以下代码查看所有模型的拟合摘要:
fit %>% glance()
内容的提问来源于stack exchange,提问作者jj_coder
相关产品推荐
相关产品推荐

