如何在预测后保留xts时间序列数据中的日期

3
请考虑以下小数据集:
library(xts)
library(ggplot2)
library(forecast)

data <- data.frame(idDate = c("12-12-2012", "13-12-2012", "14-12-2012", "16-12-2012", "19-12-2012"), score= c(110, 120, 130, 200, 180))
date <- as.Date(as.character(data$idDate), "%d-%m-%Y")
score <- as.numeric(data$score)

myxts <- xts(score, date)
autoplot(myxts)

目前为止,沿着x轴的日期(指标)被保留,但是一旦我调用forecast,我沿着x轴的日期就变成了整数。如下所示:

d.arima <- auto.arima(myxts)
d.forecast <- forecast(d.arima, level = c(95), h = 3)
d.forecast
autoplot(d.forecast)

问题: 如何保留myxts的索引?是否有办法告诉forecastauto.arima保留来自myxts的日期(索引)?


你想要实现什么并不清楚。你希望 forecast 还告诉你预测的日期吗? - lebelinoz
是的,我想要源数据和预测数据沿着日期格式的x轴,而不是整数。 - Salvador
1个回答

2
问题在于你在使用两种不同的时间系统:xts是不规则的(使用没有要求周期性的日期),而forecast/ts系统是规则的(使用均匀间隔的数字序列)。我们通过创建一个可以映射到预测的未来日期序列来解决这个问题。
以下是详细的解决方案。使用forecastxts包来重新创建预测。使用timekit包来创建未来日期。使用ggplot2包进行绘图。
解决问题的关键是创建未来日期。请注意,你所拥有的是不规则间隔的时间序列。 tk_make_future_timeseries()与输入时间索引的周期性相匹配。如果不正确,你可以使用skip_valuesinsert_values分别删除和插入日期。
library(forecast)
library(xts)
library(ggplot2)
library(timekit)

# Recreate xts data, d.arima and d.forecast
data <- data.frame(idDate = c("12-12-2012", "13-12-2012", "14-12-2012", "16-12-2012", 
                              "19-12-2012"), 
                   score= c(110, 120, 130, 200, 180))
date <- as.Date(as.character(data$idDate), "%d-%m-%Y")
score <- as.numeric(data$score)
myxts <- xts(score, date)
d.arima <- auto.arima(myxts)
d.forecast <- forecast(d.arima, level = c(95), h = 3)

# Extract index
idx <- tk_index(myxts)
idx
#> [1] "2012-12-12" "2012-12-13" "2012-12-14" "2012-12-16" "2012-12-19"

# Make future index
idx_future <- tk_make_future_timeseries(idx, n_future = 3)
idx_future
#> [1] "2012-12-20" "2012-12-22" "2012-12-23"

# Build xts object from forecast
myts_future <- cbind(y = d.forecast$mean, y.lo = d.forecast$lower, y.hi = d.forecast$upper)
myxts_future <- xts(myts_future, idx_future)
myxts_future
#>              y     y.lo     y.hi
#> 2012-12-20 148 70.33991 225.6601
#> 2012-12-22 148 70.33991 225.6601
#> 2012-12-23 148 70.33991 225.6601

# Format original xts object
myxts_reformatted <- cbind(y = myxts, y.lo = NA, y.hi = NA)
myxts_final <- rbind(myxts_reformatted, myxts_future)

# Plot forecast - Note ggplot uses data frames, tk_tbl() converts to df
tk_tbl(myxts_final) %>%
    ggplot(aes(x = index, y = y)) +
    geom_point() +
    geom_line() +
    geom_ribbon(aes(ymin = y.lo, ymax = y.hi), alpha = 0.2)


Matt,这是一个非常有创意的解决方案。这正是我想要的。谢谢你。具有讽刺意味的是,我刚刚读到了timekit包的相关内容。 - Salvador
最初想使用ts()和auto.arima,但无法保留日期列。使用您的方法,这里是否有必要使用xts()? - Salvador
在timekit设置中实际上不需要使用xts。您可以直接从tbl(数据框)转换为ts,然后再使用auto.arima()。此外,这是我经常遇到的一个一致性问题,因此我正在开发一种更直观的解决方案,利用timekit包(敬请期待!)。 - Matt Dancho
sweep 包正在开发中,但可以用于测试您的目的。vignette 显示了工作流程,大致如下:1)从基于日期的数据框开始,2)使用 tk_ts() 强制转换为时间序列格式,3)使用 auto.arima 或其他喜欢的模型进行建模,4)使用 forecast 进行预测,5)使用 sw_sweep(timekit_idx = TRUE) 将预测结果以数据框形式返回,包括日期。devtools::install_github("business-science/sweep") - Matt Dancho
我会去看一下。我经常为不同的流域进行渔业预测,将日期放在X轴上更加直观。谢谢分享。 - Salvador

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接