概念及应用

1.概念

时间序列是按照一定的时间间隔排列的一组数据,其时间间隔可以是任意的时间单位,如小时、日、周、月等。比如,产品月均销售趋势、股市K线图走势、医院日门诊就诊量等。这些数据形成了一定时间间隔且前后具有一定的延续性与关联性。通过对这些时间序列的分析,从中发现和揭示现象发展变化的规律,然后将这些知识和信息用于预测。

2.应用

时间序列本质上反映的是某个或者某些随机变量随时间不断变化的趋势,从数据中挖掘出这种趋势变化规律,并利用其对将来的数据做出估计和预测。其可以反映社会经济现象的发展变化过程,描述现象的发展状态和结果;可以研究社会经济现象的发展趋势和发展速度;可以探索现象发展变化的规律,对某些社会经济现象进行预测。一直以来在金融领域(股票走势、期货价格等)应用较为广泛,近年来在医疗卫生领域,传染病发病、非传染病健康结局指标等方面发挥越来越重要作用。

定义及分类

定义

在统计学研究中,常用按时间顺序排列的一组随机变量X1,X2,…,Xt,…来表示一个随机事件的时间序列,简记{Xt,tϵT}或{Xt}.用x1,x2,…,xn或{xt,t=1,2,…,n}表示该随机序列的n个有序观察值,称为序列长度为n的观察值序列。

分类

1.按照研究对象可分为一元时间序列和多元时间序列;
2.按照连续性可分为离散型时间序列和连续型时间序列;
3.按照统计特性可分为平稳时间序列和非平稳时间序列。

因素分解

自然界中数据序列大多数都是非平稳的,通常显示出明显的规律性,比如有显著的趋势或者有固定的周期波动。尽管不同的序列波动特征千差万别,但是序列的各种变化都可以归纳成以下四大类因素的综合影响。
1.长期趋势(trend):该因素的影响会导致序列呈现出明显的长期趋势(递增、递减等)。
2.循环波动(circle):该因素会导致序列呈现出从低到高再由高至低的反复循环波动。
3.季节性变化(season):该因素会导致序列呈现出和季节变化相关的稳定的周期波动。
4.随机波动(inmediate):除了长期趋势、循环波动、季节性变化外,序列还会受到各种其他因素的综合影响,而这些影响导致序列呈现出一定的随机波动。

时间序列预测方法

1. 朴素预测法(Naive Forecast)

如果数据集在一段时间内都很稳定,我们想预测第二天的结果,可以取前面一天的结果,预测第二天的值。这种假设第一个预测点和上一个观察点相等的预测方法就叫朴素法,即 y t +1 = y t 。朴素法实际就是预测值等于实际观察到的最后一个值,它假设数据是平稳且没有趋势性与季节性的,通俗来说就是以后的预测值都等于最后的值。(这种方法很明显适用情况极少)

代码实现

#####时间序列模型代码实现####
rm(list = ls())
##安装载入软件包##
if(!requireNamespace("dplyr","purrr","forecast",quietly=TRUE))install.packages("dplyr","purrr","forecast")
require(dplyr)
require(purrr)
require(forecast)
setwd("f://时间序列模型")
time<-seq.Date(as.Date("1990-01-01"),as.Date("2019-01-01"),by="1 year")
###朴素法###
set.seed(111)
test<-runif(25,100,150)%>%round()
test<-c(test,rep(test[25],5))
plot(time,test,type = "l",lwd=2,col="black")
abline(v=time[26],lty=2)
lines(time[26:30],rep(test[26],5),type="l",col="red",lwd=2)
legend("topleft",c("观测值","预测值"),col=c("black","red"),lty=c(1,1),cex=0.8,lwd=2)
title(main="Naive Forecast")

2. 简单平均法(Simple Average)

简单平均法就是预测的值为过去所有时期值的平均数。当然这不会很准确,但多少有点接近,这种预测方法在实际情况下效果最好(比如说某种商品价格随日期变化在一定均值上下波动)。

代码实现

###简单平均法###
set.seed(222)
test<-rnorm(30,100,50)%>%round()
plot(time,test,type = "l",lwd=2,col="black")
abline(v=time[26],lty=2)
lines(time[26:30],rep(mean(test[1:25]),5),type="l",col="red",lwd=2)
legend("topleft",c("观测值","预测值"),col=c("black","red"),lty=c(1,1),cex=0.8,lwd=2)
title(main="Simple Average")

3. 移动平均法

【移动平均法也叫滑动平均法,即取前面N个时期的平均值作为预测值】

1)简单移动平均法(Sample Moving Average)

有时候我们在研究中会遇到这样的数据集,使用远期的数据会很大程度造成近期预测结果的偏移,因此作为简单平均法的改进,我们仅使用过去N个时间点的平均值,即认为只有距离当前结果最近的值才是重要的。这种利用时间窗口计算平均值的预测方法被叫做简单移动平均法;简单移动平均的计算涉及到规模为N个时间点的“滑动窗口”。(简单移动平均法实际中会非常有效,特别是选择了对于序列来说正确的N点)。

代码实现

###简单移动平均法###
set.seed(222)
test<-rnorm(30,100,50)%>%round()
plot(time,test,type = "l",lwd=2,col="black")
abline(v=c(time[16],time[26]),lty=2)
text(time[20],mean(test),"N",col="red",cex=1.2)
lines(time[26:30],rep(mean(test[16:25]),5),type="l",col="red",lwd=2)
legend("topleft",c("观测值","预测值"),col=c("black","red"),lty=c(1,1),cex=0.8,lwd=2)
title(main="Sample Moving Average")

2)加权移动平均法(Weighted Moving Average)

加权移动平均法是对移动平均法的改进,在上述移动平均法中,每个“滑动窗口期”时间点数据在求平均值的作用是等同的。但是,每个时间点数据所包含的信息量不一样,通常来讲近期值包含的信息更加重要。因此,把各时间点数据等同看待是不尽合理的,应考虑各时间点数据的重要性,对近期数据给予较大的权重wt,这就是加权移动平均法的基本思想。wt的选择具有一定的经验性,一般的原则是:近大远小,近期数据权重大,远期数据权重小。具体如何选择需要对序列有足够的分析和了解。

代码实现

###加权移动平均法###
set.seed(222)
test<-rnorm(30,100,50)%>%round()
c(rep(0,6),0.1,0.2,0.3,0.4)->wd##设置权重
plot(time,test,type = "l",lwd=2,col="black")
abline(v=c(time[16],time[26]),lty=2)
text(time[20],mean(test),"N",col="red",cex=1.2)
lines(time[26:30],rep(sum(test[16:25]*wd),5),type="l",col="red",lwd=2)
legend("topleft",c("观测值","预测值"),col=c("black","red"),lty=c(1,1),cex=0.8,lwd=2)
title(main="Weighted Moving Average")

3)趋势移动平均法(Trend Moving Average)

在时间序列没有明显的趋势变动时,单纯移动平均和加权移动平均法在一定程度上能够准确反映实际情况。但在日常统计分析过程中,所研究的数据通常存在递增或递减的变动趋势。这时候再用单纯移动平均法和加权移动平均法来预测就会出现滞后偏差。因此,利用移动平均滞后偏差的规律来建立直线趋势的预测模型,这就是趋势移动平均法。趋势移动平均法需要对序列一次移动平均后再做一次二次平均,建立直线趋势模型,Yt+T=at+btT,T=1,2,…,其中t为当前时期数;T为t至预测期的时期数;at为截距;bt为斜率。求解参数a和b,代入模型进行预测。

代码实现

###趋势移动平均法###
##以下生成趋势时间序列##
tt<-vector()
set.seed(112)
tt[1]<-rnorm(1,50,30)%>%round()
for(i in 2:30){tt[i]<-tt[i-1]+rnorm(1,50,30)%>%round()
}
##生成一次移动平均
t1<-vector(mode = "numeric")
for(i in 1:16){t1[i]<-mean(tt[i:(i+9)])
}
##生成二次移动平均
t2<-vector(mode = "numeric")
for(i in 1:7){t2[i]<-mean(t1[i:(i+9)])
}
##求解线性趋势模型参数##
a<-2*t1[16]-t2[7]
b<-2/(10-1)*(t1[16]-t2[7])
yc<-vector(mode="numeric")
for(i in 1:5){yc[i]<-a+b*i
}
plot(time,tt,type = "l",lwd=2,col="black")
abline(v=c(time[16],time[26]),lty=2)
lines(time[26:30],yc,type="l",col="red",lwd=2)
text(time[20],mean(tt),"t",col="red",cex=1.2)
text(time[28],mean(tt),"T",col="red",cex=1.2)
legend("topleft",c("观测值","预测值"),col=c("black","red"),lty=c(1,1),cex=0.8,lwd=2)
title(main="Trend Moving Average")

4. 趋势拟合法

【有些时间序列具有非常显著的趋势,有时我们分析的目的就是要找到序列中的这种趋势,并利用这种趋势对序列未来的发展作出合理的预测。趋势拟合法就是把时间作为自变量,相应的序列观察值作为因变量,建立序列值随时间变化的回归模型的方法】

1) 线性拟合法(Linear fitting)

如果序列的长期趋势呈现出线性特征,那么我们可以用线性拟合法来构建预测模型。

代码实现

###线性拟合法###
dd<-data.frame(time[1:25],tt[1:25])%>%setNames(c("time","num"))
x.fit<-lm(data=dd,num~time)##拟合线性回归模型
yc.dd<-data.frame(time[26:30])%>%setNames("time")
yc<-predict(x.fit,yc.dd)##预测结果
plot(time,tt,type = "l",lwd=2,col="black")
abline(v=time[26],lty=2)
lines(time[26:30],yc,type="l",col="red",lwd=2)
legend("topleft",c("观测值","预测值"),col=c("black","red"),lty=c(1,1),cex=0.8,lwd=2)
title(main="Linear fitting")

2)曲线拟合法(Curve fitting)

如果序列的长期趋势呈现出非线性/曲线特征,那么我们可以用曲线拟合法来构建预测模型。

代码实现

###曲线拟合法
tt<-seq(1:30)^2
dd<-data.frame(time[1:25],tt[1:25],c(1:25)^2)%>%setNames(c("time","num","zz"))
x.fit<-lm(data=dd,num~time+zz)##拟合线性回归模型
yc.dd<-data.frame(time[26:30],c(26:30)^2)%>%setNames(c("time","zz"))
yc<-predict(x.fit,yc.dd)##预测结果
plot(time,tt,type = "l",lwd=2,col="black")
abline(v=time[26],lty=2)
lines(time[26:30],yc,type="l",col="red",lwd=2)
legend("topleft",c("观测值","预测值"),col=c("black","red"),lty=c(1,1),cex=0.8,lwd=2)
title(main="Curve fitting")

5. 指数平滑法

【指数平滑法的基本思想即考虑全部时间间隔对事件发展的影响,各期权重随时间间隔的增大而呈指数衰减,新近观察值比早期观察值具有更大的权重,利用修匀技术削弱短期随机波动对序列的影响,使序列平滑化,从而找出其变化规律,对未来发展趋势做出合理的预测】

1)简单指数平滑法(Simple Exponential Smoothing)

先前的简单平均法将历史序列数据一个不漏的全部加以利用,​移动平均法则不考虑较远期的数据,选取一个滑动窗口期N,并在加权移动平均法中给予近期更大的权重,而N期之前的数据对未来值没有影响,加权为 0。这时候我们就需要考虑能否将所有数据考虑在内,同时也能给数据赋予不同权重。简单指数平滑法不考虑序列中存在的趋势和周期性变化,模型中只有一个水平参数α,对于变化缓慢的序列,常取较小的α,对于变化迅速的序列,常取较大的α。经验表明α的值介于0.05~0.3之间,修匀效果比较好。

代码实现

##简单指数平滑法##
set.seed(222)
test<-rnorm(30,100,50)%>%round()
tt<-ts(test[1:25],start = 1990)
fit1<-HoltWinters(tt,beta = F,gamma = F)
yc<-data.frame(forecast(fit1,5))[,1]
plot(time,test,type = "l",lwd=2,col="black")
abline(v=time[26],lty=2)
lines(time[26:30],yc,type="l",col="red",lwd=2)
legend("topleft",c("观测值","预测值"),col=c("black","red"),lty=c(1,1),cex=0.8,lwd=2)
title(main="Simple Exponential Smoothing")

2) Holt 两参数指数平滑法(Holt Exponential Smoothing)

Holt 两参数指数平滑法在简单指数平滑法的基础上,增加了一个趋势参数β,考虑了数据集可能存在的趋势变化。适用于对含有线性趋势的序列进行修匀,建模过程中需要选择两个平滑参数ɑ和β的取值。

代码实现

##holt两参数指数平滑法##
##以下生成趋势时间序列##
tt<-vector()
set.seed(112)
tt[1]<-rnorm(1,50,30)%>%round()
for(i in 2:30){tt[i]<-tt[i-1]+rnorm(1,50,30)%>%round()
}
tt1<-ts(tt[1:25],start = 1990)
fit2<-HoltWinters(tt1,gamma = F)
yc<-data.frame(forecast(fit2,5))[,1]
plot(time,tt,type = "l",lwd=2,col="black")
abline(v=time[26],lty=2)
lines(time[26:30],yc,type="l",col="red",lwd=2)
legend("topleft",c("观测值","预测值"),col=c("black","red"),lty=c(1,1),cex=0.8,lwd=2)
title(main="Holt Exponential Smoothing")

3) Holt-Winters 三参数指数平滑法(Holt-Winters)

Holt-Winters 三参数指数平滑法在Holt指数平滑法的基础上,增加了一个季节参数S,考虑了数据集可能存在的季节变化规律。适用于一个含有增长或降低趋势并存在季节变化的时间序列的预测分析,建模过程中需要选择三个平滑参数ɑ、β和S的取值。同时在建立Holt-Winters模型时,通常有无季节性模型、基于加法的季节模型以及基于乘法的季节模型,需要针对研究序列调整相应的参数。

代码实现

##holt-winters指数平滑法##
##以下生成包含季节性时间序列##
tt<-c(seq(100,200,by=25),seq(300,200,by=-25),seq(300,400,by=25),seq(500,400,by=-25),seq(500,600,by=25),seq(650,550,by=-25))
tt1<-ts(tt[1:25],start = c(1990,1),frequency = 5)
fit3<-HoltWinters(tt1)
yc<-data.frame(forecast(fit3,5))[,1]
plot(time,tt,type = "l",lwd=2,col="black",ylim = c(0,800))
abline(v=time[26],lty=2)
lines(time[26:30],yc,type="l",col="red",lwd=2)
legend("topleft",c("观测值","预测值"),col=c("black","red"),lty=c(1,1),cex=0.8,lwd=2)
title(main="Holt-Winters Exponential Smoothing")

其他时间序列预测方法

详细推算公式和其他研究方法在此不在过多叙述,有需要的小伙伴可以查阅一下相关参考链接。
参考链接:

[1] https://blog.csdn.net/qq_29831163/article/details/89440215
[2] https://blog.csdn.net/weixin_42455135/article/details/100620870?spm=1001.2014.3001.5506
[3] https://blog.csdn.net/evenson1/article/details/108163708?spm=1001.2014.3001.5506
[4] https://blog.csdn.net/c1z2w3456789/article/details/80752541?spm=1001.2014.3001.5506
[5]https://www.math.pku.edu.cn/teachers/lidf/course/fts/ftsnotes/html/_ftsnotes/index.html
[6]https://www.math.pku.edu.cn/teachers/lidf/course/atsa/atsanotes/html/_atsanotes/atsa-tsconcepts.html

时间序列模型分类及应用相关推荐

  1. 数学建模 时间序列模型

    时间序列模型 时间序列是按时间顺序排列的.随时间变化且相互关联的数据序列.分析时间序 列的方法构成数据分析的一个重要领域,即时间序列分析. 时间序列根据所研究的依据不同,可有不同的分类. 1.按所研究 ...

  2. SPSS(十九)SPSS之时间序列模型(图文+数据集)

    SPSS(十九)SPSS之时间序列模型(图文+数据集) 时间序列是指将同一统计指标的数值按其发生的时间先后顺序排列而成的数列.正如人们常说,人生的出场顺序很重要,时间序列中隐藏着一些过去与未来的关系. ...

  3. matlab的meadian函数_24 第二十四章 时间序列模型_W

    <24 第二十四章 时间序列模型_W>由会员分享,可在线阅读,更多相关<24 第二十四章 时间序列模型_W(31页珍藏版)>请在人人文库网上搜索. 1.第二十四章时间序列模型 ...

  4. 时间序列早期分类问题定义和基本思想以及具体方法简述

    时间序列分类是将待测样本分配到预先定义好的类别中. 时间序列数据定义: 狭义:按时间顺序排序的一组数据. 广义:任何实质性的有次序的序列都可以当作时间序列处理. 应用:医学诊断.灾害预测.入侵检测.过 ...

  5. 时间序列模型是什么?

    时间序列定义: 时间序列是时间间隔不变的情况下收集的不同时间点数据集合,这些集合被分析(通过曲线拟合和参数估计来建立数学模型的理论和方法)用来了解长期发展趋势及为了预测未来. 时间序列分类: ARMA ...

  6. 数学建模系列-预测模型(四)---时间序列模型

    上回书说到,预测模型中的插值与拟合已经讲述完毕.现在我们研究的是时间序列模型. 分类 与普通的数值拟合不同,时间序列的拟合需要考虑多种因素,本质上是一种高级的拟和方式.同时也是一种黑箱模型, 小结一下 ...

  7. 时间序列模型算法 - ARIMA (一)

    时间序列模型 1.时间序列模型概述 1.1 时间序列的不同分类 1.2 确定性时间序列分析方法概述 1.3 三种时间序列模型 2.指标平滑ES 2.1 一次指数平滑法 3.ACF与PACF 4.AR ...

  8. 时间序列模型 (一):模型概述

    时间序列的其它博文系列: 时间序列模型 (一):模型概述 时间序列模型 (二):移动平均法 时间序列模型 (三):指数平滑法 时间序列模型 (四):差分指数平滑法. 自适应滤波法v 时间序列模型 (五 ...

  9. Python使用numpy包编写自定义函数计算平均绝对误差(MAE、Mean Absolute Error)、评估回归模型和时间序列模型、解读MAE

    Python使用numpy包编写自定义函数计算平均绝对误差(MAE.Mean Absolute Error).评估回归模型和时间序列模型.解读MAE 目录

最新文章

  1. java keytool生成证书_使用JDK自带的工具keytool生成证书
  2. java递归url目录_Java递归实现某个目录下所有文件和目录
  3. iOS下Html页面中input获取焦点弹出键盘时挡住input解决方案
  4. python打开摄像头获取图片_Python基于opencv调用摄像头获取个人图片的实现方法
  5. PAT甲级1001 A+B Format:[C++题解]字符串处理
  6. JWT令牌组成和安全校验讲解
  7. 软RAID-mdadm折腾小记
  8. HDU - 3516 Tree Construction
  9. Nexus协议,闲鱼一体化开发的幕后玩家
  10. Linux Shell脚本专栏_自动发布Java项目(tomcat)_10
  11. call()函数、apply()函数区别与意义
  12. 基于Ghost框架搭建Blog
  13. 翻译: Octave 入门教程
  14. Mac下生成多个SSH KEY并管理
  15. Anylogic学习--------------数学函数
  16. devcon-计算机硬件设备的禁用与启动说明
  17. 微积分知识点回顾与总结(二)极限
  18. 单线程模型中Message、Handler、Message Queue、Looper之间的关系
  19. Springboot JPA注解@Enumerated
  20. Python肺CT图像窗位窗宽调整

热门文章

  1. android快牙原理,快牙的使用原理 快牙是什么
  2. 教你如何预测参与调节差异基因的转录因子
  3. 无盘服务器 安装客户机程序,无盘快速安装指南
  4. 汽车维修问题多 别被维修店潜规则忽悠了
  5. 体验 IntelliJ IDEA 2021.1 Run Targets 远程环境调试程序
  6. Tomcat反序列化漏洞(CVE-2016-8735)
  7. 什么情况下用深拷贝?
  8. dede文章内容页{dy}去掉拼音标题后面的ID的方法
  9. SpringBoot------JPA连接数据库
  10. 阿里巴巴淘票票专家分享:如何利用阿里云ARMS,搭建国际化在线售票的业务监控系统...