5/16/2021
## 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
可以发现数据中两个波峰依次出现,数据中可能具有一定的周期性
时间序列是否是平稳的,对选择预测的数学模型非常关键。如果一组时间序列数据是平稳的,可以直接使用自回归移动平均模型(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,说明时间序列是不平稳的,需要对数据进行查分后检验其平稳性。
## ## 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%的情况下,可认为查分后是平稳的。
## 序列可视化 p2 <- autoplot(timetsdiff)+labs(title = "时间序列一阶差分后波动情况") p2
从数据的波动情况也可以认为经过一阶差分后是平稳的。
如果使用差分移动自回归平均模型(ARIMA(p,d,q)),可以认为其中参数d的取值为1。
6 一阶差分后序列的自相关系数和偏自相关系数
自相关系数
可用于分析差分移动自回归平均模型(ARIMA(p,d,q))中的刹那参数p和q的取值。
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
## 可视化模型预测结果 p5 <- autoplot(forecast(mol,level = c(80,95), h = 24))+ theme(plot.title = element_text(hjust = 0.5)) p5
模型的预测结果是以后的数据波动趋势是略微下降的。
prophet是Facebook的一款开源的时序预测工具,也提供了基于R调用的prophet包,该包提供的基本模型为:
\[y=g(t)+s(t)+h(t)+\epsilon\]
\(g(t)\):增长函数,用来表示线性或非线性的增长趋势
\(s(t)\):表示周期性变化,变化的周期可以是年、季度、月、每天等
\(h(t)\):表示时间序列中那些潜在的具有非固定周期的节假日对预测值造成的影响
\(\epsilon\):为噪声项,表示随机的无法预测的波动
数据准备
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)
## 可视化预测的组成部分,主要有线性趋势和季节趋势 prophet_plot_components(model, forecast)
一共有两个子图,分别为线性趋势曲线图和周期趋势曲线图。
线性趋势表明数据整体上是逐年增加的
周期趋势表明一年中每个时间段数据的波动情况