时间序列分析与应用
第一章 时间序列特征
环境准备
安装R conda install -c r r-essentials
频道是Navigator和conda查找包的位置。(source)具有相同名称的包可能存在于多个通道上。如果希望从默认通道以外的其他通道安装,则指定要使用哪个通道的一种方法是使用conda install -c channel_name package_name语法。 另请阅读this以获取使用通道的安装过程的描述.
同时使用R和pythonconda install rpy2
安装R package conda install -c r r-dplyr
pip切换源 pip install package -i url
豆瓣 http://pypi.douban.com/simple/
阿里云 http://mirrors.aliyun.com/pypi/simple/
清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/
中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/
华中科技大学 http://pypi.hustunique.com/
一、均值和自协方差函数
mean公式
μ
x
(
t
)
=
E
(
x
t
)
\mu_x(t) =E(x_t)
μx(t)=E(xt)
ACVF(Autocovariance function)
γ
x
(
s
,
t
)
=
C
o
v
(
X
s
,
X
t
)
=
E
[
(
X
s
−
μ
x
(
s
)
)
(
X
t
−
μ
x
(
t
)
)
]
\gamma_x(s,t)=Cov(X_s,X_t)=E[(X_s-\mu_x(s))(X_t-\mu_x(t))]
γx(s,t)=Cov(Xs,Xt)=E[(Xs−μx(s))(Xt−μx(t))]
ACF(Autocorrelation function)
ρ
x
(
s
,
t
)
=
C
o
r
r
(
X
s
,
X
t
)
=
γ
x
(
s
,
t
)
γ
x
(
s
,
s
)
γ
x
(
t
,
t
)
\rho_x(s,t)=Corr(X_s,X_t)=\frac{\gamma_x(s,t)}{\gamma_x(s,s)\gamma_x(t,t)}
ρx(s,t)=Corr(Xs,Xt)=γx(s,s)γx(t,t)γx(s,t)
C
o
v
(
.
,
.
)
Cov(.,.)
Cov(.,.)的性质:
C
o
v
(
X
,
Y
)
=
C
o
v
(
Y
,
X
)
Cov(X,Y)=Cov(Y,X)
Cov(X,Y)=Cov(Y,X)
C
o
v
(
X
,
X
)
=
V
a
r
(
X
)
Cov(X,X)=Var(X)
Cov(X,X)=Var(X)
C
o
v
(
X
,
a
)
=
0
Cov(X,a)=0
Cov(X,a)=0
C
o
v
(
X
+
Y
,
Z
)
=
C
o
v
(
X
,
Z
)
+
C
o
v
(
Y
,
Z
)
Cov(X+Y,Z)=Cov(X,Z)+Cov(Y,Z)
Cov(X+Y,Z)=Cov(X,Z)+Cov(Y,Z)
C
o
v
(
a
X
,
Y
)
=
a
C
o
v
(
X
,
Y
)
Cov(aX,Y)=aCov(X,Y)
Cov(aX,Y)=aCov(X,Y)
C
o
v
(
X
,
Y
)
≤
C
o
v
(
X
,
Z
)
+
C
o
v
(
Y
,
Z
)
Cov(X,Y) \leq Cov(X,Z)+Cov(Y,Z)
Cov(X,Y)≤Cov(X,Z)+Cov(Y,Z)
二、平稳时间序列
strict stationary
(
x
t
1
,
.
.
.
x
t
n
)
=
(
x
t
1
+
h
,
.
.
.
x
t
n
+
h
)
(x_{t1},...x_{tn})=(x_{t1+h},...x_{tn+h})
(xt1,...xtn)=(xt1+h,...xtn+h)
weak stationary
E
[
x
t
]
=
m
E[x_t]=m
E[xt]=m
E
[
∣
x
t
∣
2
]
<
∞
E[|x_t|^2]<\infty
E[∣xt∣2]<∞
γ
x
(
r
,
s
)
=
γ
x
(
r
+
t
,
s
+
t
)
\gamma_x(r,s)=\gamma_x(r+t,s+t)
γx(r,s)=γx(r+t,s+t)
对于平稳时间序列,acvf可简写作
γ
x
(
t
,
t
+
h
)
=
γ
x
(
h
)
\gamma_x(t,t+h)=\gamma_x(h)
γx(t,t+h)=γx(h)
平稳过程的例子:
(1)white noise
(2)3点的移动平均
X
t
=
1
3
(
W
t
−
1
+
W
t
+
W
t
+
1
)
X_t=\frac{1}{3}(W_{t-1}+W_{t}+W_{t+1})
Xt=31(Wt−1+Wt+Wt+1)
非平稳过程的例子:
(1)signal+noise
X
t
=
g
(
t
)
+
W
t
X_t=g(t)+W_{t}
Xt=g(t)+Wt
(2)Random walk with a drift
三、 经典时序建模方法
(1)假定该随机过程可拆分为
确定性的趋势
季节组分
平稳的随机组分
(2)估计模型参数: OLS
(3)检查模型拟合优度:AIC、BIC
(4)预测
可选的方法:Box and Jenkins
四、 超前序列和滞后序列
差分算子:
∇
d
X
t
=
X
t
−
X
t
−
d
\nabla_d X_t=X_t-X_{t-d}
∇dXt=Xt−Xt−d
∇
k
X
t
=
∇
(
∇
k
−
1
(
X
t
)
)
,
k
≥
1
\nabla^k X_t=\nabla(\nabla^{k-1}(X_t)),k\geq 1
∇kXt=∇(∇k−1(Xt)),k≥1
滞后算子:
B
k
X
t
=
X
t
−
k
B^kX_t=X_{t-k}
BkXt=Xt−k
五 绘制时序图R示例
画两条TS在一张大图,两行一列两个小图形式排列
plot.ts(time_series_to_be_plotted,
plot.type = “multiple”, nc = 1, main = ts_title)
画两条TS在一张图
plot.ts(time_series_to_be_plotted,
plot.type=“single”, main=ts_title, col=colors_name,
ylab=“amplitudes”)
legend(“bottomright”, time_series_name, col=colors_name, lty=1)
构造一个分段时序
s_i_fun = function(t) ifelse(t<=125, 0, 10*exp(-(t-125)/25)*cos(2*pi*t/4))
omega_fun = function(t) rnorm(length(t))
t_index = 1:250
set.seed(19460614)
x_i = ts(s_i_fun(t_index) + omega_fun(t_index))
R语言中::双冒号的作用
要使用某个包里的函数,通常做法是先加载(library)包,再调用函数。
最新加载的包的namespace会成为最新的enviroment,某些情况下可能影响函数的结果。
package name::functionname的用法
一是可以在需要用某个函数时临时直接加载包,不用事先library。另一点更重要的是尽可能减少library带来的附带作用,这一点在开发R包时影响较大。而这种写法的副作用,是会稍微慢上那么几毫秒,在需要反复循环使用一个函数时对效率有影响,其他时候除了写起来麻烦一点,基本没有显见的副作用。