时间序列分析
使用软件为Rstudio,参考CRAN中时间序列分析分析函数和package,拿手上的数据练习一下时间序列分析。
1、原始数据说明
选择连续9天的数据,共2025条,时间间隔为5分钟。具体情况如下:
2、平稳性检验
所谓平稳,是指因变量围绕着一个常数上下波动。更学术一点,就是是说统计特性(mean,variance,correlation等)不会随着时间窗口的不同而变化。
2.1 时间序列可视化
因为一些高阶函数可能不能准确地产生我想要的图,所以我这里用的是低阶图形命令手动设置label。首先把plot()函数里的默认坐标轴关掉:xaxt='n'
,然后通过axis()函数手动添加坐标轴。代码如下:
plot(indata,type = "s",xaxt='n',xlab = "time")
axis(1,c(1,226,451,676,901,1126,1351,1576,1801),c('5:00','5:00','5:00','5:00','5:00','5:00','5:00)
生成图形如下:
由上图可知:
1. 该时间序列存在很强的周期性
2. 该时间序列是平稳的。
还可以用xts函数把原始数据转换成时间序列,也就是把给每个数据对应上一个时间点,代码如下
data_1<-xts(indata_1,seq(ISOdate(0, 0, 0, 5, 0, 0),ISOdate(0, 0, 0, 23, 40, 0),by="5 mins"))
plot(data_1)
进一步绘制每一天的箱型图,代码如下:
library(ggplot2)
ggplot(data,aes(x=factor(STATDATE),y=INDATA)) + geom_boxplot()
由上图可知:
- 周末的异常点较少,平日的异常点较多,说明平日存在高峰情况。
2.2 自相关和偏自相关图
此外,还可以通过自相关和偏自相关图来判断时间序列是否平稳。平稳的序列的自相关图和偏相关图不是拖尾就是截尾。截尾是指在某阶之后,系数都为 0;拖尾是指有一个衰减的趋势,但是不都为0。
ACF形状 | 模型 |
---|---|
不衰减到0 | 不平稳 |
固定点上有大于0的值(周期性) | 周期性 |
所有点都是0 | 完全随机(白噪声) |
指数衰减到0(拖尾) | AR(p) |
正负交替衰减到0(拖尾) | AR(p) |
前几个大于0,后面都为0(截尾) | MA(q) |
绘制采用R中acf(indata)
函数(默认滞后30阶)的自相关图和偏自相关图如下:
由上图可知:
- 自相关图逐渐衰减到0,存在拖尾性,偏自相关图在5阶后都为0,存在截尾性。说明该时间序列在短期内(30阶)是平稳时间序列。
考虑到滞后阶数为30,而该原始数据的周期性可能要到225阶以后才能体现出来。设置自相关图的滞后阶数为500,代码如下:
acf(indata,lag=500)
pacf(indata,lag=500)
2.3 ADF单位根平稳型检验
单位根检验是指检验序列中是否存在单位根,因为存在单位根就是非平稳时间序列了。[百度百科]
此处使用tseries包中的adf.test()
函数对9天数据进行单位根平稳性检验,结果如下:
> adf.test(indata)
Augmented Dickey-Fuller Test
data: indata
Dickey-Fuller = -7.1486, Lag order = 12, p-value = 0.01
alternative hypothesis: stationary
aternative hypothesis称为备择假设,与原假设相对。这里备择假设是该时间序列平稳。因为p值小于0.05,拒绝原假设,接受备择假设,所以说明该时间序列是平稳的。
有意思的是,我单独拿一天的数据出来做单位根检验,可以发现该时间序列并不平稳。
> adf.test(indata_1)
Augmented Dickey-Fuller Test
data: indata_1
Dickey-Fuller = -1.0092, Lag order = 6, p-value = 0.9351
alternative hypothesis: stationary
3、时间序列模型选择
3.1 常用的时间序列模型
下面简单介绍下常用的时间序列模型:
- 移动平均(MA, moving average)
MA(1):Yt=α0+α1ut−1+ut
MA(q):