基于TSLM的预测与回变换
我有这个数据集(来自 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
在使用时间序列线性模型(TSLM)预测时的附加数据管理:
df<-google_2015 %>%
mutate(lopen=log(Open), dl0pen= difference(log(Open),1), pct = log(High/ dplyr::lag(High))) %>%
as_tsibble(index=Date)
fit <- df %>% filter(Date< "2015-12-23") |> model(TSLM(dl0pen ~ pct))
report(fit)
us_change_future <- new_data(df%>% filter(Date< "2015-12-23") , 6) |>
mutate(df%>% filter(Date>= "2015-12-23") %>% select( pct) %>%
as.data.frame() %>% select(-Date)
)
预测:
xd<-fit %>% forecast::forecast( us_change_future)
如何在原始量级获取预测变量的值,也就是变量Open的值?
解决方案
如果把变换放在 model() 函数内部,fable将会自动为你还原这些变换。在这种情况下,该模型等价于对对数变量进行回归,误差为ARIMA(0,1,0)。
你的 TSLM 模型包含一个不显著的截距,你在这里可能不需要,因为它会在预测中引入一个微小的趋势。
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)
google_2015 <- google_stock |> filter(year(Date) == 2015)
fit <- google_2015 |>
filter(Date < "2015-12-23") |>
model(ARIMA(log(Open) ~ log(High) + pdq(0, 1, 0)))
report(fit)
#> Series: Open
#> Model: LM w/ ARIMA(0,1,0) errors
#> Transformation: log(Open)
#>
#> Coefficients:
#> log(High)
#> 0.9267
#> s.e. 0.0401
#>
#> sigma^2 estimated as 0.0001211: log likelihood=757.67
#> AIC=-1511.35 AICc=-1511.3 BIC=-1504.34
forecast <- fit |>
forecast(new_data = google_2015 |> filter(Date >= "2015-12-23"))
autoplot(forecast) +
autolayer(
google_2015 |> filter(Date > "2015-11-01"),
Open
) +
labs(
x = "Date",
y = "Google Stock Price",
title = "Google Stock Price Forecast"
)
创建于2026-04-20,使用 reprex v2.1.1。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。