如何使用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无法在预测阶段自动生成外生变量的滞后项。正确处理步骤:
- 提前在原始数据集中创建滞后外生变量的新列,而非在模型公式中直接调用
lag() - 构造预测用的
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
相关产品推荐
相关产品推荐

