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

如何使用fable::VAR结合滞后外部回归变量进行预测

问题:VAR模型带滞后外生变量预测时返回NA值

使用fable包的VAR()函数拟合包含滞后外生变量的模型时,拟合过程正常,但预测阶段因变量返回NA值。复现代码如下:

require(fpp3)
#> Loading required package: fpp3
#> ── Attaching packages ──────────────────────────────────────────── fpp3 0.4.0 ──
#> ✔ tibble      3.1.7      ✔ tsibble     1.0.1 
#> ✔ dplyr       1.0.9      ✔ tsibbledata 0.3.0 
#> ✔ tidyr       1.1.3      ✔ feasts      0.2.2 
#> ✔ lubridate   1.7.10     ✔ fable       0.3.1 
#> ✔ ggplot2     3.3.5
#> ── Conflicts ───────────────────────────────────────────────── fpp3_conflicts ──
#> ✖ lubridate::date()    masks base::date()
#> ✖ dplyr::filter()      masks stats::filter()
#> ✖ tsibble::intersect() masks base::intersect()
#> ✖ tsibble::interval()  masks lubridate::interval()
#> ✖ dplyr::lag()         masks stats::lag()
#> ✖ tsibble::setdiff()   masks base::setdiff()
#> ✖ tsibble::union()     masks base::union()

us_change <- fpp3::us_change

fit <- us_change %>%
  model(
    xregs_lag1 = VAR(vars(Consumption, Income) ~ xreg(Unemployment, lag(Unemployment, 1)))
  )

fit
#> # A mable: 1 x 1
#>         xregs_lag1
#>            <model>
#> 1 <VAR(5) w/ mean>

new_data_ex <- new_data(us_change, 4) %>% 
      mutate(Unemployment = mean(us_change$Unemployment)) 

fit %>%
  select(xregs_lag1) %>%
  forecast(new_data = new_data_ex)
#> # A fable: 4 x 6 [1Q]
#> # Key:     .model [1]
#>   .model     Quarter .distribution .mean_Consumption .mean_Income Unemployment
#>   <chr>        <qtr>        <dist>             <dbl>        <dbl>        <dbl>
#> 1 xregs_lag1 2019 Q3        MVN[2]                NA           NA      0.00101
#> 2 xregs_lag1 2019 Q4        MVN[2]                NA           NA      0.00101
#> 3 xregs_lag1 2020 Q1        MVN[2]                NA           NA      0.00101
#> 4 xregs_lag1 2020 Q2        MVN[2]                NA           NA      0.00101
解决方案

问题根源在于直接在xreg()中使用lag(Unemployment,1),fable无法在预测阶段自动生成外生变量的滞后项。正确处理步骤:

  1. 提前在原始数据集中创建滞后外生变量的新列,而非在模型公式中直接调用lag()
  2. 构造预测用的new_data时,基于历史数据最后一期的外生变量值,生成预测期的滞后外生变量值
修正后的代码
require(fpp3)

# 先在原始数据中创建滞后一期的失业数据列
us_change <- fpp3::us_change %>%
  mutate(lag_Unemployment = lag(Unemployment, 1))

# 建模时直接使用已生成的滞后列作为外生变量
fit <- us_change %>%
  model(
    xregs_lag1 = VAR(vars(Consumption, Income) ~ xreg(Unemployment, lag_Unemployment))
  )

# 构造预测数据:结合历史最后一期生成滞后项
last_hist <- us_change %>% tail(1) %>% select(Quarter, Unemployment, lag_Unemployment)
new_data_ex <- new_data(us_change, 4) %>% 
  mutate(Unemployment = mean(us_change$Unemployment)) %>%
  # 拼接历史最后一期数据,用于生成预测期的滞后项
  bind_rows(last_hist, .) %>%
  # 生成预测期的滞后失业数据:取上一期的失业值
  mutate(lag_Unemployment = lag(Unemployment, 1)) %>%
  # 仅保留需要预测的4期数据
  filter(Quarter > max(last_hist$Quarter))

# 执行预测
fit %>%
  select(xregs_lag1) %>%
  forecast(new_data = new_data_ex)

运行上述代码后,预测结果中的.mean_Consumption和.mean_Income将正常返回数值,不再是NA。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 18:16:05