在R中为时间序列实现扩展窗口历史平均的技术问询
扩展窗口历史平均计算与样本内SSE差异改造
问题核心
你当前代码计算的是log_eqpt1列的全局平均,需改为递归/扩展窗口计算:每个时间点的历史平均仅使用从起始到该点的所有观测值,而非整体数据集的平均。以下是改造后的完整代码及关键说明:
改造后代码
# 1) 扩展窗口历史平均(HA Model) # 提取目标时间序列并限定样本内窗口 log_eqpt1_IS <- window(ts_monthly, start = c(1871,01), end = c(2021,12))[, "log_eqpt1"] # 方法1:基础R实现累积平均(无需额外包) # 计算累积和与有效观测的累积计数(自动跳过NA) cum_sum <- cumsum(log_eqpt1_IS, na.rm = TRUE) cum_valid <- cumsum(!is.na(log_eqpt1_IS)) # 仅在有有效观测时计算平均,避免0除错误 avg_recursive <- ifelse(cum_valid == 0, NA, cum_sum / cum_valid) # 方法2:dplyr简洁实现(推荐,代码更直观) # install.packages("dplyr") # 首次使用需安装 library(dplyr) avg_recursive <- cummean(log_eqpt1_IS) # 计算历史平均模型的样本内误差 IS_error_N <- log_eqpt1_IS - avg_recursive # 2) OLS模型残差(保持原逻辑,确保窗口匹配) IS_error_A <- window(model$residuals, start = c(1871,01), end = c(2021,12)) # 3) 计算累积SSE差异 # 同步处理NA,保证两序列长度一致 valid_idx <- complete.cases(IS_error_N, IS_error_A) IS <- cumsum(IS_error_N[valid_idx]^2) - cumsum(IS_error_A[valid_idx]^2)
关键说明
- 扩展窗口逻辑:
cummean(或cumsum/累积计数)会逐行计算从起始行到当前行的平均值,完美实现递归/扩展窗口的要求,效率远高于循环遍历。 - NA值处理:
- 基础R方法中用
cum_valid统计有效观测数,避免0除错误; - 最终计算累积SSE时,用
complete.cases同步过滤两序列的NA,保证长度一致。
- 基础R方法中用
- 窗口匹配:必须确保
log_eqpt1_IS和IS_error_A的时间窗口完全对齐,否则累积计算会出现维度不匹配的错误。
内容的提问来源于stack exchange,提问作者I59
相关产品推荐
相关产品推荐

