重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
在datacamp网站上学习“ Time Series with R ”track
昌宁网站建设公司创新互联公司,昌宁网站设计制作,有大型网站制作公司丰富经验。已为昌宁上千余家提供企业网站建设服务。企业网站搭建\外贸营销网站建设要多少钱,请找那个售后服务好的昌宁做网站的公司定做!
“Introduction to Time Series Analysis”课程 做的对应笔记。
学识有限,错误难免,还请不吝赐教。
如无特殊说明,笔记中所使用数据均来自datacamp课程
自相关(autocorrelation or lagged correlation)用于评估时间序列数据是否依赖于其过去的数据。
假设时间序列是弱平稳的: 之间的相关系数记为 ,函数ρ称为自相关函数(autocorrelation function, ACF)
与之类似,自协方差函数用 表示
设 满足弱平稳过程。
设有例数为n的时间序列数据x,按照自相关函数的定义,以计算 为例,我们可以手动构造计算自相关系数的成对数据,x_t0 x_t1对应x[t],x[t-1],然后用cor()函数计算 ,本例中n=150:
cor(x_t0, x_t1)输出为:0.7630314
acf(..., lag.max =1, plot = FALSE)函数可以用来计算lag为1的自相关系数:
acf()函数输出中lag为1的自相关系数为0.758
可以看出我们手动计算的结果和acf()函数计算的结果略有不同。这是因为acf()使用的是用n作为分母的计算版本而手动计算利用cov()函数使用的是用n-h(这里h=1)作为分母的计算版本。
acf()函数以n作为分母的计算方法算出的自相关系数是有偏的,但是在时间序列分析中更常用(preferred)。
验证两种计算方法相差一个因子:(n-h)/n
cor(x_t1, x_t0) * (n-1)/n输出结果为0.7579445.
acf(x, lag.max = 1, plot = F)[1][[1]]输出结果为0.7579761
看来除了课程中提到的计算版本分母不同以外这两种计算方法还有其他的差异导致计算结果在考虑到分母问题以后仍然有一点点微小的不同。
acf(..., lag.max = ..., plot = FALSE)函数会计算h=0,1,2...直到lag.max参数指定值对应的自相关系数。
此外,acf()函数的plot选项默认为TRUE,可以生成自相关图,自相关图会显示各lag值对应的自相关系数,并用蓝色水平虚线表示自相关系数为0的95%置信区间边界线,如果自相关系数在两条虚线以内则表明自相关系数没有统计学意义。
例子数据:x显示出强持续性(persistence),即时间序列的值与前一测量值呈现出强相关性;y具有周期性,周期大约为4;z则没有明确的模式。
对上面三个时间序列使用acf()函数:
dta=np.array(dta,dtype=np.float) //这里要转下数据类型,不然运行会报错
dta=pd.Series(dta)
dta.index = pd.Index(sm.tsa.datetools.dates_from_range('2001','2090')) //应该是2090,不是2100
dta.plot(figsize=(12,8))
plt.show() // 在Scala IDE要输入这个命令才能显示图!
目录
时间序列是一列观测值 的集合, 其中每个观测值是在时段 观测所得( 是自然数 ). 给定时间序列 , 如果对任意的 , 它满足下列条件:
i.
ii.
iii.
我们把它叫做(弱)平稳(weakly stationary)序列.(下文我们简称平稳序列.)
通俗地讲, 平稳序列的期望, 方差, 协方差不随时间变化 . 例如, 服从同一个分布时, 它是平稳的.
例1 下图中的时间序列由 生成. 从直观上看, 这个序列是"平稳的".
例2 下图的中的时间序列由 生成, 其中 , . 它起初有明显地增长, 然后趋于平稳. 利用ADF检验(详情见下文), 我们发现该序列是平稳的(p-value 0.01).
Remark 弱平稳性的"弱"主要体现在时间序列在全局上是平稳的, 即,时间序列局部是波动的,但整体上看是平稳的, 或者随着时间的变化其样本的均值收敛.
我们用统计学中假设检验的方法来判断样本的平稳性. 常用的是Augmented Dickey-Fuller(ADF)检验 [1] .
在显著水平 的条件下, 我们可以通过计算p-value来接受或者拒绝 :
Python3中 statsmodels.tas.stattools 中的 adfuller 函数 [3] 实现了ADF检验. 使用方法如下所示.
前面之所以介绍平稳序列的概念及检验方法, 是因为它是很多基础的时间序列模型的前提假设. 在本节我们介绍一些常见的时间序列模型(更多内容可以参考 [4] , [5] ).
AR代表自回归(Autoregression). 假设时间序列 是平稳的, 它可以被表示成如下形式:
MA代表移动平均(Moving Average). 假设时间序列 是平稳的, 它可以被表示成如下形式:
ARMA模型是AR和MA的组合. 假设同上. 它可以被表示为如下形式:
ARIMA模型是ARMA模型的推广, 全称是Autoregressive Integrated Moving Average. 当时间序列 不满足平稳性时, 我们通常使用 差分 的技巧把序列变得平稳, 然后再应用ARMA模型.
参数 代表差分的阶数. 下面是差分的计算公式( 为差分算子):
例3 下图是原始的时间序列. 通过观察, 它的均值有明显的上升趋势且不收敛, 因此不是平稳序列(ADF检验的p-value为0.94).
对该序列进行一阶差分后, 我们得到如下平稳的时间序列(p-value为0.00).
该记号代表季节性(或周期性)ARIMA模型, 详细的表达式可以参考 [4] ( 4.1 Seasonal ARIMA models ), 其中
我们可以把它看成两阶段模型: 第一阶段在全局使用ARIMA(p,d,q); 第二阶段通过指定周期长度 , 再利用ARIMA(P,Q,D)模型考虑周期之间的关系.
例4 考虑如下周期性的平稳时间序列( ).
对序列进行周期性差分: 得到新的时间序列 如下图所示(红色部分)
通过使用周期性差分, 我们可以把原有时间序列的周期性移除. 同理, 通过采用周期性的自回归和移动平均系数, 我们可以把周期之间的依赖关系考虑进模型.
例5 考虑周期s=18的数据(蓝色曲线). 用 和 分别进行预测的结果如下.
不考虑周期性的ARIMA模型的预测结果(灰色曲线)逐渐收敛到时间序列的均值. 由于序列是平稳的, 这样的预测结果符合我们的期望. 考虑到该时间序列有比较强的周期性, 且通过观察发现周期 . 在本例中, 我们仅使用周期差分, 最终得到了如图所示(红色曲线)的周期性预测结果.
ARCH的全称是Autoregressive Conditionally Heteroscedasticity, 它可以用来考虑样本的方差随着时间变化(或震荡)的时间序列. 设时间序列 是平稳的, 模型可以被表示成如下形式:
其中
GARCH即Generalized ARCH, 是ARCH模型的推广 [6] . 设时间序列 是平稳的, 模型可以被表示成如下形式:
其中
Remark ARCH/GARCH随机过程产生的数据是什么样的? 前面提到它们允许 样本的方差 随时间变化, 但是由于 必须满足平稳性(前提假设), 因此样本的方差从局部看是变化(震荡)的, 但从整体看应该是"平稳的"序列. 例如下图是一个 过程生成的时间序列( ).
VAR即Vector Autoregression, 它是多变量的自回归模型. 类似地, 我们有 , 它是 的向量版本. 需要注意的是, VARMA模型处理的时间序列可以有趋势. 我们不做详细的展开, 感兴趣的读者可以参考 [4] 章节11.2: Vector Autoregressive models VAR(p) models .
给定时间序列的观测样本, 选定预测模型之后如何确定模型的参数? 本节我们介绍两种常用的方法: 1. 画出ACF/PACF图, 然后观察出 的值; 2. 通过计算相关的统计指标, 自动化地选择参数.
ACF的全称是Autocorrelation Function. 对变量 , ACF的值代表 与 之间的相关性.
PACF的全称是Partial Autocorrelation Function. 对变量 , PACF的值代表已知 的条件 下, 与 之间的相关性.
例6 设 . 考虑下面三个模型生成的时间序列, 并计算相应的ACF/PACF.
基本思想是通过计算一些指标, 并选择参数使得相关的指标值尽可能小. 下面我们介绍一些常用的指标.
为方便描述, 我们先定义一些记号.
(AIC的改良版, 解决小样本过拟合的问题)
(也称为Schwartz Criterion, SBC, SBIC)
Remark 建议在实际中综合考虑这些指标.
Python3 code on Github
举一个例子吧,比如月度的数据,就是周期为12,它有季节影响。 先对其1阶12步差分,通过看acf pac f看是简单加法模型,还是乘法季节模型 如果是乘法模型那就要对季节部分模拟arima模型 季节部分的arima是以周期位置的acf pacf
我建议题主在找不到错误原因的时候,将语句分拆开一句句运行,或者使用print()函数输出变量的运行结果,这样就很容易排错。(算是小白的一点学习心得吧)
就是虚线的大小。
acf的全称是Autocorrelation function,即自相关函数。但这个函数不仅可以计算自相关,也可以计算自协方差。具体代码如下:x acf(x)#计算该向量的自相关函数
autocorr autocorr$acf #autocorrelation
#输出如下
# [,1]
# [1,] 1.00000000
# [2,] 0.70000000
# [3,] 0.41212121
# [4,] 0.14848485
# [5,] -0.07878788
# [6,] -0.25757576
# [7,] -0.37575758
# [8,] -0.42121212
# [9,] -0.38181818
# [10,] -0.24545455
autocov autocov$acf #autocorrelation
# 输出如下
# [,1]
# [1,] 1.00000000
# [2,] 0.70000000
# [3,] 0.41212121
# [4,] 0.14848485
# [5,] -0.07878788
# [6,] -0.25757576
# [7,] -0.37575758
# [8,] -0.42121212
# [9,] -0.38181818
# [10,] -0.24545455自相关含义解释:自己 与 自己的过去 是否具有线性相关。范围是-1~1。绝对值越靠近1越相关,绝对值越靠近0越不相关。当纵线落入虚线以内,则认为该数值与0无显著差异,既可认为不相关。注意事项:如果直接带入自相关公式,会发现系数与R求的不一样因为R语言中的acf函数 并不是直接计算出自相关系数而是计算出不同滞后阶数的样本自相关系数、样本自协方差系数。 具体公式如下:样本自协方差系数公式: 其中对于 ,有 。n是样本总数,h是滞后阶数, 是样本平均数。【注意,很多网上的样本自协方差公式都是错误的,这个是经过计算验证的】样本自相关系数公式:深层次用法:在时间序列分析过程中一种分析手段是:根据 自相关系数图 和 偏自相关系数图 来猜测时间序列可能属于哪一种时间序列模型。【没有错,统计理论是严谨的,但一些统计方法却有一定的主观性】故需要分析人员大量浏览各种可能的已知时间序列模型,并熟悉他们的自相关系数图(acf函数)、偏自相关图(pacf函数)。并结合扩展的自相关函数(eacf函数,Tsay,Tia0,1984 W.S.Chan.1999 )实现模型定阶。已经被人熟知的基本规律有:“拖”指代拖尾eacf图的解读方式当然还有很多种其他判断模型的方法,也会利用自相关函数与偏自相关函数