Processing math: 40%

时间序列分析:Yule-Walker 估计示例

1. AR(2)

  考虑 AR(2) 过程

Xt=ϕ1Xt1+ϕ2Xt2+et

其中 etN(0,σ2e)et 独立于 Xt1,Xt2,,并假设序列具有零均值。

1.1. 估计 ϕ

  首先计算样本的自相关 r1r2,由方程

[r1r2]=[1r1r11][ˆϕ1ˆϕ2]

可以解得参数 ˆϕ1ˆϕ2

1.2. 估计方差

  对式 (1) 等号两边计算方差,得

Var(Xt)=ϕ21Var(Xt1)+ϕ22Var(Xt2)+2ϕ1ϕ2Cov(Xt1,Xt2)+σ2e

可以解得

\begin{equation} \sigma_e^2 = \gamma_0 – \phi_1^2\gamma_1 + \phi_2^2\gamma_2 – 2\phi_1\phi_2\gamma_1 = \gamma_0(1 – \phi_1^2 – \phi_2^2 – 2\phi_1\phi_2\rho_1) \tag{3} \end{equation}

  由 Yule-Walker 方程组

\begin{equation} \begin{bmatrix} \rho_1 \\ \rho_2 \end{bmatrix} = \begin{bmatrix} 1 & \rho_1 \\ \rho_1 & 1 \end{bmatrix} \begin{bmatrix} \phi_1 \\ \phi_2 \end{bmatrix} \end{equation}

\begin{align} \rho_1 = \phi_1 + \rho_1 \phi_2 \\ \rho_2 = \rho_1 \phi_1 + \phi_2 \end{align}

于是

\begin{align} 1 – \phi_1^2 – \phi_2^2 – 2\phi_1\phi_2\rho_1 &= 1 – \phi_1^2 – \phi_1\phi_2\rho_1 – \phi_2^2 – \phi_1\phi_2\rho_1 \\ &= 1 – \phi_1(\phi_1 + \rho_1\phi_2) – \phi_2(\phi_2 + \rho_1\phi_1) \\ &= 1 – \phi_1\rho_1 – \phi_2\rho_2 \end{align}

将上式带入式 (3),得

\begin{equation} \sigma_e^2 = \gamma_0(1 – \phi_1\rho_1 – \phi_2\rho_2) \tag{4} \end{equation}

\sigma_e^2 的 Yule-Walker 估计是

\begin{equation} \hat \sigma_e^2 = c_0(1 – \hat\phi_1 r_1 – \hat\phi_2 r_2) \tag{5} \end{equation}

其中 c_0 是样本协方差系数,r_1, r_2 是样本自相关系数,\hat\phi_1, \hat\phi_2 是估计的参数。

  更一般地,对 \mathrm{AR}(2) 过程 \sigma_e^2 的 Yule-Walker 估计是

\begin{equation} \hat \sigma_e^2 = c_0(1 – \sum_{i=1}^p \hat\phi_i r_i) \tag{6} \end{equation}

1.3. 代码示例

  首先模拟 \mathrm{AR}(2) 过程

set.seed(42)
ar.process=arima.sim(10000, model=list(ar=c(1/3, 1/2)), sd=4)
set.seed(42) ar.process=arima.sim(10000, model=list(ar=c(1/3, 1/2)), sd=4)
set.seed(42)
ar.process=arima.sim(10000, model=list(ar=c(1/3, 1/2)), sd=4)

使用的参数为 \phi_1 = 1/3\phi_1 = 1/2\sigma_e^2 = 4^2 = 16

  计算样本自相关系数

r <- acf(ar.process, plot=F)$acf[2:3]
r <- acf(ar.process, plot=F)$acf[2:3]
r <- acf(ar.process, plot=F)$acf[2:3]

这里 r 的值为 0.6701659498254 0.731929559010564

  构造 Yule-Walker 方程组并求解

R <- matrix(1, 2, 2)
R[1, 2] <- r[1]
R[2, 1] <- r[1]
b <- matrix(r, nrow=2, ncol=1)
phi.hat <- solve(R, b)
R <- matrix(1, 2, 2) R[1, 2] <- r[1] R[2, 1] <- r[1] b <- matrix(r, nrow=2, ncol=1) phi.hat <- solve(R, b)
R <- matrix(1, 2, 2)
R[1, 2] <- r[1]
R[2, 1] <- r[1]

b <- matrix(r, nrow=2, ncol=1)

phi.hat <- solve(R, b)

这里 R 的值为

1.0000000 0.6701659
0.6701659 1.0000000
1.0000000 0.6701659 0.6701659 1.0000000
1.0000000 0.6701659
0.6701659   1.0000000

b 的值为

0.6701659
0.7319296
0.6701659 0.7319296
0.6701659
0.7319296

解得 phi.hat 的值为

0.3261191
0.5133757
0.3261191 0.5133757
0.3261191
0.5133757

可见 phi.hat 的结果与实际参数(1/3, 1/2)很接近。

  接着估计 \hat\sigma_e^2

c0 <- acf(ar.process, type='covariance', plot=F)$acf[1]
var.hat <- c0 * (1 - sum(phi.hat * r))
sd.hat <- sqrt(var.hat)
c0 <- acf(ar.process, type='covariance', plot=F)$acf[1] var.hat <- c0 * (1 - sum(phi.hat * r)) sd.hat <- sqrt(var.hat)
c0 <- acf(ar.process, type='covariance', plot=F)$acf[1]
var.hat <- c0 * (1 - sum(phi.hat * r))
sd.hat <- sqrt(var.hat)

解得 sd.hat 的值为 4.02197762014053,与实际值 \sigma_e^2 = 4 也很接近。

2. \mathrm{AR}(3)

  \mathrm{AR}(3) 过程的 Yule-Walker 估计方法与前面类似。首先模拟 \mathrm{AR}(3) 过程如下

set.seed(42)
ar.process=arima.sim(10000, model=list(ar=c(1/3, 1/2, 7/100)), sd=4)
set.seed(42) ar.process=arima.sim(10000, model=list(ar=c(1/3, 1/2, 7/100)), sd=4)
set.seed(42)
ar.process=arima.sim(10000, model=list(ar=c(1/3, 1/2, 7/100)), sd=4)

然后进行估计

r <- acf(ar.process, plot=F)$acf[2:4]
R <- matrix(1, 3, 3)
R[1, 2] <- r[1]
R[2, 1] <- r[1]
R[1, 3] <- r[2]
R[3, 1] <- r[2]
R[2, 3] <- r[1]
R[3, 2] <- r[1]
b <- matrix(r, nrow=3, ncol=1)
phi.hat <- solve(R, b)
c0 <- acf(ar.process, type='covariance', plot=F)$acf[1]
var.hat <- c0 * (1 - sum(phi.hat * r))
sd.hat <- sqrt(var.hat)
r <- acf(ar.process, plot=F)acf[2:4] R <- matrix(1, 3, 3) R[1, 2] <- r[1] R[2, 1] <- r[1] R[1, 3] <- r[2] R[3, 1] <- r[2] R[2, 3] <- r[1] R[3, 2] <- r[1] b <- matrix(r, nrow=3, ncol=1) phi.hat <- solve(R, b) c0 <- acf(ar.process, type='covariance', plot=F)acf[1] var.hat <- c0 * (1 - sum(phi.hat * r)) sd.hat <- sqrt(var.hat)
r <- acf(ar.process, plot=F)$acf[2:4]

R <- matrix(1, 3, 3)
R[1, 2] <- r[1]
R[2, 1] <- r[1]
R[1, 3] <- r[2]
R[3, 1] <- r[2]
R[2, 3] <- r[1]
R[3, 2] <- r[1]

b <- matrix(r, nrow=3, ncol=1)

phi.hat <- solve(R, b)

c0 <- acf(ar.process, type='covariance', plot=F)$acf[1]
var.hat <- c0 * (1 - sum(phi.hat * r))
sd.hat <- sqrt(var.hat)

得到的 phi.hat

0.3259706
0.5124173
0.0689914
0.3259706 0.5124173 0.0689914
0.3259706
0.5124173
0.0689914

sd.hat4.02255420924941,可见估计结果与实际值都很接近。