R语言混合时间预测更好的时间序列点估计

混合预测 - 单模型预测的平均值 - 通常用于产生比任何贡献预测模型更好的点估计。我展示了如何为混合预测构建预测区间,这种预测的覆盖范围比最常用的预测区间更准确(即80%的实际观测结果确实在80%置信区间内),在3,003 M3预测中进行了测试竞赛数据集。

预测间隔

预报员的问题是在预测组合中使用的预测间隔。预测间隔是与置信区间相似但不相同的概念。预测间隔是对尚未知但将在未来的某个点观察到的值(或更确切地说,可能值的范围)的估计。而置信区间是对基本上不可观察的参数的可能值范围的估计。预测间隔需要考虑模型中的不确定性,模型中参数的不确定估计(即那些参数的置信区间),以及与预测的特定点相关联的个体随机性。

例如,一项研究发现,预测间隔计算得包括真实结果95%的时间只能在71%到87%的时间之间得到它(感谢Hyndman再次在他的博客上轻松获得该结果)。有许多原因,但主要原因是模型构建和选择过程中的不确定性未得到充分考虑。开发预测区间的大多数方法实际上首先估计一系列值,条件是模型是正确的。由于我们的模型只是对现实的简化,因此,如果模型完全正确,我们会失败的次数更多。

粗略地看一眼,我找不到关于如何从预测组合产生预测区间的讨论。Hyndman避免在与上述相关的第一篇文章中引用该问题,只提出关于点估计的声明“如果你只想要点预测,那么(平均值etsauto.arima)是forecast包中可用的最佳方法。”

预测让我感到紧张,而在我的日常工作中,当现实与预测点明显不同时,它会导致问题。我希望更多地关注预测间隔的预测范围,我希望这个范围是准确的,或者是否有点保守(例如,我会更高兴83%的观察结果进入内部我80%的预测间隔比77%)。

介绍hybridf()

我喜欢结合auto.arima()ets()快速,有效地进行混合预测,这可能与单变量系列一样好。事实上,它是一种可以在一天内轻松完成数千次的事情,所以为了使它更方便,我创建了一个hybridf()在R中为我做这个并生成类对象的函数forecast。这意味着我可以使用一行代码拟合预测,而Hyndman为该类开发的其他功能(如标准预测图)可用于生成的对象。这是1973年至1978年美国每月意外死亡时间序列的实际应用,用于Brockwell和Davis的1991年时间序列:理论和方法以及R的内置数据集之一。

library(devtools)
install_github("robjhyndman/forecast") # development version needed sorry
library(forecast)

 

深灰色区域是80%预测间隔,浅灰色区域是95%预测间隔。顶部面板显示混合预测。深蓝色线只是其他两种方法的点预测的平均值,预测区间采用保守的观点来显示组合两者的最宽范围的值。因此,混合预测间隔将比任一贡献模型的预测间隔宽。

测试M3竞赛系列

在这些易于访问计算机和数据的日子里,我们不必仅仅了解不同预测间隔的成功率,我们可以根据实际数据测试方法。我用了3,003 M3竞争的数据集进行比较所产生的80%和95%的预测区间ets()auto.arima()和我hybridf()。在对给定的历史数据拟合模型并产生所需长度的预测之后,我计算了预测间隔中有多少实际结果。结果如下:

变量 成功
ets_p80 0.75
ets_p95 0.90
auto.arima_p80 0.74
auto.arima_p95 0.88
hybrid_p80 0.83
hybrid_p95 0.94

我的混合方法有在接近广告的成功率,而这两个预测区间ets()auto.arima()不太成功。例如,混合80%预测区间包含83%的实际结果,95%预测区间具有94%的实际结果; 而对于auto.arima,成功率分别为74%和88%。

以下是我在M3数据上测试的方法。我构建了一个小函数pi_accuracy()来帮助,它利用了类预测对象返回一个名为“lower”的矩阵和另一个名为“upper”的矩阵的事实,每个预测区间级别都有一列。由于这只是本博客的临时功能,我将其保留,因此它仅适用于生成80%和95%间隔的预测对象的默认值:

#------------------setup------------------------
library(showtext)
library(ggplot2)
library(scales)
library(forecast)
 ly = "myfont"))

pi_accuracy <- function(fc, yobs){
   # checks the success of prediction intervals of an object of class

   In <- (yobsm
 }

实际上拟合所有预测相对简单。我的笔记本电脑花了大约一个小时。当hybridf()函数返回一个提供底层ets()auto.arima()对象的对象时,它们不需要重新安装,并且有一些适度的效率。

#============forecasting with default values===============
num_series <- length(M3) # ie 3003
results <- matrix(0, nrow = num_series, ncol = 7)

for(i in 1:num_series){
   cat(i, " ")        # let me know how it‘s going as it loops through...
   series <- M3[[i]]
 ccess

   fc1 <- fc3$fc_ets
   r
   geom_smooth(se = FALSE, method = "lm") +
   theme(panel.grid.minor = element_blank())

当我们查看单个预测的成功率时,会出现一个有趣的模式,如上图所示。一小部分不幸的人在预测区间内有0%的实际数据 - 事情出错并且保持错误。通常,预测周期越长,预测间隔的准确率越高。预测间隔变得更宽,因为它们预测了更多的周期; 并且这种间隔中明确包含的随机性开始主导着首先出现错误模型的沉没成本不准确性。对于较长的预测期,标准预测间隔倾向于按照所宣传的方式执行,而对于较短的预测期,它们过于乐观。

引导

预测方法都ets()auto.arima()有通过仿真和引导残差,而不是分析估计预测区间的选项,这些方法都是由我继承hybridf()。我也检查了这些预测区间的值。结果与非引导结果非常相似; 如果有的话,基于自举和模拟的预测间隔稍微不准确,但差别无关紧要。

变量 成功
ets_p80 0.72
ets_p95 0.88
auto.arima_p80 0.70
auto.arima_p95 0.86
hybrid_p80 0.80
hybrid_p95 0.92
#=====with bootstrapping instead of formulae for the prediction intervals=============

num_series <- length(M3)
resultsb <- matrix(0, nrow = num_series, ncol = 7)

for(i in 1:num_series){
   cat(i, " ")

   gather(variable, value, -h) %>%
   mutate(weighted_val ighted_value) / sum(h), 2))

结论

  • 根据M3竞赛数据进行测试hybridf(),通过组合预测间隔ets()auto.arima()以保守方式(“通过叠加两个源间隔覆盖的最宽范围”)形成的预测间隔执行真实到期望的水平,即80%预测interval在80%的时间内包含真值,95%的预测间隔包含不到95%的时间的真值。

原文地址:https://www.cnblogs.com/tecdat/p/9550237.html

时间: 2024-10-06 18:00:06

R语言混合时间预测更好的时间序列点估计的相关文章

数据分析和R语言的那点事儿_1

最近遇到一些程序员同学向我了解R语言,有些更是想转行做数据分析,故开始学习R或者Python之类的语言.在有其他编程语言的背景下,学习R的语法的确是一件十分简单的事.霸特,如果以为仅仅是这样的话那就图样图森破. 首先,数据分析是一个非常庞杂的职能,也许岗位抬头均为数据分析师的两人,做的事情却大不相同——比如使用hadoop做日志统计和使用Excel处理报表,这简直是两个领域,相互之间的职能了解,可能仅为对方工作的冰山一角. 其次,无论任何行业的数据分析,其日常工作主要为以下几块: 数据获取——数

R语言教程:写给高级入门者的数据打理攻略

http://developer.51cto.com/art/201312/423612_all.htm 原文地址 如果大家还未完全熟悉R语言.甚至不能轻松利用它实现最基本的处理任务,我建议各位先查阅其它指导文章.帮助自己积累对R语言的认识.但如果大家已经拥有一定的背景知识,希望能够进一步提升自己的开发技能——或者单纯只是想看看R语言如何完成文章中罗列的四项任务——那么请跟着我继续阅读. 学习如何添加column.计算总和.对结果排序以及数据改造. 强大的能力在带来责任之外,也给我们增添了恼人的

R语言︱XGBoost极端梯度上升以及forecastxgb(预测)+xgboost(回归)双案例解读

R语言︱XGBoost极端梯度上升以及forecastxgb(预测)+xgboost(回归)双案例解读 XGBoost不仅仅可以用来做分类还可以做时间序列方面的预测,而且已经有人做的很好,可以见最后的案例. 应用一:XGBoost用来做预测 -------------------------------------------------- 一.XGBoost来历 xgboost的全称是eXtreme Gradient Boosting.正如其名,它是Gradient Boosting Mach

R语言与数据分析之七:时间序列简单指数平滑

上篇我们对时间序列数列有了整体的认识并将时间序列进行了分解,今天和小伙伴们分享常用预测算法中相对最简单的:简单指数平滑法.简单指数平滑适用于可用相加模型描述,并且处于恒定水平和没有季节变动的时间序列地短期预测. 简单指数平滑法提供了一种方法估计当前时间点上的水平.为了更加准确的估计当前时间的水平,我们使用alpha参数来控制平滑,alpha的取值在0-1之间.当alpha越接近0,临近预测的观测值在预测中的权重就越小. 我们采用伦敦1813年到1912年全部的每年每英尺降雨量来做分析对象,首先读

R语言学习笔记(十三):时间序列

#生成时间序列对象 sales<-c(18,33,41,7,34,35,24,25,24,21,25,20,22,31,40,29,25,21,22,54,31,25,26,35) tsales<-ts(sales,start=c(2003,1),frequency = 12) tsales Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec2003 18 33 41 7 34 35 24 25 24 21 25 202004 22 31 40 29

R语言k-Shape时间序列聚类方法对股票价格时间序列聚类

这次,我们将使用k-Shape时间序列聚类方法检查与我们有业务关系的公司的股票收益率的时间序列. 执行环境如下. R:3.5.1 企业对企业交易和股票价格 在本研究中,我们将研究具有交易关系的公司的价格变化率的时间序列的相似性,而不是网络结构的分析.由于特定客户的销售额与供应商公司的销售额之比较大,当客户公司的股票价格发生变化时,对供应商公司股票价格的反应被认为更大. k-Shape k-Shape [Paparrizos和Gravano,2015]是一种关注时间序列形状的时间序列聚类方法.在我

R语言使用机器学习算法预测股票市场

quantmod 介绍 quantmod 是一个非常强大的金融分析报, 包含数据抓取,清洗,建模等等功能. 1. 获取数据 getSymbols 默认是数据源是yahoo 获取上交所股票为 getSymbols("600030.ss"), 深交所为 getSymbols("000002.sz").  ss表示上交所, sz表示深交所 2. 重命名函数 setSymbolLookup 3. 股息函数 getDividends 4. 除息调整函数 adjustOHLC

使用R语言预测产品销量

使用R语言预测产品销量 通过不同的广告投入,预测产品的销量.因为响应变量销量是一个连续的值,所以这个问题是一个回归问题.数据集共有200个观测值,每一组观测值对应一种市场情况. 数据特征 TV:对于一个给定市场的单一产品,用于电视上的广告费用(以千为单位) Radio:用于广告媒体上投资的广告费用 Newspaper:用于报纸媒体上的广告费用 响应 Sales:对应产品的销量 加载数据 > data <- read.csv("http://www-bcf.usc.edu/~garet

R语言与数据分析之六:时间序列简单介绍

今年在某服装企业蹲点了4个多月,之间很长一段时间在探索其现货和期货预测,时间序列也是做销售预测的首选,今天和小伙伴分享下时间序列的基本性质和如何用R来挖据时间序列的相关属性. 首先读入一个时间序列:从1946年1月到1959年12月的纽约每月出生人口数量(由牛顿最初收集)数据集可以从此链接下载(http://robjhyndman.com/tsdldata/data/nybirths.dat).我们将数据读入R,并且存储到一个时间序列对象中,输入以下代码: births<- scan("h