5/16/2021

数据导入与探索

  • 1 导入数据
##        Jan   Feb   Mar   Apr   May   Jun   Jul   Aug   Sep   Oct   Nov   Dec
## 1985 134.6 146.5 137.9 141.2 144.4 146.0 145.1 145.4 147.2 145.9 143.8 144.2
## 1986 143.0 147.1 147.9 149.2 150.2 151.3 151.5 150.8 149.0 145.7 145.7 146.0
  • 2 查看数据波动情况

可以发现数据中两个波峰依次出现,数据中可能具有一定的周期性

  • 3 时间序列平稳性检验

时间序列是否是平稳的,对选择预测的数学模型非常关键。如果一组时间序列数据是平稳的,可以直接使用自回归移动平均模型(ARMA进行预测,如果数据是不平稳的,就需要尝试建立差分移动自回归平均模型(ARIMA等进行预测。

## 
##  Augmented Dickey-Fuller Test
## 
## data:  timets
## Dickey-Fuller = -2.3072, Lag order = 6, p-value = 0.4469
## alternative hypothesis: stationary

p-value = 0.4469大于0.05,说明时间序列是不平稳的,需要对数据进行查分后检验其平稳性。

  • 4 差分后检验其平稳性
## 
##  Augmented Dickey-Fuller Test
## 
## data:  timetsdiff
## Dickey-Fuller = -4.9253, Lag order = 6, p-value = 0.01
## alternative hypothesis: stationary

p-value = 0.01,说明在置信度为90%的情况下,可认为查分后是平稳的。

  • 5 可视化差分后的时间序列
## 序列可视化
p2 <- autoplot(timetsdiff)+labs(title = "时间序列一阶差分后波动情况")
p2

从数据的波动情况也可以认为经过一阶差分后是平稳的。

如果使用差分移动自回归平均模型(ARIMA(p,d,q)),可以认为其中参数d的取值为1。

  • 6 一阶差分后序列的自相关系数和偏自相关系数

  • 自相关系数

  • 偏自相关系数

可用于分析差分移动自回归平均模型(ARIMA(p,d,q))中的刹那参数p和q的取值。

自动搜索合适的时序模型参数

  • 1 自动搜索合适的时序模型参数
mol <- auto.arima(timets)
summary(mol)
## Series: timets 
## ARIMA(2,1,1)(2,0,0)[12] 
## 
## Coefficients:
##          ar1     ar2      ma1    sar1    sar2
##       0.6267  0.1908  -0.6561  0.3648  0.3078
## s.e.  0.1301  0.0747   0.1167  0.0675  0.0701
## 
## sigma^2 estimated as 10.82:  log likelihood=-593.19
## AIC=1198.39   AICc=1198.77   BIC=1218.94
## 
## Training set error measures:
##                        ME     RMSE      MAE        MPE     MAPE      MASE
## Training set 0.0004877605 3.246274 2.365766 0.01156064 1.334264 0.2074222
##                     ACF1
## Training set 0.001409767

  • 2 可视化模型对后面24个数据的预测结果
## 可视化模型预测结果
p5 <- autoplot(forecast(mol,level = c(80,95), h = 24))+
  theme(plot.title = element_text(hjust = 0.5))
p5

模型的预测结果是以后的数据波动趋势是略微下降的

使用prophet包预测时间序列

  • 1 准备工作

prophetFacebook的一款开源的时序预测工具,也提供了基于R调用的prophet包,该包提供的基本模型为:

\[y=g(t)+s(t)+h(t)+\epsilon\]

  • \(g(t)\):增长函数,用来表示线性或非线性的增长趋势

  • \(s(t)\):表示周期性变化,变化的周期可以是年、季度、月、每天等

  • \(h(t)\):表示时间序列中那些潜在的具有非固定周期的节假日对预测值造成的影响

  • \(\epsilon\):为噪声项,表示随机的无法预测的波动

  • 数据准备

  • 2 使用prophet()函数进行预测
library(prophet)
## 建立具有季节趋势的模型
model <- prophet(timedf,growth = "linear",
                 yearly.seasonality = "auto",weekly.seasonality = "auto",
                 daily.seasonality = "auto",
                 seasonality.mode = "multiplicative")
## 预测后面两年的数据,并将预测结果可视化
future <- make_future_dataframe(model, periods = 24,freq = "month")
forecast <- predict(model, future)
plot(model, forecast)

  • 3 可视化预测的组成部分
## 可视化预测的组成部分,主要有线性趋势和季节趋势
prophet_plot_components(model, forecast)

一共有两个子图,分别为线性趋势曲线图周期趋势曲线图

线性趋势表明数据整体上是逐年增加的

周期趋势表明一年中每个时间段数据的波动情况

谢谢