You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 00:35:18