R-ets()
前情需知
指数预测模型
指数模型是用来预测时序未来值的最常用模型。这类模型相对比较简单,但是实践证明它们的短期预测能力较好。不同指数模型建模时选用的因子可能不同。比如
- 单指数模型(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()的更多相关文章
- Erlang ets -- something about cache
都说用ets 写一个cache 太简单, 那就简单的搞一个吧, 具体代码就不贴了, 就说说简要的需求和怎么做(说设计有点虚的慌). 需求场景 >> 查询系统,对于主存储而言,一次写入多次查 ...
- Python学习-day14-前台总结
以下博客为转载 http://www.cnblogs.com/evilliu/p/5760232.html HTML和CSS总结 一:针对上节作业: 1:
- rmq——同步、异步、单向、rocketMQ console、消费模式
官网上下载:rocketmq-all-4.5.0-bin-release 配置环境变量:
- [原]CentOS7安装Rancher2.1并部署kubernetes (二)---部署kubernetes
################## Rancher v2.1.7 + Kubernetes 1.13.4 ################ ##################### ...
- 利用python进行数据分析2_数据采集与操作
txt_filename = './files/python_baidu.txt' # 打开文件 file_obj = open(txt_filename, 'r', encoding='utf-8' ...
- Django项目:CRM(客户关系管理系统)--81--71PerfectCRM实现CRM项目首页
{#portal.html#} {## ————————46PerfectCRM实现登陆后页面才能访问————————#} {#{% extends 'king_admin/table_index.h ...
- R函数-时间序列ETS参数说明
alpha\beta\gamma分别代表水平.趋势.季节分量的平滑参数α.β.γ.这三个参数我们希望接近于0,以便于更平滑,即越小越平滑.在乘法模型的情况下,参数需要非常低,否则模型会对噪声太敏感. ...
- 【翻译】Awesome R资源大全中文版来了,全球最火的R工具包一网打尽,超过300+工具,还在等什么?
0.前言 虽然很早就知道R被微软收购,也很早知道R在统计分析处理方面很强大,开始一直没有行动过...直到 直到12月初在微软技术大会,看到我软的工程师演示R的使用,我就震惊了,然后最近在网上到处了解和 ...
- R统计分析处理
[翻译]Awesome R资源大全中文版来了,全球最火的R工具包一网打尽,超过300+工具,还在等什么? 阅读目录 0.前言 1.集成开发环境 2.语法 3.数据操作 4.图形显示 5.HTML部件 ...
- 用R分析时间序列(time series)数据
时间序列(time series)是一系列有序的数据.通常是等时间间隔的采样数据.如果不是等间隔,则一般会标注每个数据点的时间刻度. time series data mining 主要包括decom ...
随机推荐
- Java异常模块
JAVA异常的捕获与处理 视频链接:https://edu.aliyun.com/lesson_1011_8939#_8939 java语言提供最为强大的支持就在于异常的处理操作上. 1,认识异常对程 ...
- Function(Of T) as T 泛型类型多态返回对象的实现
Shared Function ResultT(Of T As result)(msg As String, Optional success As Boolean = False) As T Dim ...
- JS基础_逻辑运算符
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- VC++ warning C4819 的解决方法(转)
编译VC++程序的时候出现如下提示警告: warning C4819: The file contains a character that cannot be represented in the ...
- vim insert VISUAL模式无法右键复制问题(转)
转自:https://blog.csdn.net/coder_oyang/article/details/89096219 vim中使用鼠标右键粘贴,失败.vim的模式: 网上解法: 1. 普通模式下 ...
- 一个简单的创建xml方式
, matnr LIKE mara-matnr , maktx LIKE makt-maktx , END OF itab_matnr . , class LIKE m_wwgha-class,&qu ...
- Python实现串口通信(pyserial)
pyserial模块封装了对串口的访问,兼容各种平台. 安装 pip insatll pyserial 初始化 简单初始化示例 import serial ser = serial.Serial('c ...
- python连接oracle导出数据文件
python连接oracle,感觉table_list文件内的表名,来卸载数据文件 主脚本: import os import logging import sys import configpars ...
- JavaMaven【七、插件使用】
配置pom.xml 配置在那个周期的那个阶段执行该插件的功能 上图是配置了使用插件source3.0.1,该插件的功能是打包源码 并配置了在package阶段后执行打包源码的操作jar-no-fork ...
- Atmel芯片使用
ATMEL系列芯片 9X35 9G35可pin-to-pin替代9G10,具体需核对.此外即使pin-to-pin替代,外部应用也不一样. A5D2处理器,可支持linux/andriod. M7(M ...