对寓言包进行预处理以运行时间序列模型

时间:2019-11-21 14:54:43

标签: r fable-r tsibble

我正在尝试对某些每月时间序列数据运行某些模型。时间序列数据的长度不相等,也不是从同一月开始/结束。我所拥有的是数字月份列和数字年份列。我已经从这两个变量中创建了一个时间序列,并使用了一个tsibble,以便可以使用fable包。这就是我要处理的时间序列数据,

我要在此处发布模拟数据。

# Packages
library(tidyverse)
library(tsibble)
library(fable)
library(fabletools)

# Simulated data
id <- c(rep (222, 28), rep(111, 36), rep(555, 16))
year <- c(rep(2014, 12), rep(2015, 12), rep(2016, 4), 
          rep(2014, 12), rep(2015, 12), rep(2016, 12), 
          rep(2015, 12), rep(2016, 4))
mnt <- c(seq(1, 12, by = 1), seq(1, 12, by = 1), seq(1, 4, by = 1),
         seq(1, 12, by = 1), seq(1, 12, by = 1), seq(1, 12, by = 1),
         seq(1, 12, by = 1), seq(1, 4, by = 1))
value <- rnorm(80, mean = 123, sd = 50)
dataf <- data.frame(id, mnt, year, value)

要使其成为tsibble,我要将我的月份变量mnt转换为字符,

dataf$mnt[dataf$mnt == 1] <- "Jan"
dataf$mnt[dataf$mnt == 2] <- "Feb"
dataf$mnt[dataf$mnt == 3] <- "Mar"
dataf$mnt[dataf$mnt == 4] <- "Apr"
dataf$mnt[dataf$mnt == 5] <- "May"
dataf$mnt[dataf$mnt == 6] <- "Jun"
dataf$mnt[dataf$mnt == 7] <- "Jul"
dataf$mnt[dataf$mnt == 8] <- "Aug"
dataf$mnt[dataf$mnt == 9] <- "Sep"
dataf$mnt[dataf$mnt == 10] <- "Oct"
dataf$mnt[dataf$mnt == 11] <- "Nov"
dataf$mnt[dataf$mnt == 12] <- "Dec"

将月份和年份相加

dataf %>% unite("time", mnt:year, sep = " ")

小插曲

tsbl <- as_tsibble(dataf, index = time, key = id)

目前,我遇到了这个错误,

> tsbl <- as_tsibble(dataf, index = time, key = id)
Error: `var` must evaluate to a single number or a column name, not a function
Call `rlang::last_error()` to see a backtrace.

其余的代码是

# Fitting arima 
fit <- tsbl %>%
  fill_gaps(b = 0) %>% 
  model(
    arima = ARIMA(value),
  )
fit

# One month ahead forecast
fc <- fit %>%
  forecast(h = 1)
fc

# Accuracy measure
accuracy_table <- accuracy(fit)

有什么想法如何对我的数据进行预处理以运行来自fable包的预测模型?

1 个答案:

答案 0 :(得分:1)

在创建time列的地方有两个小问题。首先是您没有将结果重新分配回dataf数据框,而只是将结果发布到控制台。解决该问题可以解决您发布的错误。

下一部分是您需要兼容的数据类型。一个字符还不够,您需要使用tsibble函数yearmonth()之类的东西来完成工作。为此,您会看到我翻转了您的unite()通话的顺序。

相关部分:

dataf <- dataf %>% unite("time", c(year, mnt), sep = " ") %>%
  mutate(time = yearmonth(time))