建立时间序列数据
建立时间序列,必须有日期作为数据框的一列。R语言建立时间序列的函数是ts(),它的格式如下:
ts(gm,frequency=12,start=c(year,month))
其中,gm表示时间列数据;frequency表示时间单位,它的值常用的有12、4、365,它们分别表示每一个时间单位中有12个月、4个季度、365日观察值,start表示时间序列的开始时间。
例如,我们构造一个含有30个值的时间序列(1~30),开始时间为2011年3月,以每个月作为观察值。代码如下:
> a <- ts(1:30, frequency = 12, start = c(2011,3))
> print(a)
Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2011 1 2 3 4 5 6 7 8 9 10
2012 11 12 13 14 15 16 17 18 19 20 21 22
2013 23 24 25 26 27 28 29 30
> str(a)
Time-Series [1:30] from 2011 to 2014: 1 2 3 4 5 6 7 8 9 10 ...
> attributes(a)
$tsp
[1] 2011.167 2013.583 12.000
$class
[1] "ts"
时间序列分解
时间序列分解就是将时间序列分解为趋势、季节性、周期性以及不规则这几个成分。趋势成分指长时间间隔的大致运动方向,季节性成分指季节性的变化,周期性成分指重复但非周期的波动,最后是不规则成分。
下面是在时间序列数据AirPassengers上演示时间序列的分解,该数据是由国外某机场1949年到1960年每月乘客总数的数据构成,共有144(=12*12)条数据,时间序列图如下:
> plot(AirPassengers)
下面使用decompose()函数将数据集分解成不同惩罚呢,分解代码如下:
> apts <- ts(AirPassengers, frequency = 12)
> f <- decompose(apts)
>#季节性分解
> print(f$figure)
[1] -24.748737 -36.188131 -2.241162 -8.036616 -4.506313 35.402778
[7] 63.830808 62.823232 16.520202 -20.642677 -53.593434 -28.619949
> plot(f$figure, type = "b", xaxt="n", xlab = "")
> monthNames <- months(ISOdate(2011,1:12,1))
> axis(1,at=1:12, labels = monthNames, las=2)
> plot(f)
上图中,第一个图表为原始时间序列数据,第二个图表为数据的趋势,第三个图表为季节性因素,最后一个图表为剔除了趋势和季节性因素之后的其他成分。
时间序列预测
时间序列预测是根据历史数据来预测未来事件。一个时间序列预测的例子是基于股票过去的形式来预测其开盘价。两个常用的时间序列预测模型为自回归移动平均模型(ARMA)和自回归综合移动平均模型(ARIMA)。
下面使用ARMA拟合单变量时间序列,并使用拟合模型进行预测,代码如下:
> fit <- arima(AirPassengers, order = c(1,0,0), list(order=c(2,1,0), period=12))
> fore <- predict(fit, n.ahead = 24)
> U <- fore$pred + 2*fore$se
> L <- fore$pred - 2*fore$se
> (AirPassengers, fore$pred, U, L, col=c(1,2,4,4), lty=c(1,1,2,2))
> legend("topleft",c("Actual","Forecast", "Error Bounds(95% Confidence)"), col=c(1,2,4), lty=c(1,1,2))
图中,实线表示预测值,虚线表示在置信度水平95%下的误差边界。