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

如何编写循环实现逐月扩展样本的ARMA(1,1)模型估算与样本外预测?

逐月扩展样本拟合ARMA(1,1)的循环实现

当然可以实现这种逐月滚动扩展样本的需求!下面我以R语言为例(你提到的arma()函数一般来自tseries包),给你一步步演示怎么写循环,同时保存每个模型的输出和关键结果:

1. 准备工作与数据加载

首先确保你加载了需要的包,并且数据是合适的格式(比如时间序列或普通数值向量):

# 加载tseries包(包含arma函数)
library(tseries)

# 示例用内置月度时间序列AirPassengers,替换成你自己的数据即可
data(AirPassengers)
your_data <- AirPassengers

# 设置初始最小样本量:ARMA(1,1)至少需要几个观测?
# 理论上只要样本数>参数个数(2个),但实际建议用足够的初始样本(比如12个月,覆盖一个完整周期)
min_sample_size <- 12

# 获取数据总观测数
total_observations <- length(your_data)

2. 创建存储结果的容器

为了避免每次循环覆盖模型结果,我们用列表保存每个完整模型,同时可以用向量单独存储系数、预测值等:

# 空列表:保存每个ARMA(1,1)模型
arma_model_list <- list()

# 空向量:保存每个模型的AR系数、MA系数(可选,方便后续分析)
ar_coefficients <- numeric()
ma_coefficients <- numeric()

# 空向量:保存样本外1步预测值(可选)
one_step_predictions <- numeric()

3. 编写循环:逐月扩展样本并拟合模型

循环从初始最小样本量开始,每次新增一个月的数据,拟合模型并保存结果:

# 循环范围:从最小样本量到总观测数-1(最后一次用前n-1个数据预测第n个)
for (i in min_sample_size:(total_observations - 1)) {
  # 截取当前样本:从第1个观测到第i个观测
  current_sample <- your_data[1:i]
  
  # 拟合ARMA(1,1)模型
  current_model <- arma(current_sample, order = c(1, 1))
  
  # 保存模型到列表
  arma_model_list[[i - min_sample_size + 1]] <- current_model
  
  # 提取并保存AR、MA系数
  ar_coefficients[i - min_sample_size + 1] <- current_model$coef[1]
  ma_coefficients[i - min_sample_size + 1] <- current_model$coef[2]
  
  # 生成样本外1步预测(预测下一个月的数据)
  pred_result <- predict(current_model, n.ahead = 1)
  one_step_predictions[i - min_sample_size + 1] <- pred_result$pred[1]
}

4. 处理模型不收敛的情况(可选)

有时候某些样本段可能会出现模型拟合失败(比如不收敛),可以用tryCatch跳过错误并记录:

for (i in min_sample_size:(total_observations - 1)) {
  current_sample <- your_data[1:i]
  
  tryCatch({
    current_model <- arma(current_sample, order = c(1, 1))
    arma_model_list[[i - min_sample_size + 1]] <- current_model
    ar_coefficients[i - min_sample_size + 1] <- current_model$coef[1]
    ma_coefficients[i - min_sample_size + 1] <- current_model$coef[2]
    pred_result <- predict(current_model, n.ahead = 1)
    one_step_predictions[i - min_sample_size + 1] <- pred_result$pred[1]
  }, error = function(e) {
    # 打印错误信息,方便排查
    message(paste("拟合样本量为", i, "的模型时出错:", e$message))
    # 用NA标记失败的结果
    arma_model_list[[i - min_sample_size + 1]] <- NA
    ar_coefficients[i - min_sample_size + 1] <- NA
    ma_coefficients[i - min_sample_size + 1] <- NA
    one_step_predictions[i - min_sample_size + 1] <- NA
  })
}

5. 查看结果

你可以通过索引查看某个特定模型的细节,比如:

# 查看第5次循环拟合的模型(对应样本量为12+5-1=16)
arma_model_list[[5]]

# 查看所有AR系数的变化趋势
plot(ar_coefficients, type = "l", xlab = "循环次数", ylab = "AR(1)系数")

内容的提问来源于stack exchange,提问作者meghna

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:23:04