时间序列分解DecomposeWord下载.docx
《时间序列分解DecomposeWord下载.docx》由会员分享,可在线阅读,更多相关《时间序列分解DecomposeWord下载.docx(10页珍藏版)》请在冰豆网上搜索。
kings
[1]604367505642506568436534473449411335535616436959485986556851334967778167718168707756
上述例子中,读入了连续42个公国国王的寿命并将其赋给变量‘kings’
如果我们希望对读入数据开展分析,下一步就是将其转化为时间序列对象(时间序列类),R提供了很多函数用于分析时间序列类数据。
可以使用ts函数将变量转化为时间序列类。
kingsts<
-ts(kings)
kingsts
TimeSeries:
Start=1
End=42
Frequency=1
对于上述数据操作的好处是将数据转化为特定的“时间序列类”便于我们使用R中的函数分析数据。
有时候我们会按照一定的时间周期来收集数据,这个周期可能是季度,月,日,小时,分。
在大数据时代,有些情况下的数据是按照秒来采集收集。
这种情况下,我们需要对数据的周期或频率进行设置。
这里采用ts函数中的frequency参数可以实现这种功能。
比方说,若按1年为一个周期,我们的月度时间序列数据应为frequency=12,若为季度时间序列数据,则可设置frequency=4。
另外,还可以利用start参数,设置时间序列的起点,比如若我们一个周期共4个观测,而第一个数据对应为1986年的起的第2个观测,则可使用start=c(1986,2)。
有一个纽约市月出生数量的数据集,从1946年1月至1959年12月。
数据可通过获取。
我们将其读入至R中。
births<
Read168items
birthsTS<
-ts(births,frequency=12,start=c(1946,1))
birthsTS
JanFebMarAprMayJunJulAugSepOctNovDec
194626.66323.59826.93124.74025.80624.36424.47723.90123.17523.22721.67221.870
194721.43921.08923.70921.66921.75220.76123.47923.82423.10523.11021.75922.073
194821.93720.03523.59021.67222.22222.12323.95023.50422.23823.14221.05921.573
194921.54820.00022.42420.61521.76122.87424.10423.74823.26222.90721.51922.025
195022.60420.89424.67723.67325.32023.58324.67124.45424.12224.25222.08422.991
195123.28723.04925.07624.03724.43024.66726.45125.61825.01425.11022.96423.981
195223.79822.27024.77522.64623.98824.73726.27625.81625.21025.19923.16224.707
195324.36422.64425.56524.06225.43124.63527.00926.60626.26826.46225.24625.180
195424.65723.30426.98226.19927.21026.12226.70626.87826.15226.37924.71225.688
195524.99024.23926.72123.47524.76726.21928.36128.59927.91427.78425.69326.881
195626.21724.21827.91426.97528.52727.13928.98228.16928.05629.13626.29126.987
195726.58924.84827.54326.89628.87827.39028.06528.14129.04828.48426.63427.735
195827.13224.92428.96326.58927.93128.00929.22928.75928.40527.94525.91226.619
195926.07625.28627.66025.95126.39825.56528.86530.00029.26129.01226.99227.897
类似的,文件中包含了澳大利亚昆士兰州的一个海滩小镇纪念品商店的月销量数据,时间从1987/01~1993/12(数据来源WheelwrightandHyndman,1998)。
我们用下述代码将其读入至R中。
souvenir<
Read84items
souvenirTS<
-ts(souvenir,frequency=12,start=c(1987,1))
souvenirTS
19871664.812397.532840.713547.293752.963714.744349.613566.345021.826423.487600.6019756.21
19882499.815198.247225.144806.035900.884951.346179.124752.155496.435835.1012600.0828541.72
19894717.025702.639957.585304.786492.436630.807349.628176.628573.179690.5015151.8434061.01
19905921.105814.5812421.256369.777609.127224.758121.227979.258093.068476.7017914.6630114.41
19914826.646470.239638.778821.178722.3710209.4811276.5512552.2211637.3913606.8921822.1145060.69
19927615.039849.6914558.4011587.339332.5613082.0916732.7819888.6123933.3825391.3536024.8080721.71
199310243.2411266.8821826.8417357.3315997.7918601.5326155.1528586.5230505.4130821.3346634.38104660.67
2数据可视化
上述章节中我们读入并生成了3个时间序列数据分别为,kingsts,birthsTS和souvenirTS。
数据分析的后续过程为可视化过程,让有关人员可以从直观角度来认识数据的变化规律。
plot函数提供了各种类的绘图功能
plot(kingsts)
上图中的时间序列看来的话,没有比较明显的周期性规律,直观判断上述时间序列类似于一个随机波动序列(平稳时间序列),后续我们会探讨如何判断序列为平稳时间序列。
我们对纽约市月出生数量画图,结果为
plot(birthsTS)
从上述结果看来,每个月的出生数量似乎含有一定的季节变化(周期性),在夏季较高,在冬季较低。
另外每个周期内的波动幅度(振幅)似乎是固定的,并不随时间序列的水平(趋势)变化而变化。
随机波动随时间变化也不明显。
我们同样对澳大利亚昆士兰州海滩旅游小镇纪念品商店的月销量数据画图。
从上图中可以看出误差波动和振幅都随时间水平增加而增加。
因此,我们需要对原始时间序列作出对数变换(取log),以便使用additive模型对数据开展分析预测。
直观上看来,上述的对数化时间序列的季节变化和随机变化随时间稳定在一个范围内,不随时间序列变化而变化。
因此,时间序列对数化可以用于additive模型。
3时间序列分解
时间序列分解主要针对非平稳时间序列,非平稳时间序列包含4种主要趋势:
长期趋势(Trend),循环趋势,季节趋势(Seasonal)和随机趋势(Random)。
可以利用additive模型分解长期趋势项和季节项。
使用R语言的decompose函数。
该函数可以分解出趋势项,季节项和随机项并利用additive模型描述时间序列。
时间序列分解的主要参考的函数有decompose函数和stl函数。
在这里我们先介绍decompose函数的主要思路。
相加分解模型(additive)的主要形式为:
xt=Tt+St+et
另外还有相乘模型(multiplicative),主要形式为:
xt=Tt*St*et
其中,在t时刻,xt为该时刻的观测值,Tt为该时刻的趋势值,St为该时刻的季节(周期)效应,et为该时刻的无规则部分,也就是剩余项。
一般而言,理想的分解模型结果中的剩余项应该为一个均值为0的随机变量。
我们先利用R的decompose函数,看看有关时间序列分解的结果,再从结果入手分析其具体数据分析处理流程。
分解我们之前的birthsTS数据,可视化后的结果为:
birthsTSDecompose<
-decompose(birthsTS)
plot(birthsTSDecompose)
decompose函数提供了additive和multiplicative2种方法来估算各分解项。
本文主要分析additive模型的分解步骤。
现在的已知条件:
时间序列,包含了时间序列的频率(frequency),起始时间(start)。
Step1:
分解出趋势项。
采用中心化移动平均值来计算趋势项,
当f为奇数时采用上述计算方法
当f为偶数时采用上述计算方法,其中Tt为趋势项,f为时间序列频率,l为时间序列长度。
结果为长度为l的时间序列,为便于后续的向量计算,当t超出上述下标的定义域时,其值为NA,如T1。
R中提供filter函数计算2个序列的线性滤波(卷积),上述时间序列xt的权重恰好为一个对称序列,因此可以通过线性滤波函数实现中心化移动平均,见如下代码:
f<
-frequency(birthsTS)
Ts<
-filter(birthsTS,c(0.5,rep(1,f-1),0.5)/f)
identical(Ts,birthsTSDecompose$trend)
[1]TRUE
Step2:
计算季节项。
1、采用将原始时间序列减去趋势项
2、将各个周期内相同频率下的值平均化,得到季节项figure
3、将figure中心化,得到中心化的季节项Figure,代码可表述为
figure=figure-mean(figure)
最终得到的的长度为f的季节项。
假设时间序列的频率为f,长度为l,设xt-Tt为St,则上述算法可以表示为:
用表格可以表示为
-
S1
S2
…
Sf
Sf+1
S2f+1
Snf+1
Sl
figure1
fugure2
figuref
注:
-为NA数据,其中St序列本身或已包含了NA数据。
Step3:
计算周期性季节项Seasonal,周期性季节项的计算则为将figure重复至长度为l的序列。
Step4:
计算随机项Random,随机项的计算方法为
4总结和展望
根据上述的分析可以看出R内置的decompose函数的核心为趋势项(step1)和季节项(step2)。
关于趋势项的计算采用了中心化移动平均的方法。
这种方法计算Ts时采用的x权重系数都是相同的,可以考虑采用自适应滤波的方法将各个权重系数做实时调整。
主要流程如下:
此外,若不采用自适应滤波法调整计算趋势项的x各项权重。
可以考虑对误差开展时间序列分析,进一步分解误差。
这个的讨论已经超出了本文的主题,后续将另作研究。
关于基本模型的设计方面,decompose采用了加法模型和乘法模型。
另外可以考虑采用混合模型,如
xt=Tt*St+et
基于上述模型建模,不在本篇讨论。
最后我们可以将分解的时间序列趋势项,季节项或者误差项作出预测。
如HoltWinters算法和stl算法均体现了时间序列分解在预测方面的应用。