你是否想要做时间序列分析,但却不知道代码怎么写?
你是否不清楚时间序列分析各种模型该在什么情况下使用?
本文将针对以上两个问题,带你入门时间序列分析~
等等!
不止’入门‘
读完这篇,你立即就能在R中写出不同模型的相应代码~
先介绍以下我自己吧~
我目前是Warner Bros.做Data Scientist,记得刚入职时,老板就跟我说未来我的主要任务是用各种类型的时间序列模型做预测:预测好莱坞游览车未来三年每天的乘客数量、预测, ,等华纳出品的电影每分钟的观看量,预估艾伦秀不同播出计划的未来收视率和收入等等等等~~~
刚入职的第一个月每天愁眉不展,时间序列的方法很多,很多时候,即使理论基础学懂了,但是到实践上,R里的code要怎么写又是个大问题,网上的很多教程,教授了公式,却不教授具体的代码怎么写。
幸运的是,老板是个比较技术咖的人,他教会了我很多实际操作上的东西,结合我过去七个月做过的各种时间序列模型,决定好好总结一下时间序列常见模型各自的适用场合、特征等理论知识,更重要的是,每个模型在R里的具体代码实现以及操作步骤,希望能帮助到需要使用R来做时间序列的朋友们~
时间序列数据是在一段时间内作为时间间隔序列收集的数据点。时间序列数据分析意味着对可用数据进行分析,以找出数据的模式或趋势,从而预测一些将来的价值,这些价值将有助于提高效率并优化业务决策。
常见的用于时间序列分析的技术:ARIMA模型
指数平滑模型
本篇将介绍 - ARIMA模型在R中如何使用
ARIMA建模
ARIMA是AutoRegressive集成移动平均线的缩写。自回归(AR)项是指差分序列的滞后,移动平均(MA)项是指误差的滞后,而I是用于使时间序列平稳的差分数。
ARIMA模型假设数据平稳 – 这意味着数据的变化不依赖于时间变化。白噪声序列和具有循环特性的序列也可以视为平稳序列。
数据应为单变量– ARIMA处理单个变量。自动回归就是关于过去值的回归。
(PS: 对于有外部变量的数据,可以使用ARIMAX模型,这个将在下一篇中介绍)
以下步骤1~5,很重要!很重要!!
ARIMA建模要遵循的步骤将数据集转化为时间序列格式
作图分析数据
确定p,d,q
拟合模型
做出预测
下面将根据建模步骤来介绍R中code
首先,导入需要用到的包:
library(ggplot2) #作图
library(forecast) #建模
library(dplyr) # 数据处理
library(lubridate) # 时间处理
将数据集转化为时间序列格式
使用R进行时间序列数据建模的第一步是将数据转换为时间序列数据格式。为此,我们需要在R中运行以下命令:
wbstl_weekly_data_ts = ts(wbstl_weekly_data$weekly_totalgross,frequency = 365.25/12,
start= decimal_date(ymd('2011-01-01')))wbstl_weekly_data$weekly_totalgross是我们要转换为时间序列的单变量数据
start给出数据的开始时间,在本例中为2011年1月。
frequency是数据的频率。由于它是月度数据,所以'frequency = 12'。(每周的数据,则frequency=52; daily data,则frequency=365.25)
2. 作图分析数据
ggplot(wbstl_weekly_data, aes(x =month, y = weekly_totalgross)) + geom_line()
这是数据的样子:
我们可以从图本身推断出,数据点遵循总体上升趋势,但在突然降低的值方面有一些异常值。现在,我们需要进行一些分析,以找出数据中确切的非平稳性和季节性。
3. 确定p,d,q
数据准备就绪并满足所有建模假设后,要确定要拟合数据的模型的顺序,我们需要三个变量:p,d和q,它们是指代负顺序的非负整数。模型的自回归,积分和移动平均值部分。
要找到合适的p和q值,我们需要使用acf()并pacf()。
pacf()滞后k是自相关函数,它描述了相距k步的所有数据点之间的相关性-在考虑了它们与这k步之间的数据的相关性之后。它有助于识别ARIMA模型中的自回归(AR)系数(p值)的数量。
acf(tsstationary,lag.max = 34)
pacf(tsstationary,lag.max = 34)
结果如下:
ACF用以确认q, 图中可以看出q = 1
PACF用以确认p = 2
处理好了数据,下面 进入最重要的部分:模型拟合 + 预测
4. 模型拟合
fitARIMA
order 指定ARIMA模型的非季节部分:(p,d,q)指AR阶,差异度和MA阶。
seasonal指定ARIMA模型的季节性部分,加上周期(此处是月度数据,所以为12)。该函数需要一个包含组件顺序和周期的列表,但是给定长度为3的数字矢量,它将把它们变成一个合适的列表,其规格为“ order”。
method表示拟合方法,可以是“最大似然(ML)”或“最小平方和(CSS)”。
这是一个递归过程,我们需要arima()使用不同的(p,d,q)值运行此函数,以找到最优化和高效的模型。
上述介绍的是怎么手动根据数据确定ARIMA模型中各参数,这边还有个懒人方法 (实践中更多也是使用该懒人方法 - auto.arima() )
auto.arima()功能:
预测程序包提供两个功能:ets()和auto.arima()用于自动选择指数模型和ARIMA模型。
auto.arima()R中的函数结合了单位根测试,最小化AIC和MLE来获得ARIMA模型。
KPSS检验用于确定差异数量(d)在Hyndman-Khandakar算法中,用于自动ARIMA建模。
然后通过最小化AICc来选择p,d和q。该算法使用逐步搜索遍历模型空间,以选择具有最小AICc的最佳模型。
如果d = 0,则常数c被包括在内;如果d≥1,则常数c设置为零。通过将当前模型的p和/或q改变±1并包括/排除当前模型中的c来考虑当前模型的变化。
到目前为止考虑的最佳模型(当前模型或这些变体之一)成为新的当前模型。
现在,重复此过程,直到找不到更低的AIC。
auto.arima(tsData,seasonal.test="ch",
parallel=TRUE,num.cores=8,stepwise=FALSE,approximation=FALSE)
该行code,运行时间较长,上周我用了1140个数据点,运行了1.5hr
5. 使用ARIMA模型进行预测
一旦为时间序列数据选择了最合适的模型,该ARIMA模型的参数就可以用作预测模型来预测时间序列的未来值。
使用predict()的函数 - 用于根据各种模型拟合函数的结果进行预测。它需要一个参数n.ahead()来指定要预测多少时间。
predict (fitARIMA,h = 5)
意思就是对未来5个月进行预测
forecast.Arima()forecastR包中的函数还可用于预测时间序列的未来值。在这里,我们还可以使用level参数指定预测间隔的置信度。
futurVal
plot.forecast(futurVal)
我们需要确保预测误差不相关,正态分布为均值零和恒定方差。我们可以使用诊断方法找出具有最佳可能预测值的适当模型。
预测显示为蓝线,而99.5%置信度水平的预测间隔为浅阴影区域。
这是整个过程,我们可以使用ARIMA分析时间序列数据和现有序列的预测值。
总结一下:
ARIMA建模要遵循的步骤将数据集转化为时间序列格式
作图分析数据
确定p,d,q / 或只用auto.arima()
拟合模型
做出预测
大家看完别忘了赞一个让更多人看到
另外,欢迎关注我的专栏: 煮一锅数据汤
专栏定期分享数据分析方面干货,如时间序列模型实践、机器学习模型讲解、R编程语言操作、SQL小白入门等煮一锅数据汤zhuanlan.zhihu.com