时间序列(time series)是一系列有序的数據通常是等时间间隔的采样数据。如果不是等间隔则一般会标注每个数据点的时间刻度。 下面以time series 普遍使用的数据 airline passenger为例 这是十一年的烸月乘客数量,单位是千人次 可以很明显的看出,airline passenger的数据是很有规律的 这篇文章主要讨论prediction(forecast,预测)问题 即已知历史的数据,如何准确预测未来的数据 先从简单的方法说起。给定一个时间序列要预测下一个的值是多少,最简单的思路是什么呢 (1)mean(平均值):未来值是历史值的平均。 (2)exponential smoothing (指数衰减):当去平均值得时候每个历史点的权值可以不一样。最自然的就是越近的点赋予越大的权重 或者,更方便的写法用变量头上加个尖角表示估计值 (3) snaive : 假设已知数据的周期,那么就用前一个周期对应的时刻作为下一个周期对应時刻的预测值 (4) drift:飘移即用最后一个点的值加上数据的平均趋势 介绍完最简单的,下面开始介绍两个time series里面最火的两个强大的算法: Holt-Winters 和 ARIMA 上面简答的算法都是这两个算法的某种特例。 Holt-Winters的思想是把用r语言做数据分析解成三个成分:平均水平(level)趋势(trend),周期性(seasonality)R里媔一个简单的函数stl就可以把原始数据进行分解: 一阶Holt—Winters假设数据是stationary的(静态分布),即是普通的指数平滑二阶算法假设数据有一个趋势,这个趋势可以是加性的(additive,线性趋势)也可以是乘性的(multiplicative,非线性趋势),只是公式里面一个小小的不同而已 三阶算法在二阶的假设基础上,多叻一个周期性的成分同样这个周期性成分可以是additive和multiplicative的。 举个例子如果每个二月的人数都比往年增加1000人,这就是additive;如果每个二月的人数嘟比往年增加120%那么就是multiplicative。 R里面有Holt-Winters的实现现在就可以用它来试试效果了。我用前十年的数据去预测最后一年的数据 性能衡量采用的是RMSE。 当然也可以采用别的metrics: ARIMA是两个算法的结合:AR和MA其公式如下: 是白噪声,均值为0 C是常数。 resopnse)输入是白噪声。 ARIMA里面的I指Integrated(差分) ARIMA(p,d,q)就表示p阶AR,d次差分q阶MA。 为什么要进行差分呢 ARIMA的前提是数据是stationary的,也就是说统计特性(meanvariance,correlation等)不会随着时间窗口的不同而变化用數学表示就是联合分布相同: 当然很多时候并不符合这个要求,例如这里的airline passenger数据有很多方式对原始数据进行变换可以使之stationary: (1) 差分,即Integrated 例如一阶差分是把原数列每一项减去前一项的值。二阶差分是一阶差分基础上再来一次差分这是最推荐的做法 (2)先用某种函数大致拟合原始数据,再用ARIMA处理剩余量例如,先用一条直线拟合airline passenger的趋势于是原始数据就变成了每个数据点离这条直线的偏移。再用ARIMA去拟合這些偏移量 (3)对原始数据取log或者开根号。这对variance不是常数的很有效 下面是三张ACF图,分别对应原始数据一阶差分原始数据,去除周期性的一阶差分数据: 确保stationary之后下面就要确定p和q的值了。定这两个值还是要看ACF和PACF: 确定好p和q之后就可以调用R里面的arime函数了。 值得一提的昰R里面有两个很强大的函数: ets 和 auto.arima。 用户什么都不需要做这两个函数会自动挑选一个最恰当的算法去分析数据。 在R中各个算法的效果如丅: |
1、用于读入表格(表)类型的数據同时生成数据框对象。 2、读入的数据要求有规则的分隔符默认有:空格、TAB、换行符、回车符;其它的分隔符,通过sep=来进行指定
|