r - 使用 tslm() 和 tidyverse 预测时间序列组
问题描述
我想将 tslm 模型拟合到每个时间序列组。我从这里开始遵循示例,但我不想拟合 ets 模型,而是想拟合 tslm。
我调整了代码,使其看起来像这样:
library(tidyverse)
library(timetk)
library(sweep)
library(forecast)
monthly_qty_by_cat2 <-
bike_sales %>%
mutate(order.month = as_date(as.yearmon(order.date))) %>%
group_by(category.secondary, order.month) %>%
summarise(total.qty = sum(quantity)) %>%
mutate(trendx = row_number())
monthly_qty_by_cat2_nest <-
monthly_qty_by_cat2 %>%
group_by(category.secondary) %>%
nest() %>%
mutate(data.ts = map(.x = data,
.f = tk_ts,
select = -order.month,
start = 2011,
freq = 12)) %>%
mutate(fit.ts = map(data.ts, ~tslm(total.qty ~ season, data=.x))) %>%
mutate(fcast.ts = map(fit.ts, forecast))
它有效,但是当我改变时
mutate(fit.ts = map(data.ts, ~tslm(total.qty ~ season, data=.x)))
至
mutate(fit.ts = map(data.ts, ~tslm(total.qty ~ trendx, data=.x)))
我收到一个错误:
错误:
mutate()
输入有问题fcast.ts
。x 对象 'trendx' 未找到且输入fcast.ts
为map(fit.ts, forecast)
.
如何使用 tslm 模型中的自定义预测器预测这些数据?
编辑我重写了代码以使用 fable 包:
monthly_qty_by_cat2 <-
bike_sales %>%
mutate(order.month = as_date(as.yearmon(order.date))) %>%
group_by(category.secondary, order.month) %>%
summarise(total.qty = sum(quantity)) %>%
mutate(trendx = row_number())
monthly_qty_by_cat2_nest <-
monthly_qty_by_cat2 %>%
group_by(category.secondary) %>%
as_tsibble(key = category.secondary)
monthly_qty_by_cat2_nest %>%
model(tslm = TSLM(total.qty ~ trendx)) %>%
forecast()
并收到错误:
错误:
mutate()
输入有问题tslm
。未找到 x 对象 'trendx' 无法从提供的 计算所需的变量new_data
。您的模型是否需要额外的变量来产生预测?
解决方案
library(tidyverse)
library(tsibble)
library(fable)
library(lubridate)
monthly_qty_by_cat2 <-
sweep::bike_sales %>%
mutate(order.month = yearmonth(order.date)) %>%
group_by(category.secondary, order.month) %>%
summarise(total.qty = sum(quantity)) %>%
as_tsibble(index=order.month, key=category.secondary) %>%
mutate(x = rnorm(length(total.qty)))
#> `summarise()` regrouping output by 'category.secondary' (override with `.groups` argument)
future_x <- new_data(monthly_qty_by_cat2) %>%
mutate(x = 2)
monthly_qty_by_cat2 %>%
model(tslm = TSLM(total.qty ~ trend() + x)) %>%
forecast(new_data=future_x)
#> # A fable: 9 x 6 [1M]
#> # Key: category.secondary, .model [9]
#> category.secondary .model order.month total.qty .mean x
#> <chr> <chr> <mth> <dist> <dbl> <dbl>
#> 1 Cross Country Race tslm 2016 Jan N(369, 187840) 369. 2
#> 2 Cyclocross tslm 2016 Jan N(-2.5, 75604) -2.50 2
#> 3 Elite Road tslm 2016 Jan N(784, 322470) 784. 2
#> 4 Endurance Road tslm 2016 Jan N(159, 117760) 159. 2
#> 5 Fat Bike tslm 2016 Jan N(95, 66320) 94.6 2
#> 6 Over Mountain tslm 2016 Jan N(194, 57732) 194. 2
#> 7 Sport tslm 2016 Jan N(120, 81568) 120. 2
#> 8 Trail tslm 2016 Jan N(214, 56269) 214. 2
#> 9 Triathalon tslm 2016 Jan N(102, 94449) 102. 2
由reprex 包(v0.3.0)于 2020-07-20 创建
推荐阅读
- python - 如何在numpy中实现两层Keras conv1d?
- python - 移动 auc 曲线的曲线图例
- python - 获取返回空字典的存储 blob 的属性
- mapbox-gl-js - 有没有办法结合两个光栅mapbox layears
- c++ - 存储散列字符串 ID
- r - 如何:在 R 中为 3 个分类变量和一个连续变量创建图?
- html - 使用 jQuery 将另一个 HTML 页面加载到当前 HTML 页面中
- javascript - 将应用程序部署到 Heroku 会引发错误 { path=“/” path=“/favicon.ico” }。但在本地主机上运行
- python - 有没有一种简单的方法可以在 Python/PyMc3 中实现 Normal-inverse-wisart 函数?
- ruby-on-rails - 根据关联记录值更新模型