• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

R语言 简单指数平滑法

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

简单指数平滑适用于可用相加模型描述,并且处于恒定水平和没有季节变动的时间序列地短期预测。

简单指数平滑法提供了一种方法估计当前时间点上的水平。为了更加准确的估计当前时间的水平,我们使用alpha参数来控制平滑,alpha的取值在0-1之间。当alpha越接近0,临近预测的观测值在预测中的权重就越小。

我们采用伦敦1813年到1912年全部的每年每英尺降雨量来做分析对象,首先读入相关数据和绘制出序列图:

[plain] view plain copy
  1. rain <- scan("http://robjhyndman.com/tsdldata/hurst/precip1.dat",skip=1)  
  2. rainseries <- ts(rain,start=c(1813))  
  3. plot.ts(rainseries)  

从该图中可以看出整个曲线处于大致不变的水平,且随机变动在整个时间序列范围内也可以认为是大致不变的,所以该序列可以大致被描述为一个相加模型,因此我们可以使用简单指数平滑法进行预测。我们采用R中的HoltWinters()函数,为了能够使用HoltWinters中的指数平滑,我们需要进行参数设置:beta=FALSE和gamma=FALSE,预测结果如下图:


HoltWinters()告诉我们alpha参数的估计值约为0.024,非常接近0,说明该序列比较平稳,默认情况下HoltWInters仅会给出原始时间序列所覆盖时期内的预测,预测值存在房子名为为fitted的变量中,我们可以通过rainseriesforecasts$fitted来获取这些值。

此外我们可以画出预测值和实际值,看看预测效果:

[plain] view plain copy
  1. plot(rainseriesforecasts)  

从之前的alpha和上图,可见我们预测的过于平滑,R提供了样本预测误差平方和(SSE)来衡量预测效果。可以通过rainseriesforecasts$SSE来获取该值。另外我们还可以指定时间序列水平的初始值,常见的做法为采用时间序列第一个值,如这里采用1813年的23.56,具体实现如下:

[plain] view plain copy
  1. HoltWinters(rainseries, beta=FALSE, gamma=FALSE, l.start=23.56)  

为了预测未来时期的值,我们需要借助forecast包,假设我们需要对未来8年的下雨量进行预测,具体实现如下:

[plain] view plain copy
  1. library("forecast")  
  2. rainseriesforecasts2 <-forecast.HoltWinters(rainseriesforecasts, h=8)  

同时forecast.HoltWinters()函数给出了80%和95%的预测区间,为了更方便地查看预测结果,我们画出了预测效果图,具体实现和结果如下:

[plain] view plain copy
  1. plot.forecast(rainseriesforecasts2)  


其中蓝线是预测1913-1920间的降雨量,深灰色阴影区域为80%的预测区间,浅灰色阴影区域为95%的预测区间。

同样forecast也提供了”预测误差”的统计指标(residuals),借助”预测误差“我们可以评估预测是否有改进的可能性:如果预测误差是相关的,则很可能是简单指数平滑预测可以被另外一种预测技术优化。为了验证预测误差的相关性(act()),我们获取样本误差中1-20阶(期数)的相关图,具体R的实现和结果如下:


[plain] view plain copy
  1. acf(rainseriesforecasts2$residuals, lag.max=20)#可以使用lag.max 指定我们想要看到的最大阶数  

观看上图可以发现自相关系数在第3期的时候达到了置信界限。为了验证在滞后1-20阶时非0自相关属性是否显著,可以借助R语言的(Box.test())Ljung-Box检验。具体实现如下:

统计量为17.4,并且P值是0.6(置信度只有40%)这样的值不足以拒绝“预测误差在1-20阶是非零自相关则我们接受预测误差在1-20阶是非零自相关的。

Ps: p值大,说明为纯随机序列。p值小,非纯随机序列,置信水平(1-p)

除了上述的验证方式,我们还可以验证预测误差是正太分布,并且均值为0,方差不变,为了做到这点,我们可以绘制出一个样本内预测误差图:

[plain] view plain copy
  1. plot.ts(rainseriesforecasts2$residuals)  

观察上图,我们可以归纳出整个时间区间内预测误差属于大致不变的正态分布,且均值接近0,为了更具体的展现,我们需要借助少量的代码,首先构建函数plotForecastErrors:

[plain] view plain copy
  1. plotForecastErrors <- function(forecasterrors)   
  2. {   
  3.     # make a red histogram of the forecast errors:   
  4.     mysd <- sd(forecasterrors)   
  5.     hist(forecasterrors, col="red", freq=FALSE)   
  6.     # freq=FALSE ensures the area under the histogram = 1  
  7.     # generate normally distributed data with mean 0 and standard deviation mysd  
  8.     mynorm <- rnorm(10000, mean=0, sd=mysd)   
  9.     myhist <- hist(mynorm, plot=FALSE)   
  10.     # plot the normal curve as a blue line on top of the histogram of forecast errors:  
  11.     points(myhist$mids, myhist$density, type="l", col="blue", lwd=2)      
  12. }  

在控制台调用该函数:

[plain] view plain copy
  1. source("plotForecastErrors.R")  
  2. plotForecastErrors(rainseriesforecasts2$residuals)  

结果如图:

观察上图可见,预测的误差呈现均值为0 ,方差恒定的正态分布,可见预测算法无法改进了。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
《R语言数据挖掘》——2.3 混合关联规则挖掘发布时间:2022-07-18
下一篇:
R语言集成开发环境 RStudio中的函数和包!发布时间:2022-07-18
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap