zoukankan      html  css  js  c++  java
  • 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参数指定了图中预测值折线的类型(虚线)。

  • 相关阅读:
    semijoin链接进行subquery unnesting.
    CONCATENATION 引发的性能问题
    身份证号码有效性检测算法 ( js版 转 C#版 )
    【CS Round #48 (Div. 2 only)】8 Divisible
    【CS Round #48 (Div. 2 only)】Water Volume
    【CS Round #48 (Div. 2 only)】Game of Chance
    【】queue
    【】maze
    【】minimum
    【AtCoder Beginner Contest 073 D】joisino's travel
  • 原文地址:https://www.cnblogs.com/fengzzi/p/10044426.html
Copyright © 2011-2022 走看看