前情需知

指数预测模型

指数模型是用来预测时序未来值的最常用模型。这类模型相对比较简单,但是实践证明它们的短期预测能力较好。不同指数模型建模时选用的因子可能不同。比如

  • 单指数模型(simple/single exponential model)拟合的是只有常数水平项和时间点i处随机项的时间序列,这时认为时间序列不存在趋势项和季节效应;
  • 双指数模型(double exponential model;也叫Holt指数平滑,Holt exponential smoothing)拟合的是有水平项和趋势项的时序;
  • 三指数模型(triple exponential model;也叫Holt-Winters指数平滑,Holt-Winters exponential smoothing)拟合的是有水平项、趋势项以及季节效应的时序。

R中自带的HoltWinters()函数或者forecast包中的ets()函数可以拟合指数模型。ets()函数的备选参数更多,因此更实用。本节中我们只讨论ets()函数。

概述

ets()函数如下:

ets(ts, model="ZZZ")

model="ZZZ",依次含义为错误类型、趋势类型、季节类型。 "A"=additive, "M"=multiplicative and "Z"=automatically

其中ts是要分析的时序,限定模型的字母有三个。第一个字母代表误差项,第二个字母代表趋势项,第三个字母则代表季节项。可选的字母包括:相加模型(A)、相乘模型(M)、无(N)、自动选择(Z)。表15-3中列出了常用的模型。

用于拟合三种指数模型的函数:

类  型 参  数 函  数
单指数 水平项 ets(ts, model="ANN")/ses(ts)
双指数 水平项、斜率 ets(ts, model="AAN")/holt(ts)
三指数 水平项、斜率、季节项 ets(ts, model="AAA")/hw(ts)

ses()、holt()、和hw()函数都是ets()函数的便捷包装(convenience wrapper),函数中有事先默认设定的参数值。

首先我们讨论最基础的指数模型,也即单指数平滑。在此之前,请先确保你的电脑已安装forecast包(install.packages("forecast"))。

单指数平滑

单指数平滑根据现有的时序值的加权平均对未来值做短期预测,其中权数选择的宗旨是使得距离现在越远的观测值对平均数的影响越小。

单指数平滑模型假定时序中的观测值可被表示为:

在时间点Yt+1的预测值(一步向前预测,1-step ahead forecast)可写作

其中 并且0≤α≤1。权数ci的总和为1,则一步向前预测可看作当前值和全部历史值的加权平均。式中α参数控制权数下降的速度,α越接近于1,则近期观测值的权重越大;反之,α越接近于0,则历史观测值的权重越大。为最优化某种拟合标准,α的实际值一般由计算机选择,常见的拟合标准是真实值和预测值之间的残差平方和。下文将给出一个具体例子。

nhtemp时序中有康涅狄格州纽黑文市从1912年到1971年每一年的平均华氏温度。图15-8给出了时序的折线图。

图15-8 康涅狄格州纽黑文地区的年平均气温,以及ets()函数拟合的单指数模型所得到的一步向前预测

从图15-8可以看到,时序中不存在某种明显的趋势,而且无法从年度数据看出季节性因素,因此我们可以先选择拟合一个单指数模型。代码清单15-4中给出了用ses()函数做一步向前预测的代码。

单指数平滑

> library(forecast)
> fit <- ets(nhtemp, model="ANN")
> fit
> forecast(fit, 1)
> plot(forecast(fit, 1), xlab="Year",
ylab=expression(paste("Temperature (", degree*F,")",)),
main="New Haven Annual Mean Temperature")
> accuracy(fit)

ets(mode="ANN")语句对时序数据拟合单指数模型,其中A表示可加误差,NN表示时序中不存在趋势项和季节项。α值比较小(α=0.18)说明预测时同时考虑了离现在较近和较远的观测值,这样的α值可以最优化模型在给定数据集上的拟合效果。

forecast()函数用于预测时序未来的k步,其形式为forecast(fit, k)。这一数据集中一步向前预测的结果是51.9°F,其95%的置信区间为49.7°F到54.1°F➋。图15-8中给出了时序值、预测值以及80%和95%的置信区间➌。

forecast包同时提供了accuracy()函数,展示了时序预测中最主流的几个准确性度量。表15-4中给出了这几个度量的描述。et代表第t个观测值的误差项(随机项),即 。

表15-4 预测准确性度量

度量标准 简  写
平均误差 ME
平均残差平方和的平方根 RMSE
平均绝对误差 MAE
平均百分比误差 MPE
平均绝对百分误差 MAPE
平均绝对标准化误差 MASE

一般来说,平均误差和平均百分比误差用处不大,因为正向和负向的误差会抵消掉。RMSE给出了平均误差平方和的平方根,本例中即1.13°F。平均绝对百分误差给出了误差在真实值中的占比,它没有单位,因此可以用于比较不同时序间的预测准确性;但它同时假定测量尺度中存在一个真实为零的点(比如每天的游客数量),但华氏温度中并没有一个真实为零(即不存在分子运动动能)的点,因此这里不能用这个统计量。平均绝对标准化误差是最新的一种准确度测量,通常用于比较不同尺度的时序间的预测准确性。这几种预测准确性度量中,并不存在某种最优度量,不过RMSE相对最有名、最常用。

单指数平滑假定时序中缺少趋势项和季节项,下节介绍的指数模型则可兼容这些情况。

Holt指数平滑和Holt-Winters指数平滑

Holt指数平滑可以对有水平项和趋势项(斜率)的时序进行拟合。

有水平项、斜率以及季节项的指数模型

> library(forecast)
> fit <- ets(log(AirPassengers), model="AAA")
> fit
>accuracy(fit)
> pred <- forecast(fit, 5)
> pred
> plot(pred, main="Forecast for Air Travel",
ylab="Log(AirPassengers)", xlab="Time")
> predmean <- exp(predmean)
> predlower <- exp(predlower)
> predupper <- exp(predupper)
> p <- cbind(predmean, predlower, pred$upper)
> dimnames(p)[[2]] <- c("mean", "Lo 80", "Lo 95", "Hi 80", "Hi 95")
> p

给出了三个光滑参数,即水平项0.82、趋势项0.0004、季节项0.012。趋势项的参数小意味着近期观测值的斜率不需要更新。

forecast()函数预测了接下来五个月的乘客量,此时的预测基于对数变换后的数值,因此我们通过幂变换得到预测的结果。矩阵pred$mean包含了点估计值,矩阵pred$lower和pred$upper中分别包含了80%和95%置信区间的下界以及上界。exp()函数返回了基于原始尺度的预测值,cbind()用于整合所有结果。

ets()函数和自动预测

ets()函数还可以用来拟合有可乘项的指数模型,加入抑制因子(dampening component),以及进行自动预测。本节将详细讨论ets()函数的这些功能。

在前面的小节中,我们对时序数据做对数变换后拟合出了可加指数模型。类似地,我们也可以通过ets(AirPassengers, model="MAM")函数或hw(AirPassengers, seasonal="multiplicative")函数对原始数据拟合可乘模型。此时,我们仍假定趋势项可加,但季节项和误差项可乘。当采用可乘模型时,准确度统计量和预测值都基于原始尺度。这也是它的一个明显优势。

ets()函数也可以用来拟合抑制项。时序预测一般假定序列的长期趋势是一直向上的(如房价市场),而一个抑制项则使得趋势项在一段时间内靠近一条水平渐近线。在很多问题中,一个有抑制项的模型往往更符合实际情况。

最后,我们也可以通过ets()函数自动选取对原始数据拟合优度最高的模型。

自动选取最优模型的步骤,使用ets()进行自动指数预测

> library(forecast)
> fit <- ets(JohnsonJohnson)
> fit
> plot(forecast(fit), main="Johnson & Johnson Forecasts",
ylab="Quarterly Earnings (Dollars)", xlab="Time", flty=2)

这里我们并没有指定模型,因此软件自动搜索了一系列模型,并在其中找到最小化拟合标准(默认为对数似然)的模型。所选中的模型同时有可乘趋势项、季节项和随机误差项。图15-10给出了其折线图以及下八个季度(默认)的预测。flty参数指定了图中预测值折线的类型(虚线)。

R-ets()的更多相关文章

  1. Erlang ets -- something about cache

    都说用ets 写一个cache 太简单, 那就简单的搞一个吧, 具体代码就不贴了, 就说说简要的需求和怎么做(说设计有点虚的慌). 需求场景 >> 查询系统,对于主存储而言,一次写入多次查 ...

  2. Python学习-day14-前台总结

    以下博客为转载 http://www.cnblogs.com/evilliu/p/5760232.html HTML和CSS总结   一:针对上节作业: 1:

  3. rmq——同步、异步、单向、rocketMQ console、消费模式

    官网上下载:rocketmq-all-4.5.0-bin-release 配置环境变量:

  4. [原]CentOS7安装Rancher2.1并部署kubernetes (二)---部署kubernetes

    ##################    Rancher v2.1.7  +    Kubernetes 1.13.4  ################ ##################### ...

  5. 利用python进行数据分析2_数据采集与操作

    txt_filename = './files/python_baidu.txt' # 打开文件 file_obj = open(txt_filename, 'r', encoding='utf-8' ...

  6. Django项目:CRM(客户关系管理系统)--81--71PerfectCRM实现CRM项目首页

    {#portal.html#} {## ————————46PerfectCRM实现登陆后页面才能访问————————#} {#{% extends 'king_admin/table_index.h ...

  7. R函数-时间序列ETS参数说明

    alpha\beta\gamma分别代表水平.趋势.季节分量的平滑参数α.β.γ.这三个参数我们希望接近于0,以便于更平滑,即越小越平滑.在乘法模型的情况下,参数需要非常低,否则模型会对噪声太敏感. ...

  8. 【翻译】Awesome R资源大全中文版来了,全球最火的R工具包一网打尽,超过300+工具,还在等什么?

    0.前言 虽然很早就知道R被微软收购,也很早知道R在统计分析处理方面很强大,开始一直没有行动过...直到 直到12月初在微软技术大会,看到我软的工程师演示R的使用,我就震惊了,然后最近在网上到处了解和 ...

  9. R统计分析处理

    [翻译]Awesome R资源大全中文版来了,全球最火的R工具包一网打尽,超过300+工具,还在等什么? 阅读目录 0.前言 1.集成开发环境 2.语法 3.数据操作 4.图形显示 5.HTML部件 ...

  10. 用R分析时间序列(time series)数据

    时间序列(time series)是一系列有序的数据.通常是等时间间隔的采样数据.如果不是等间隔,则一般会标注每个数据点的时间刻度. time series data mining 主要包括decom ...

随机推荐

  1. golang(7):文件读写 & json & 错误处理

    终端读写 操作终端相关文件句柄常量 os.Stdin // 标准输入 os.Stdout // 标准输出 (输出到终端) os.Stderr // 标准错误输出 (输出到终端) fmt 常见用法 fm ...

  2. centos安装配置mariadb

    CentOS7下使用yum安装MariaDB CentOS 6 或早期的版本中提供的是 MySQL 的服务器/客户端安装包,但 CentOS 7 已使用了 MariaDB 替代了默认的 MySQL.M ...

  3. centos7安装配置NFS文件共享存储

    一,环境介绍    本实验使用了两台centos7虚拟机,其中         服务器:192.168.1.188    客户端:192.168.1.189 二,实验步骤    192.168.1.1 ...

  4. 5.Struts2-Struts标签

    通用标签 1.property(取值) property:<s:property value="username"/> property 取值为字符串:<s:pr ...

  5. SPOJ 1825 经过不超过K个黑点的树上最长路径 点分治

    每一次枚举到重心 按子树中的黑点数SORT一下 启发式合并 #include<cstdio> #include<cstring> #include<algorithm&g ...

  6. lib异步中断

    基于libusbx-1.0.18-rc1,libusbx现已重新merage到libusb.1. 初始化使用libusb_init初始化libusb,如果是单设备通信,ctx参数可以传NULL,表示使 ...

  7. Linux之checkconfig 服务自启动

    chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. 使用语法: chkconfig [--a ...

  8. java合并数组的几种方法,stream流合并数组

    一.实例代码 package cc.ash; import org.apache.commons.lang3.ArrayUtils; import java.lang.reflect.Array; i ...

  9. https加载http资源,导致ios手机上的浏览器图片加载问题

    今天解决一个线上bug的时候发现的问题,如下图: 从表象来看,同样的图片,安卓手机上可以正常展示,但是到ios手机上首次进入页面就不能正常显示图片,必须手动刷新一次页面才能正常加载. 这时候,我们首先 ...

  10. JS特殊写法

    记录下工作中碰到的JS特殊写法 (function(index) { $('#' + id).on("change", function() { me.onChange(this, ...