概念及应用

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")

时间序列模型机器学习 时间序列模型有什么用_时间序列模型机器学习_02

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")

时间序列模型机器学习 时间序列模型有什么用_分类_03

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")

时间序列模型机器学习 时间序列模型有什么用_分类_04

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")

时间序列模型机器学习 时间序列模型有什么用_时间序列模型机器学习_05

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")

时间序列模型机器学习 时间序列模型有什么用_时间序列_06

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")

时间序列模型机器学习 时间序列模型有什么用_人工智能_07

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")

时间序列模型机器学习 时间序列模型有什么用_人工智能_08

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")

时间序列模型机器学习 时间序列模型有什么用_时间序列_09

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")

时间序列模型机器学习 时间序列模型有什么用_分类_10

其他时间序列预测方法

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