使用ARIMA函数进行预测与反变换

编程语言 2026-07-10

我有这个数据集(来自https://fable.tidyVerts.org/index.html)

library(fpp3)

 google_stock <- gafa_stock |>
  filter(Symbol == "GOOG", year(Date) >= 2015) |>
  mutate(day = row_number()) |>
  update_tsibble(index = day, regular = TRUE)

google_2015 <- google_stock |> filter(year(Date) == 2015)

# A tsibble: 252 x 9 [1]
# Key:       Symbol [1]
   Symbol Date        Open  High   Low Close Adj_Close  Volume   day
   <chr>  <date>     <dbl> <dbl> <dbl> <dbl>     <dbl>   <dbl> <int>
 1 GOOG   2015-01-02  526.  528.  521.  522.      522. 1447600     1
 2 GOOG   2015-01-05  520.  521.  510.  511.      511. 2059800     2
 3 GOOG   2015-01-06  512.  513.  498.  499.      499. 2899900     3
 4 GOOG   2015-01-07  504.  504.  497.  498.      498. 2065100     4
 5 GOOG   2015-01-08  495.  501.  488.  500.      500. 3353600     5
 6 GOOG   2015-01-09  502.  502.  492.  493.      493. 2069400     6
 7 GOOG   2015-01-12  492.  493.  485.  490.      490. 2322400     7
 8 GOOG   2015-01-13  496.  500.  490.  493.      493. 2370500     8
 9 GOOG   2015-01-14  492.  500.  490.  498.      498. 2235700     9
10 GOOG   2015-01-15  503.  503.  495.  499.      499. 2715800    10
# ℹ 242 more rows

我想在High的对数上对Open变量进行差分,使用ARIMA函数,以便获得预测值。我们该如何在fable包中实现?以下是我的尝试

运行模型:

df<- google_2015 %>%  mutate(dOpen=difference(Open), pct = log(High))
fit <- df  %>% model(ARIMA(dOpen ~ pct)) 
report(fit)

Series: dOpen 
Model: LM w/ ARIMA(1,0,0) errors 

Coefficients:
          ar1     pct  intercept
      -0.1192  9.8387   -61.9926
s.e.   0.0628  5.0692    32.4505

sigma^2 estimated as 140.8:  log likelihood=-976.04
AIC=1960.09   AICc=1960.25   BIC=1974.21

预测:

Ndata <- new_data(df, 8) |>
  mutate(pct = mean(df$pct )) 

xd<-fit %>% forecast::forecast(Ndata) 

# A fable: 8 x 6 [1]
# Key:     Symbol, .model [1]
  Symbol .model              day        dOpen .mean   pct
  <chr>  <chr>             <dbl>       <dist> <dbl> <dbl>
1 GOOG   ARIMA(dOpen ~ pc…   253  N(2.2, 141) 2.22   6.40
2 GOOG   ARIMA(dOpen ~ pc…   254 N(0.82, 143) 0.822  6.40
3 GOOG   ARIMA(dOpen ~ pc…   255 N(0.99, 143) 0.989  6.40
4 GOOG   ARIMA(dOpen ~ pc…   256 N(0.97, 143) 0.969  6.40
5 GOOG   ARIMA(dOpen ~ pc…   257 N(0.97, 143) 0.971  6.40
6 GOOG   ARIMA(dOpen ~ pc…   258 N(0.97, 143) 0.971  6.40
7 GOOG   ARIMA(dOpen ~ pc…   259 N(0.97, 143) 0.971  6.40
8 GOOG   ARIMA(dOpen ~ pc…   260 N(0.97, 143) 0.971  6.40

我还不确定接下来该怎么做

解决方案

如果你想对未差分变量进行预测,你需要把差分放在模型的ARIMA部分,否则就没有办法还原差分。但差分会同时作用在回归方程的两边,由于你不想让自变量被差分,你需要使用累积和,使差分能够回到原始自变量。这利用了这样的事实:若z_t = x_1 + x_2 + ... + x_t,则z_t - z_{t-1} = x_t。

library(fpp3)
#> ── Attaching packages ──────────────────────────────────────────── fpp3 1.0.3 ──
#> ✔ tibble      3.3.1     ✔ tsibble     1.2.0
#> ✔ dplyr       1.2.1     ✔ tsibbledata 0.4.1
#> ✔ tidyr       1.3.2     ✔ ggtime      0.2.0
#> ✔ lubridate   1.9.5     ✔ feasts      0.5.0
#> ✔ ggplot2     4.0.2     ✔ fable       0.5.0
#> ── 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()

google_stock <- gafa_stock |>
  filter(Symbol == "GOOG", year(Date) >= 2015) |>
  mutate(day = row_number()) |>
  update_tsibble(index = day, regular = TRUE)

# Add cumulative log High
google_stock <- google_stock |>
  mutate(clh = cumsum(log(High)))

# Training data
google_2015 <- google_stock |>
  filter(year(Date) == 2015)

# Covariate values for forecasting
Ndata <- new_data(google_2015, 8) |>
  mutate(clh = tail(google_2015$clh, 1) + mean(log(google_2015$High)) * (1:8))

# Fit model with differencing
fit <- google_2015 |>
  model(ARIMA(Open ~ clh + pdq(d = 1)))
report(fit)
#> Series: Open 
#> Model: LM w/ ARIMA(0,1,1) errors 
#> 
#> Coefficients:
#>           ma1     clh  intercept
#>       -0.1137  9.7349   -61.3272
#> s.e.   0.0612  5.0444    32.2917
#> 
#> sigma^2 estimated as 141.5:  log likelihood=-976.13
#> AIC=1960.26   AICc=1960.42   BIC=1974.36

# Forecasts
fc <- forecast(fit, new_data = Ndata)
autoplot(fc, google_2015)

创建于2026-04-22,使用 reprex v2.1.1

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章