zoukankan      html  css  js  c++  java
  • 基于R语言的时间序列指数模型

    时间序列:

    (或称动态数列)是指将同一统计指标的数值按其发生的时间先后顺序排列而成的数列。时间序列分析的主要目的是根据已有的历史数据对未来进行预测。(百度百科)

    主要考虑的因素

    1.长期趋势(Long-term trend) : 时间序列可能相当稳定或随时间呈现某种趋势。

    时间序列趋势一般为线性的(linear),二次方程式的 (quadratic)或指数函数(exponential function)。

    2.季节性变动(Seasonal variation) 按时间变动,呈现重复性行为的序列。 季节性变动通常和日期或气候有关。 季节性变动通常和年周期有关。

    3.周期性变动(Cyclical variation) 相对于季节性变动,时间序列可能经历“周期性变动”。 周期性变动通常是因为经济变动。

    4.随机影响(Random effects)

    时间序列的预测方法

    1.指数平滑法:描述时间序列数据的变化规律和行为,不去试图解释和理解这种变化的原因

    2.ARIMA模型:描述时间序列数据的变化规律和行为,它允许模型中包含趋势变动、季节变动、循环变动和随机波动等综合因素影响。具有较高的预测精度,可以把握过去数据变动模式,有助于解释预测变动规律

    ##################################################################################

    在本文中主要介绍指数平滑法在R语言时间序列预测中的应用,最后以实例操作指数平滑法时间序列预测。

    ##################################################################################

    含义:

    指数平滑法(Exponential Smoothing,ES)是布朗(Robert G..Brown)所提出,布朗认为时间序列的态势具有稳定性或规则性,所以时间序列可被合理地顺势推延;他认为最近的过去态势,在某种程度上会持续到未来,所以将较大的权数放在最近的资料。

    模型分类及适用条件

    1.简单指数平滑 适用条件:相加模型,并且处于恒定水平和没有季节性变动的时间序列

    X1<-HoltWinters(rainseries, beta=FALSE, gamma=FALSE)

    2.霍尔特指数平滑法  适用条件:一个增长或降低趋势的、没有季节性相加模型,X2<-HoltWinters(skirtsseries, gamma=FALSE)

    3.Holt-Winters 指数平滑法   适用条件:一个增长或降低趋势并存在季节性可被描述成为相加模型的时间序列。

    X3<-HoltWinters(rainseries),其中平滑化依靠三个参数来控制:alpha,beta 和 gamma,分别对应当前时间点上的水平,趋势部分的斜率和季节性部分,参数 alpha,beta 和 gamma

    的取值都在 0 和 1 之间,并且当其取值越接近 0 意味着对未来的预测值而言最近的观测值占据相对较小的权重。参数为默认为TRUE,

    以上指数平滑只给出原始时间序列所覆盖时期内的预测。但可以通过指定“l.start” 和“b.start” 参数去指定水平和趋势的斜率的初始值。

    最后:指数平滑法计算出预测区间,那么预测误差必须是不相关的,而且必须是服从零均值、方差不变的正态分布

    实例:以data Market中leading economic indicator数据为例进行分析预测。

    1.导入原始数据,并制作时序图进行数据初步判断,代码如下:

    library(xlsx)  #导入xlsx包

    library(forecast)

    library(tseries)

    indicator<-read.xlsx(“C:/pythonshu/indicator.xlsx”,1)#导入数据

    indicatortimeseries<-ts(indicator,frequency = 12,start =c(2010,1))

    plot.ts(indicatortimeseries)#时序图,上升趋势无季节

    Rplot01

    2.判断为可以使用holt指数模型,故使用holt指数命令进行操作,代码如下:

    fithot<-HoltWinters(indicatortimeseries,gamma = FALSE,l.start = 95.1)#指定模型初始值

    plot(fithot)#时序图

    Rplot06

    3.利用构建好的模型进行后10期数据的预测。其中深色为置信区间为95%的预测范围,浅色为80%。

    fithot2<-forecast.HoltWinters(fithot,h=10)#预测后10期数据

    plot(fithot2)#时序图

    Rplot07

    4.残差检验:

    Box.test(fithot2$residuals,lag=6,type=’Ljung’)#白噪声检验,结果中P值=0.035<0.05,残差为非白噪声序列,说明残差中还蕴含信息,模型可以继续优化

    5.模型优化:

    用decompose()函数对时间序列进行分解,发现其有明显的上升与季节趋势,故选用Holt-Winters 指数平滑法对其优化。

    优化模型及对后12期数据的预测代码:

    fithot<-HoltWinters(indicatortimeseries)#指定模型初始值

    plot(fithot)#时序图

    fithot2<-forecast.HoltWinters(fithot,h=10)#预测后10期数据

    plot(fithot2)#时序图

    fen

    houyu

    6.对优化后模型的检验:

    Box.test(fithot2$residuals,lag=10,type=’Ljung’)#白噪声检验,结果为0.6265>0.05残差为白噪声序列,模型拟合有效

    acf(fithot2$residuals,lag.max = 20)#自相关图,非0时不相关

    plotForecastErrors <- function(forecasterrors)

    {

    # make a red histogram of the forecast errors:

    mysd <- sd(forecasterrors)

    hist(forecasterrors, col=”red”, freq=FALSE)

    # freq=FALSE ensures the area under the histogram = 1

    # generate normally distributed data with mean 0 and standard deviation mysd

    mynorm <- rnorm(10000, mean=0, sd=mysd)

    myhist <- hist(mynorm, plot=FALSE)

    # plot the normal curve as a blue line on top of the histogram of forecast errors:

    points(myhist$mids, myhist$density, type=”l”, col=”blue”, lwd=2)

    }

    plotForecastErrors(fithot2$residuals)#残差直方图, 预测误差是正态分布,并且均值为零,方差不变。

    acfzhi

    ###########################################################################################

    以上就是利用指数平滑构建时间序列预测模型的简单案例,你学会了吗?

    部分文献参考:1、百度百科相关词条

    2、沈浩老师:时间序列预测技术http://shenhaolaoshi.blog.sohu.com/137698400.html

    3, http://www.shujudata.top/基于r语言的时间序列指数模型/

  • 相关阅读:
    ElementUI表格表头自定义添加checkbox,点击不生效问题
    同步个人vs code 习惯性配置gists 到码云(Gitee)
    el-select 设置宽度自适应上层div
    vue-element-template模板vue-cli3本地使用proxy解决跨域问题
    vue-cli3用axios+proxy简单解决在dev开发环境下的跨域问题
    windows下EasyMock的安装与部署遇到的各种问题(爬坑)
    git同步代码至github和gitee(码云)
    Git使用总结(包含Git Bash和Git GUI的使用)
    Leetcode No.53 Maximum Subarray(c++实现)
    Leetcode No.35 Search Insert Position(c++实现)
  • 原文地址:https://www.cnblogs.com/nxld/p/6380467.html
Copyright © 2011-2022 走看看