使用ARIMA函数进行预测与反变换
我有这个数据集(来自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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。