时间序列的R语言实现_Part2

这部分是用指数平滑法做的时间序列的R语言实现,建议先看看指数平滑算法。

用指数平滑做预测

简单指数平滑(Simple Exponential Smoothing

对可用加性模型描述的,非周期性的时间序列数据,可用简单指数平滑来做短期的预测。指数平滑是根据平滑常熟α来做的,α取值在0-1的区间上,α越小越接近0,就表示做预测时对近期观测所取的比重较大。

说明:指数平滑算法的原理就是利用历史观测数据对未来做预测,α的取值决定着对近期和远期观测数据所取的权重。详细的可以去了解该算法。

下面是伦敦1813年到1912年的降雨量英尺数的时间序列数据:

计算机生成了可选文字: >raln<~Read100SCanltpm只(nh七七p://robjhynd现an.com/t3dldata/hurst/preclp几.datn,sklp‘工)>rain3erles<一七s(raln,3tart=c(1813))

计算机生成了可选文字: 况异吕吕Sa一JQ)SU一伯」18201840186018801900Time

由图可以看出,数据随时间的随机波动幅度是大致不变的,所以可以说该时间序列是稳定的。在R中用简单指数平滑做预测,我们可以用HoltWinters()方法,使用时需要设置两个参数beta=FALSEgamma=FALSE

说明:HoltWinters有三个类似的参数,alpha,beta,gamma,这三个参数跟上面讲到的简单指数平滑的取值范围一样在0-1之间。可以简单理解alpha是平滑指数,beta是趋势指数,gamma是季节指数。rainseries时间序列没有明显上升或下降的趋势,也没有季节性的变化,所以这里这两个参数取false

计算机生成了可选文字: ralnserle3forecast3<一HoltWinters(rainserle3,beta'FALSE,qanu皿a=FALSE)rain3erle3foreCa弓t3>>Holt一Wlnter3expanentlal3moo七hinqwlthouttrendandwithaut3ea3onalcompan$C己11:Hal七Wln七ers(x=ralnserles,beta=FA毛SE,qa"lr.a=FA工SE)Smoothinqparalneter3:alpha:0.024工2工5工beta:FA工SEqa刀口毛a:FA工SECOeff1Clents:l,1]己24。67819

结果alpha很接近0,说明预测中对近期观测数据取值权重较大。结果存储在rainseriesforecasts这个list变量中,预测结果储存在这个list变量的fitted元素中,它的结果可以查看到。

计算机生成了可选文字: >raln3erlesforecast3$flttedTllneserles:stdl七=181性End=1912Frequency=1xh己七level181性23。5600023。56000181523。6205性23。6205性181623。5780823。57808181723。7629023。76290181823。7601723。76017181923。7630623。76306182023。8269123。82691182123。7990023。79900182223。9893523。98935182323。9862323。98623

在图中将原始时间序列和新的时间序列对照看:

计算机生成了可选文字: >plo七(ra工n3erlesforeca3七5)

计算机生成了可选文字: Holt·Winters朽Itering的的0门的入0入p山州一U-、paIU田SqO18201840186018801900T1me

黑色线是原始数据,红色线是预测数据。检验结果的准确度,可以用SSE(误差项平方和)的值来判断。SSE也是list变量rainseriesforecasts中的一个元素。查看SSE的值如下:

计算机生成了可选文字: >:aln3e:lesforecast3$SSE[1]1828.855

这个预测结果原始数据对比误差项平方和是1828.855

上面例子中,HoltWinters()方法默认的预测仅覆盖有原始数据的那个时间段,也就是1813年到1912年的降水量的时间序列。用R中的forecast包中的forecast.HoltWinters()方法可以来做这个预测。首先安装forecast包。安装方法很简单就不说了。安装完成后加载forecast包。

计算机生成了可选文字: >lib:ary("fo:eca3t")载入需要的程辑包:载入程辑包:200Thefolla甘in口object3are址a3kedfram、packaqe:ba3er:a3.Date,a3.Date.nur吐erlc载入需要的程辑包:"imeDa七eThis15fo了eC己3t5.6警告信.息:1:程辑包、foreca:t’是用R版本3.1.2来建造的2:程辑包,zoo’是用R版本3.1.2来建造的3:程辑包、timeDate’是用R版本3.1.2来建造的>rain3erie3foreca3t32<一fo二ecast.HoltWin七e工3(rain,erle3foreca3t3,h,8)>工己InseriesfOleC己3t32POintFOreC己3tLO80Hl80LO95Hl95191324。6781919。1749330。181性516。2616933。09470191任2咬。6781919。1733330.1830516。2592433。0971519152任。6781919。1717330。18喂6516。2567933。09960191624.6781919.1701330.1862516。25性3433。1020性19172咬.6781919.1685330.1878516。2519033。10性49191824。6781919。1669喂30.1894516。2494533。1069性191924。6781919。1653曦30。1910516。2470133。10938192024。6781919。1637喂30。1926516。2445633。11182

上面forecast.HoltWinters()的两个参数,第一个是上一步rainseriesforecasts用默认的HoltWinters()得到的结果,第二个h是你想要预测的期数,为8,所以得到的预测结果是从1912年往后推的8年即1913-1920。预测结果有5列数据,第一列Forecast是预测值,第二列第三列是80%的置信区间的下限和上限,第四列第五列是95%置信区间的下限和上限。这个预测结果用图表展示出来如下:

计算机生成了可选文字: FOFeCastSfFOmHOltwinteFS况异帅C叨吕182018401860188019001920

蓝线是从1913年到1920年的预测值,颜色较深的部分是预测值80%的置信区间,颜色较淡的蓝色是预测值95%的置信区间。对未来数据进行的预测,因为没有同期观测数据,所以没办法用前面讲到的SSE来检测预测误差。

这个例子中样本的预测误差存在forecast.HoltWinters()方法返回的list变量中的residuals(残差)元素中。如果做预测模型不可改良,那预测误差和连续预测结果不相关。也就是说如果预测误差和预测结果间存在相关性,那所用的简单指数平滑模型可以用其他预测方法优化。

R中提供了acf()方法可以查看样本预测误差的相关性图。若要定义我们想要查看的最大滞后期数,可以定义acf()方法中的lag.max参数。

例如,计算滞后期在1-20时的样本预测误差的相关性,如下操作:

计算机生成了可选文字: >acf(rain3erle3foreca3t32Sre31dua13,laq.znax,20)

 

计算机生成了可选文字: SeriesrainseriesforecastsZ$residualsU-0哎入.0.(日}八之00】月1.a.L05

 

从上面的相关性图可以看出来,在滞后期为3时的自相关结果接近意义界限。

说明:

acf()的说明,自相关公式:

计算机生成了可选文字: R(k)=EI(X‘一川(X'+。一尸)1a2

k是在acf方法中定义的lag.max的值,伦敦降雨量预测的例子中,k的取值就是1-20的范围内。两条蓝色的虚线是意义界限,acf值在这个界限之间,可以认为相关性接近0,可以忽略,如果超出这个范围就需要另外的判断了。这个是我自己的理解,仅供参考。如果有问题,欢迎指正!

 

测试在1-20的延迟期中,是否有意义的非零相关值,我们可以用Ljung-Boxt测试。在R中,用Box.test()的方法。Box.test()方法中的lag参数用来定义我们想要查看的最大延迟期。用上面伦敦降雨量的预测误差,作如下操作:

计算机生成了可选文字: >Box.testlraln3erlesforeca3t32零re31dual3,lag=20,type,"Ljunq一Box.)Box一Ljunq七e3tda七a:X一sq林raln3erie3foreca3t32车re3idual3ared=17.任008,df=20,p一value=0.626己

Ljung-Box测试的统计值是17.4p值是0.6,所以样本预测误差的非零相关的可能很小。再次确认预测模型不可再改进,查看预测误差是不是以均值0和不变方差按正态分布。

要查看预测误差是否有不变方差,可以被预测误差的结果做一个时序图:

计算机生成了可选文字: >plo七.ts(rain3eriesforecastsZ零re3idua13)

 

计算机生成了可选文字: O}的O的·slenp一seJ$闪s】se。。Jo』sa,工J。sule」18201840186018801900T1me

从上图可以看出,尽管1820-1830年这前十年的波动幅度相比1840-1850期间的波动幅度要小一些,预测误差的方差在时间上还是大致稳定的。

查看预测误差是否按0正态分布,可以查看预测误差的直方图和以0和相同标准误差呈正态分布的曲线图,两者对比查看。还是同一个例子,需要自己写一个R的方法plotForecastErrors()来实现可实现:

计算机生成了可选文字: >plo七FarecastError3<一func七ion(forecasterror3)+{+奔rnakeahlstoqrarnoftheforeca3七error3:+mybin31ze<一IQR(forecasterrors)/性+my3d<一sd(forecasterror3)+m飞皿In<一mln(forecasterror3)一mysd*5+my几ax<一max(forecasterrors)+mysd*3+幸qeneratenormallydls七rlbu七edda七awi七hmean0ands七andarddevlationIny$+mynarln<一rnorm(10000,皿ean=O,sd硕y3d)+mymlnZ<一min(mynorm》+my皿axZ<一nax(mynorm)+if(mymlnZ<mymln){mymln<一myminZ}+If(m生皿axZ>m飞皿ax){皿玉皿ax<一mynlaxZ}+奔rnakearedhlstogramoftheforeca3七error3,wl七hthenormallydlstrlbut$+mybin3<一seq(mymin,mymax,myblnsize)+h13t(fa:ecasterrors,col=nredn,freq=FALSE,break3=Inyblns),奔freq=F及工SEen3urestheareaunder七hehis七oqr视=1+希qeneratenormallydis七rlbu七edda七awi七hmean0ands七andarddeviationIny$+myhlst<一hlst(mynorm,plo七=FALSE,break3=mybin3),奔plotthenormalcurvea3abluel工neon七opof七heh13七oqr柳offoreca3t车+palnt3(myhlst$现主ds,myhist$denslty,七yPe'"1",col="blue",lwd=2)+}

上面是plotForecastErrors()方法代码,行末$符号表示不换行,#开始的行表示是注释。下面使用这个方法:

计算机生成了可选文字: >platFareca3tE:二or3(ra工n3er工e3foreca3t32导re31dual3)

 

计算机生成了可选文字: Histogramofforecasterrors刹}.0800寸0.0必isu。000.0一30一20一1001020foreCasterrorS

图上能看出来,预测误差基本上是以0为中心,大致正态分布的,与正态分布曲线相比可能有些向右偏,但右偏量相对小。所以,可以说预测误差是以0为中心呈正态分布的。

Ljung-Box测试的结果表明预测误差的非零自相关的结果很少,它的分布也满足以0为中心呈正态分布。至此,我们可以下结论,简单指数平滑方法足够用来做伦敦降雨量的预测模型,也不需要进一步的改进了。并且,80%95%的预测区间也是基于上述结论得到,可以说是有效的。

霍特双参数指数平滑(Holt’s Exponential Smoothing)

说明:了解一下霍特双参数指数平滑法,推荐看博文http://blog.csdn.net/cl1143015961/article/details/42098919  在文章中讲到的第三个算法。

霍特指数平滑法,包含两个参数α和β。α平滑常数,β是趋势常数。跟HoltWinters方法的参数一样,这两个参数的取值范围也在0-1间。所以对满足加性模型,存在增加趋势或者递减趋势的非季节性的数据,可以选择用霍特指数平滑法来做短期的预测。

霍特指数平滑法能预估在当前时间点的水平和趋势。下面是一个非季节性的存在增减趋势的时间序列例子。从1866年到1911年每年女性裙子边缘直径的数据:

计算机生成了可选文字: >3klrt3<一scan(.http://robjhynd九an.com/七3dldata/raberts/3klrt3.dat",3klp=5)Re己d性6lte几3>3klrt33erie3<一t3(3kirt3,3tart,c(1866))

 

计算机生成了可选文字: 00600900卜S山一J山55七一艺S00918701880189019001910Time

 

可以看出女性裙子边缘直径从1866600左右增大到了1880年的1050,在这之后又降到了1911年的520

还是用R中的HoltWinters()方法,这里我们需要用到alphabeta两个参数,所以只需要设置gamma=FALSE就行。给女性裙子边缘直径的变化这个时间序列做预测模型过程如下:

计算机生成了可选文字: 3klrts3erle3foreca3ts<一Hol七Winte二3(3k工rt33e二ie3,ga刀”毛a=FALSE)SklltSSellesf0工eC己StS>>Holt一WintersexponentialSlnaa七hlnqwl七htrendandwl七hou七3ea3onalcomponen七.Cdll:Hol七Winters(x=sk王r七53erle5,q己nlt己=F几工SE)Smoo七hingparalne七e了s:alpha:0.8383任8几betd:1qa刀口厄a:FA乙SECoeff1Clen七吕:[,1]d529。308585bs。690任6任>3ki了七33e二工e3fo工ec己吕七5场55已11]1695弓.18

alphabeta的值分别为0.8381,都很大,说明时间序列水平和趋势部分的预测值,对近期观测数据所取的权重较大。这个结果从该时间序列随时间的水平和趋势变化都很大,就能很直观看出来。改时间序列预测的误差项平方和SSE结果是16954.18

查看预测结果时间序列图:

计算机生成了可选文字: 》plat(3klrt33erle3foreca3七3)

 

计算机生成了可选文字: Holt·Wintersnltering00600卜po州一U-、p山IUOSqO00旧18701880189019001910Time

上图可以看出,除了预测结果有很小的滞后外,预测值时间序列和实际值序列很接近。

也可以自己设置初始的水平值和趋势值,HoltWinters()方法中的l.startb.start这两个参数用来设置初始值。初始水平值一般取第一个时间点的值,初始趋势值则常取第二个值与第一个值的差值。这个例子中,分别是6089(617-608)

尝试设置l.startb.start的值,再对女性裙子边缘直径时间序列做预测,结果如下,与之前的结果有了一些不同。

计算机生成了可选文字: >HoltWinte工SHOlt一Winte工3(skirt33erie3qanu毛a=FALSE,1.3ta二t=608b.3ta二t=9)exponen七王alsrnoo七hinqwl七h七rendandw工七hou七3ea昌analcalnponen七.Cdll:HaltWinters(x=昌klrt55erles,qan立皿a=FALSE,1.3七ar七=608,b.3tart=9)smao七hlnqparalne七er3:alpha:0.83性6775bet己:工qa刃山卫a:FA毛SECOeffiClentS:[,11d529。278637bs。670129

前面是同期的预测,同样可以用forecast包中的forecast.HoltWinters()方法对未来做预测。女性裙子边缘直径数据是从1866年到1911年的,对此我们可以做从1911年之后的预测。如若想要1912年到193019期的预测数据,如下操作:

计算机生成了可选文字: sklrt33erle3fa了eca3t32<一foreca3t.HoltWinter3(3klrt33erie3foreca3t3,h=19)plat.farecast(3klrt33erlesforeca3t32)>>

 

计算机生成了可选文字: FOFeCastSfFOmHO!twinteFS00咱}00咱000r.1870188018901900191019201930

与之前用HoltWinters()方法做预测结果一样,蓝线是预测值,深色区域是预测结果的80%置信区间,浅色部分是95%的置信区间。

重复前面用相关性函数来看看是否需要优化模型的过程。

计算机生成了可选文字: >acf(3k工r七33erle3fareca3t32$re3idual3,laq.几ax=20)>Box.te3t(3klrt33erle3foreca3tsZ$re31dua13,lag=20,type,"Ljunq一Bax")Box一Ljunqte3七data:X一3quSklrt3Serie3fO了eCast32gre3idUa1Sared,19.7312,df,20,p一value,0.4749

 

计算机生成了可选文字: SeriesskirtsseriesforecastsZ$residualsU-O<咱.0.八U,L15产.飞J‘马」月..a.』05

在滞后期为5时,预测误差的自相关结果超过了意义界限,所以,这里我们需要进一步的检测。查看Box-Ljung测试的结果,可以看看到,p值为0.4749,这个值很小,样本的预测误差在1-20的滞后期内,存在非零自相关的可能很小。

对简单指数平滑,还需要查看预测误差是不是存在不变方差,并以0为中心呈正态分布。类似的过程,使用之前的plotForecastErrors()方法。

计算机生成了可选文字: plat.七3(3klrt33eriesforeca3tsZ写reslduals)plotForeca3tE了二or3(3k工r七33e二工e3fo二ecast32写re3idual3)>>

计算机生成了可选文字: O寸O入00入·slenpls。J$闪s}se。ejo』s。工J。55七一艺s18701880189019001910Time

 

计算机生成了可选文字: HistogramOfforecasterrorSO钊0.0OrO.O必一su.0000.0一100一5050foreCasterrorS

从上面两个图,能看出,预测误差的方差随时间的变化可以认为是大致稳定的,预测误差也基本满足正态分布。所以,结论是,用霍特双指数平滑模型对从1866年到1911年每年女性裙子边缘直径的时间序列做预测是合适的,预测结果经过检验也是有效的。

霍特季节性指数平滑(Holt-Winters Exponential Smoothing)

如果时间序列满足增量模型,存在升降趋势,并且是季节性的数据。这时,可用霍特季节性指数平滑法来做短期预测。

霍特季节性指数平滑法,包含三个参数α、β和γ。α平滑常数,β是趋势常数,γ是季节常数。三个参数的取值范围都是0-1。在R中的实现,还是使用HoltWinters()方法,这一次,它的三个类似参数,我们都需要用到。

使用的时间序列数据是前面取对数后的昆士兰沙滩旅游胜地的某一纪念品店的销售数据。

计算机生成了可选文字: 尸rOr68s。工Ja,s。任工七一ua,,nos口。一19871989199,1993Time

 

计算机生成了可选文字: souvenir七lmeselie3foreca3t3<一Holtwin七er3(lag3ouvenirtl几e3erle3)SOUVenlrtlnese了le3fOleCast3>>Holt一Win七ersexponen七ialsmoothinqwithtrendandaddltlveseasonalcolnponen$Cdll:HoltWinte:s(x=loqsauvenlr七1几e3elle3)smoo七hingalpha:0be七a:Oq己nu肚a:0pdl己现e七eI3:。413418。9561275COeff1Clents:[,11a10。37661961bo。0299631931一0。8Q95206352一0。60576477530。011032385任一0。2任16055155一0。3593351756一0。18076683570。07788605580。101任7055590。096任93535100。051978265110。性17936373121。18088任23

 

计算机生成了可选文字: >3ouvenlrtl现e3e二le3foreca3t3容SSE11]2.011491

alphabetagamma的值,分别是0.413400.956alpha的值比较小,表明该时间序列的某一时间点的水平预测值,是基于近期观测值和远期观测值。beta0,表明时间序列趋势部分值不随时间变化而改变的,也就是所有时间点上,趋势的预测值都是初始值。gamma0.956,这说明季节性部分的预测值,对近期观测值所取得权重很大。

查看预测结果,如下:

计算机生成了可选文字: >plo七<souven工rtl瓦e3e二le3fo二eca3t3)

 

计算机生成了可选文字: Holt·Wintersnltering尸ro尸68p田划一U-、paIUasqO1988198919901991199219931994T1me

从图上,可以看出,霍特季节性指数平滑方法在做这个时间序列的季节性预测时很成功,预测结果与原始数据的11月销售高峰很贴切。

接下来,对未来做预测,还是用forecast包。

计算机生成了可选文字: 3ouvenir七工瓦e3e二le3fo二eca3t32<一foreca3七.HoltWin七e二3(3auven工rt工几e3e二王e3fareca3t3,h,曦8)plot.foreca3七(3auvenlrtlme3erle3foreca3t32)>>

 

计算机生成了可选文字: FOFeCastSfFOmHoltwinteFS只寸}内L囚r}}198819901992199419961998

下面对预测结果做检验,看预测模型是否需要改进。同样的方法计算相关性和做Ljung-Box检验。过程及结果如下:

计算机生成了可选文字: >acf(3ouvenirti皿e3erie3foreca3t32车re3idual3,laq.rnax=20)>Box.te3七(吕ouven工r七工现e3er王e3foreca3七32车re3工dua15,la于20,七卯e="Ljunq一Box时)Bax一Ljungte3tdd七d:X一吕qu昌auvenl工七l兀eserlesfo工ec已5t52s二es工du已15ared=17.530任,df=20,p一value=0.6183

 

计算机生成了可选文字: SeriessouvenirtimeseriesforecastsZ$residuals甲〔〕?O寸.0U-0哎卿〔〕9《习钊.0.0_00_5Lag

样本的预测误差的自相关结果,在1-20的滞后期中,没有超出意义界限。并且Ljung-Boxp值小,说明在1-20的滞后期中,存在非零自相关的可能性很小。

然后检验预测误差是有不变方差,以0为中心呈正态分布。过程结果如下:

计算机生成了可选文字: plo七.t3(souvenirtine3erie3foreca3t32$re51duals)plo七Foreca3七Error3(3ouvenlr七工meserlesforecas七sZSresiduals)>>

计算机生成了可选文字: 寸.0入.00.0入.0·寸O·竺mnpls。J$闪s}se。。Jo』s。一J。s。任一七一u。,nos1988198919901991199219931994TIme

 

计算机生成了可选文字: HistogramofforeCasterrorSp介〕吵〔〕9〔〕们.入O入们.}OL必一suao一1_0一05O_005,0foreCasterrors

可看出,预测误差的方差可认为是随时间稳定的,其分布也符合正态分布。所以这个例子中,使用霍特季节性指数平滑所做的预测结果是有效的。

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值