非平稳时间序列及建模
2017-11-13 00:00
363 查看
#差分运算
#差分示例
#ARIMA模型
#Box-Jenkins建模流程
#案例
实际上我们经常会遇到一些非平稳时间序列,往往会呈现明显的趋势性或周期性,可以通过适当差分等手段,将它化为平稳时间序列,再采用ARMA模型建模
差分运算
差分运算公式
一阶差分
二阶差分
d 阶差分
,其中 B 表示后移算子,
季节差分
D阶季节差分
差分示例
有时候差分还是不能够让序列平稳,那么我就可以使用对数转换等方式,然后再进行差分
ARIMA模型
差分方式的选择
序列蕴含着显著的线性趋势,一阶差分就可以实现趋势平稳
序列蕴含着曲线趋势,通常低阶(二阶或三阶)差分可以提取出曲线趋势的影响,有时则需要对序列做非线性变换
对于蕴含着固定周期的序列进行步长为周期长度s的差分运算(季节差分),可以较好地提取周期信息
Box-Jenkins建模流程
模型识别
自相关系数 偏
自相关系数
模型估计
最小化残差平方和
最小化AIC等等
模型验证
一些诊断方法会被用于检测模型的有效性
残差白噪声检验,模型系数显著性检验
用验证集数据来验证
模型预测
模型确定,用于预测
案例
自动选择模型
#差分示例
#ARIMA模型
#Box-Jenkins建模流程
#案例
实际上我们经常会遇到一些非平稳时间序列,往往会呈现明显的趋势性或周期性,可以通过适当差分等手段,将它化为平稳时间序列,再采用ARMA模型建模
差分运算
差分运算公式
一阶差分
二阶差分
d 阶差分
,其中 B 表示后移算子,
季节差分
D阶季节差分
差分示例
有时候差分还是不能够让序列平稳,那么我就可以使用对数转换等方式,然后再进行差分
ARIMA模型
差分方式的选择
序列蕴含着显著的线性趋势,一阶差分就可以实现趋势平稳
序列蕴含着曲线趋势,通常低阶(二阶或三阶)差分可以提取出曲线趋势的影响,有时则需要对序列做非线性变换
对于蕴含着固定周期的序列进行步长为周期长度s的差分运算(季节差分),可以较好地提取周期信息
Box-Jenkins建模流程
模型识别
自相关系数 偏
自相关系数
模型估计
最小化残差平方和
最小化AIC等等
模型验证
一些诊断方法会被用于检测模型的有效性
残差白噪声检验,模型系数显著性检验
用验证集数据来验证
模型预测
模型确定,用于预测
案例
> plot(tsdata) #做时序图观察,是否为平稳的序列,其实可以直接adf.test() 检测,如果显著则满足平稳,如下图
> log_tsdata<-log(tsdata) #因为数据变化幅度大,恐直接差分可能无法平稳,所以非线性变换,如进行log变换 > plot.ts(log_tsdata) #再绘制图形如下,发现变化幅度减小了
> log_tsdata_diff1=diff(log_tsdata,lag=12,differences=1)#lay=12表示差分周期(步长)12,differences=1表示一阶 > par(mfrow=c(3,1)) > plot.ts(log_tsdata_diff1) > acf(log_tsdata_diff1) #绘制 acf、pacf确定p、q的值 > pacf(log_tsdata_diff1) > adfTest(log_tsdata_diff1,type='nc') #平稳性检验 Title: Augmented Dickey-Fuller Test Test Results: PARAMETER: Lag Order: 1 STATISTIC: Dickey-Fuller: -1.3524 P VALUE: 0.1828 #不显著,结果并不平稳,在进行处理一次 Description: Wed Oct 18 09:47:53 2017 by user: Xu > log_tsdata_diff2=diff(log_tsdata_diff1,lag=1,differences=1)#步长为1的普通差分 > par(mfrow=c(3,1)) > plot.ts(log_tsdata_diff2) > acf(log_tsdata_diff2) > pacf(log_tsdata_diff2) > adfTest(log_tsdata_diff2,type='nc') Title: Augmented Dickey-Fuller Test Test Results: PARAMETER: Lag Order: 1 STATISTIC: Dickey-Fuller: -9.3424 P VALUE: 0.01 #显著表示平稳
#建立模型并评价模型 > arima.mod=arima(log(tsdata), c(0, 1, 1),seasonal = list(order = c(0, 1, 1), period = 12)) #preiod周期为12 #第一个c(0,1,1)表示一阶普通差分 #第二个seasonal = list(order = c(0, 1, 1), period = 12)表示按照周期12的步长,进行季节性差分 > arima.mod Call: arima(x = log(tsdata), order = c(0, 1, 1), seasonal = list(order = c(0, 1, 1), period = 12)) Coefficients: ma1 sma1 -0.4018 -0.5569 s.e. 0.0896 0.0731 sigma^2 estimated as 0.001348: log likelihood = 244.7, aic = -483.4 > resid=arima.mod$residuals #模型进行评价 > Box.test(resid) Box-Pierce test data: resid X-squared = 0.03, df = 1, p-value = 0.8624 > par(mfrow=c(1,1)) > qqnorm(resid) > qqline(resid)
#预测数据 > library(forecast) > arima.pred<-forecast(arima.mod,h=5*12) #预测5年的目标 > plot.forecast(arima.pred) > ts.plot(tsdata,exp(arima.pred$mean), lty = c(1,3)) > AIC(arima(log(tsdata), c(0, 1, 1),seasonal = list(order = c(0, 1, 1), period = 12)))#通过AIC判断那个模型参数最好,可手动设置c(p,d,q)中的参数进行尝试,选取AIC最小的 [1] -483.3991 > AIC(arima(log(tsdata), c(0, 1, 2),seasonal = list(order = c(0, 1, 1), period = 12))) [1] -481.6165
自动选择模型
> arima.new<-auto.arima(log(tsdata))#直接通过auto.arima来判断参数最合适 > arima.new Series: log(tsdata) ARIMA(0,1,1)(0,1,1)[12] Coefficients: ma1 sma1 -0.4018 -0.5569 s.e. 0.0896 0.0731 sigma^2 estimated as 0.001371: log likelihood=244.7 AIC=-483.4 AICc=-483.21 BIC=-474.77
相关文章推荐
- 平稳时间序列建模方法
- [转]高频交易数据的时间序列如何建模
- 数学建模高级方法(十):时间序列模型
- [时间序列分析][5]--非平稳时间序列模型与差分
- 第二章平稳时间序列模型——AR(p),MA(q),ARMA(p,q)模型及其平稳性
- 时间序列1 平稳
- 时间序列分析这件小事(六)--非平稳时间序列与差分
- 基于Python的ADF单位根检验方法——时间序列平稳检验
- 非平稳时间序列的分解
- 时间序列建模--近似熵等
- 时序分析:ARIMA模型(非平稳时间序列)
- 论文学习:深度学习时间序列建模
- 第二章平稳时间序列模型——ACF和PACF和样本ACF/PACF
- 非平稳时间序列确定性因素分解
- Python数据挖掘建模 chapter_8 时间序列算法
- 为什么序列存在单位根是非平稳时间序列?
- 非平稳时间序列趋势分析
- 平稳的时间序列模型
- 时间序列分析(一) 如何判断序列是否平稳
- 非平稳时间序列综合分析