【发布时间】:2021-01-30 23:07:48
【问题描述】:
我创建了一个函数,允许我使用 fable 包进行时间序列预测。该函数的想法是在特定日期/事件之后分析观察值与预测值。这是一个生成日期列的模拟数据框:-
set.seed(1)
df <- data.frame(Date = sort(sample(seq(as.Date('2018/01/01'), as.Date('2020/09/17'), by="day"),1368883, replace = T)))
这是我创建的函数。您指定数据,然后是事件的日期,然后是预测期(以天为单位),最后是图表的标题。
event_analysis<-function(data,eventdate,period,title){
require(dplyr)
require(tsibble)
require(fable)
require(fabletools)
require(imputeTS)
require(ggplot2)
data_count<-data%>%
group_by(Date)%>%
summarise(Count=n())
data_count<-as_tsibble(data_count)
data_count<-na_mean(data_count)
train <- data_count %>%
#sample_frac(0.8)
filter(Date<=as.Date(eventdate))
fit <- train %>%
model(
ets = ETS(Count),
arima = ARIMA(Count),
snaive = SNAIVE(Count)
) %>%
mutate(mixed = (ets + arima + snaive) / 3)
fc <- fit %>% forecast(h = period)
forecastplot<-fc %>%
autoplot(data_count, level = NULL)+ggtitle(title)+
geom_vline(xintercept = as.Date(eventdate),linetype="dashed",color="red")+
labs(caption = "Red dashed line = Event occurrence")
fc_accuracy<-accuracy(fc,data_count)
#obs<-data_count
#colnames(obs)[2]<-"Observed"
#obs_pred<-merge(data_count,fc_accuracy, by="Date")
return(list(forecastplot,fc_accuracy,fc))
}
在一次运行中,我指定df、事件日期、我要预测的天数(3 周),然后是标题:-
event_analysis(df, "2020-01-01",21,"Event forecast")
这将打印这个结果和情节:-
我承认我制作的模拟数据并不完全理想,但该函数在我的真实数据上运行良好。
这就是我想要实现的目标。我希望这个输出从函数中出来,但此外,我想要一个额外的图表,它“放大”预测的时期,原因有两个:-
- 为了便于解释
- 我希望能够查看之前的N天和之后的N天事件日期(N 代表预测期,即 21)。
所以,一个看起来像这样的附加图(连同原始的完整预测),可能在一个输出中,“多图”样式:-
另一件事是打印另一个输出,该输出显示测试集中的观察值与预测中使用的模型的预测值。
这些基本上是我想添加到我的函数中的两个额外的东西,但我不知道如何去做。非常感谢任何帮助:)。
【问题讨论】:
-
使用
coord_cartesian,您应该能够放大您的图表。或者,您可以将您的图表转换为plotly图表,然后您可以按照您想要的方式放大。 -
为了记录,在函数内附加库是一种通常不被重视的次要效果。使用应提供一条消息,说明您正在附加新库,您应该在外部完成,或者如果您将函数添加到包中,您可以导入所需的每个函数
-
您的可重现示例数据可以重写为:
df <- data.frame(Date = sort(sample(seq(as.Date('2018/01/01'), as.Date('2020/09/17'), by="day"),1368883, replace = T)))。目前它抛出一个错误 -
嗨@Edu,感谢您指出可重现的示例不起作用。我已经用你的解决方案替换了数据。至于在函数中附加库,我不知道这会产生任何次要效果。虽然稍后会对其进行相应的修改,但我唯一担心的是它有效,并且在一定程度上有效。
标签: r plot time-series forecasting fable-r