第 4 章 时间序列分析中的 ARIMA 模型

4.1 如何平滑时间序列?

在 R 语言中,可以使用多种方法平滑时间序列,以下为你介绍常见的几种:

移动平均法(Moving Average)

移动平均是一种简单的平滑方法,通过计算一定时间窗口内数据的平均值来平滑序列。

  • 简单移动平均(Simple Moving Average, SMA)

原理:对时间序列数据的一个固定长度窗口内的数据求平均。例如,对于时间序列 \(y_1,y_2,\cdots,y_n\) ,窗口大小为 \(k\) ,简单移动平均序列 \(SMA_t\) 的计算为 \(SMA_t=\frac{y_{t - \lfloor\frac{k - 1}{2}\rfloor}+\cdots + y_{t+\lfloor\frac{k - 1}{2}\rfloor}}{k}\) ,其中 \(t\) 为时间点,\(\lfloor\cdot\rfloor\) 为向下取整函数。

# 创建一个简单的时间序列
ts_data <- ts(c(12, 15, 18, 20, 22, 25, 27, 30), frequency = 1)
# 使用 stats 包中的 filter 函数实现简单移动平均,窗口大小为3
smoothed_data <- filter(ts_data, filter = rep(1/3, 3), sides = 1)
plot(ts_data, main = "Original vs Smoothed Time Series", ylab = "Value")
lines(smoothed_data, col = "red")

filter 函数中,filter 参数指定权重,这里使用等权重(窗口大小为 3 时,每个权重为 1/3),sides = 1 表示使用单边移动平均(即从序列开始依次计算移动平均)。

  • 加权移动平均(Weighted Moving Average, WMA)

与简单移动平均类似,但窗口内的数据点赋予不同的权重,权重之和为 1。权重通常根据时间点与当前点的距离或其他重要性因素确定。

# 创建时间序列
ts_data <- ts(c(12, 15, 18, 20, 22, 25, 27, 30), frequency = 1)
# 定义权重,这里使用递减权重
weights <- c(0.1, 0.3, 0.6)
weighted_smoothed <- filter(ts_data, filter = weights, sides = 1)
plot(ts_data, main = "Original vs Weighted Smoothed Time Series", ylab = "Value")
lines(weighted_smoothed, col = "red")

这里定义了权重weights,距离当前点越近的数据权重越大,然后使用filter函数计算加权移动平均。

  • 指数平滑法(Exponential Smoothing)

指数平滑法对近期数据赋予更高的权重,对远期数据权重呈指数递减。

简单指数平滑(Simple Exponential Smoothing, SES)原理:

假设时间序列 \(y_t\) ,预测值 \(F_{t+1}\) 是当前实际值 \(y_t\) 和上一期预测值 \(F_t\) 的加权平均,即:

\[ F_{t + 1}=\alpha y_t+(1 - \alpha)F_t \]

其中: \(\alpha\) 是平滑参数,且 \(0<\alpha<1\)

library(forecast)
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
ts_data <- ts(c(12, 15, 18, 20, 22, 25, 27, 30), frequency = 1)
# 使用 ses 函数进行简单指数平滑,设置初始值和参数
fit <- ses(ts_data, alpha = 0.3, initial = "simple")
smoothed <- fitted(fit)
plot(ts_data, main = "Original vs SES Smoothed Time Series", ylab = "Value")
lines(smoothed, col = "red")

ses 函数来自forecast 包,alpha设置平滑参数,initial设置初始预测值的计算方法。

  • Holt-Winters 指数平滑

用于处理具有趋势和季节性的时间序列。它有三个平滑参数 \(\alpha\)(水平平滑参数)、 \(\beta\) (趋势平滑参数)和 \(\gamma\)(季节性平滑参数),分别对时间序列的水平、趋势和季节性成分进行平滑。

library(forecast)
# 创建具有季节性的时间序列
ts_data <- ts(c(12, 15, 18, 20, 22, 25, 27, 30), frequency = 4)
fit <- HoltWinters(ts_data)
smoothed <- fitted(fit)
# 确保长度一致
if (length(smoothed) > length(ts_data)) {
  smoothed <- smoothed[1:length(ts_data)]
}
plot(ts_data, main = "Original vs Holt - Winters Smoothed Time Series", ylab = "Value")
lines(smoothed, col = "red")

HoltWinters函数会自动估计平滑参数(也可手动设置),frequency参数指定季节性周期。

  • 局部加权回归(Locally Weighted Scatterplot Smoothing, LOESS)

对每个数据点,在其局部邻域内拟合一个加权回归模型。权重通常基于数据点与目标点的距离确定,距离越近权重越高。

ts_data <- ts(c(12, 15, 18, 20, 22, 25, 27, 30), frequency = 1)
# 使用 loess 函数进行平滑
loess_fit <- loess(as.numeric(ts_data) ~ time(ts_data))
smoothed <- predict(loess_fit)
plot(ts_data, main = "Original vs LOESS Smoothed Time Series", ylab = "Value")
lines(smoothed, col = "red")

loess函数中,as.numeric(ts_data) ~ time(ts_data)表示对时间序列值与时间进行局部加权回归,predict函数获取平滑后的预测值。

这些方法各有特点,你可以根据时间序列的特征(如是否有趋势、季节性等)选择合适的平滑方法。

4.2 如何拟合 AR 模型

在金融时间序列分析中,使用 R 语言拟合自回归(AR)模型通常使用 stats 包,它是 R 语言的基础包,默认安装且加载,无需额外安装。如果需要进行更高级的时间序列分析和预测,还可以加载 forecast 包。

# 加载 forecast 包(如果需要更高级功能)
library(forecast)

假设已经有一个金融时间序列数据,例如股票价格序列,将其转换为 R 语言中的时间序列对象。

# 示例数据,假设这是一个简单的价格序列
price_data <- c(100, 102, 105, 103, 107, 104, 109, 106, 110, 108)
# 将数据转换为时间序列对象
ts_data <- ts(price_data, frequency = 1)

可以使用 ar 函数(来自 stats 包)或 auto.arima 函数(来自 forecast 包,它可以自动选择合适的 ARIMA 模型阶数,包括 AR 部分)来拟合 AR 模型。

使用 ar 函数

ar 函数通过不同的方法估计 AR 模型的参数,常用的方法有 yule - walker、burg 等。

# 使用 yule - walker 方法拟合 AR 模型,假设我们预先知道 AR 阶数为2
fit_ar <- ar(ts_data, order.max = 2, method = "yule-walker")
# 查看拟合结果
print(fit_ar)
## 
## Call:
## ar(x = ts_data, order.max = 2, method = "yule-walker")
## 
## 
## Order selected 0  sigma^2 estimated as  10.3

在上述代码中:

order.max 参数指定了最大的 AR 阶数。这里设置为 2,表示拟合 AR (2) 模型。 method 参数指定估计方法,"yule - walker" 是一种常用的估计自回归模型参数的方法。

使用 auto.arima 函数

auto.arima 函数会自动选择合适的 ARIMA (p,d,q) 模型阶数,其中 p 是 AR 阶数。

# 使用 auto.arima 函数拟合 ARIMA 模型(会自动选择 AR 阶数)
fit_auto_arima <- auto.arima(ts_data)
# 查看拟合结果
print(fit_auto_arima)
## Series: ts_data 
## ARIMA(1,1,0) with drift 
## 
## Coefficients:
##          ar1  drift
##       -0.902  0.994
## s.e.   0.098  0.219
## 
## sigma^2 = 1.8:  log likelihood = -15.11
## AIC=36.22   AICc=41.02   BIC=36.81

拟合模型后,需要对模型进行诊断,检查模型是否合适。常用的方法是查看残差的自相关函数(ACF)和偏自相关函数(PACF),理想情况下,残差应该是白噪声序列。

# 提取残差
residuals_ar <- residuals(fit_ar)
# 绘制残差的 ACF 和 PACF
par(mfrow = c(2,1))
acf(residuals_ar, main = "ACF of Residuals (AR Model)")
pacf(residuals_ar, main = "PACF of Residuals (AR Model)")

在上述代码中: residuals 函数用于提取模型的残差。acfpacf 函数分别用于绘制自相关函数和偏自相关函数图,通过观察这些图,可以判断残差是否为白噪声序列。如果残差是白噪声,ACF 和 PACF 图应该在零值附近随机波动,没有明显的模式。

4.3 如何使用拟合好的模型进行预测?

使用 ar 函数的预测

# 使用拟合好的 AR 模型进行预测,预测未来3期
forecast_ar <- predict(fit_ar, n.ahead = 3)
# 查看预测结果
print(forecast_ar)
## $pred
## Time Series:
## Start = 11 
## End = 13 
## Frequency = 1 
## [1] 105.4 105.4 105.4
## 
## $se
## Time Series:
## Start = 11 
## End = 13 
## Frequency = 1 
## [1] 3.204 3.204 3.204

使用 auto.arima 函数的预测

# 使用拟合好的 auto.arima 模型进行预测,预测未来3期
forecast_auto_arima <- forecast(fit_auto_arima, h = 3)
# 查看预测结果
print(forecast_auto_arima)
##    Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## 11          111.7 110.0 113.4 109.1 114.3
## 12          110.3 108.5 112.0 107.6 112.9
## 13          113.4 111.1 115.8 109.9 117.0
# 绘制预测图
plot(forecast_auto_arima, main = "Forecast from auto.arima")

在上述代码中: predict 函数(用于 ar 模型的预测)和 forecast 函数(用于 auto.arima 模型的预测)的 n.ahead 或 h 参数指定了预测的期数。

通过以上步骤,可以在 R 语言中完成金融时间序列的 AR 模型拟合、诊断和预测。需要注意的是,在实际应用中,需要根据数据的特点和分析目的选择合适的方法和模型阶数。

4.4 如何拟合MA模型?

在 R 语言中拟合移动平均(MA)模型与拟合 AR 模型类似,通常使用基础的 stats 包,若需更高级的时间序列分析功能,可加载 forecast 包。

# 加载forecast包(如果需要更高级功能)
library(forecast) 

将金融时间序列数据转换为 R 语言中的时间序列对象。

# 示例数据,假设这是一个简单的收益率序列
return_data <- c(0.01, 0.02, -0.01, 0.03, -0.02, 0.04, 0.01, -0.03, 0.02, 0.05) 
# 将数据转换为时间序列对象
ts_data <- ts(return_data, frequency = 1) 

使用airma拟合模型

arima 函数可用于拟合 ARIMA (p, d, q) 模型,当 p = 0 时即为 MA (q) 模型。

# 假设我们拟合MA(1)模型
fit_ma <- arima(ts_data, order = c(0, 0, 1)) 
# 查看拟合结果
print(fit_ma) 
## 
## Call:
## arima(x = ts_data, order = c(0, 0, 1))
## 
## Coefficients:
##          ma1  intercept
##       -1.000      0.009
## s.e.   0.259      0.002
## 
## sigma^2 estimated as 0.000253:  log likelihood = 26.02,  aic = -46.04

在上述代码中:order 参数设定了 ARIMA 模型的阶数,c(0, 0, 1) 分别对应 p(自回归阶数)、d(差分阶数)和 q(移动平均阶数),这里 p = 0,d = 0,q = 1 表示拟合 MA (1) 模型。

使用auto.arima 函数拟合模型

auto.arima 函数会自动选择合适的 ARIMA (p, d, q) 模型阶数,可能会选择到 MA 模型。

# 使用auto.arima函数拟合ARIMA模型(可能选择到MA模型)
fit_auto_arima <- auto.arima(ts_data) 
# 查看拟合结果
print(fit_auto_arima) 
## Series: ts_data 
## ARIMA(0,0,0) with zero mean 
## 
## sigma^2 = 0.00074:  log likelihood = 21.85
## AIC=-41.71   AICc=-41.21   BIC=-41.41

拟合模型后需对其进行诊断,检查模型是否合适。同样可查看残差的自相关函数(ACF)和偏自相关函数(PACF),理想情况下,残差应是白噪声序列。

# 提取残差
residuals_ma <- residuals(fit_ma) 
# 绘制残差的ACF和PACF
par(mfrow = c(2, 1)) 
acf(residuals_ma, main = "ACF of Residuals (MA Model)") 
pacf(residuals_ma, main = "PACF of Residuals (MA Model)") 

使用拟合好的模型进行预测。

使用 arima 函数的预测

# 使用拟合好的MA模型进行预测,预测未来3期
forecast_ma <- predict(fit_ma, n.ahead = 3) 
# 查看预测结果
print(forecast_ma) 
## $pred
## Time Series:
## Start = 11 
## End = 13 
## Frequency = 1 
## [1] -0.015092  0.009454  0.009454
## 
## $se
## Time Series:
## Start = 11 
## End = 13 
## Frequency = 1 
## [1] 0.01662 0.02250 0.02250

使用 auto.arima 函数的预测

# 使用拟合好的auto.arima模型进行预测,预测未来3期
forecast_auto_arima <- forecast(fit_auto_arima, h = 3) 
# 查看预测结果
print(forecast_auto_arima) 
##    Point Forecast    Lo 80   Hi 80    Lo 95
## 11              0 -0.03486 0.03486 -0.05332
## 12              0 -0.03486 0.03486 -0.05332
## 13              0 -0.03486 0.03486 -0.05332
##      Hi 95
## 11 0.05332
## 12 0.05332
## 13 0.05332
# 绘制预测图
plot(forecast_auto_arima, main = "Forecast from auto.arima") 

在预测部分,predict 函数(用于 arima 模型的预测)和 forecast 函数(用于 auto.arima 模型的预测)的 n.ahead 或 h 参数指定了预测的期数。

4.5 如何拟合 ARIMA 模型?

在 R 语言中拟合自回归积分滑动平均(ARIMA)模型,通常会用到 stats 包,它是 R 语言的基础包,默认已安装并加载。若需要更高级的时间序列分析和预测功能,还可以加载 forecast 包。

# 加载 forecast 包(如果需要更高级功能)
library(forecast) 

假设已有金融时间序列数据,需将其转换为 R 语言中的时间序列对象。

# 示例数据,假设这是一个简单的股价序列
stock_price <- c(100, 102, 105, 103, 107, 104, 109, 106, 110, 108)
# 将数据转换为时间序列对象
ts_data <- ts(stock_price, frequency = 1) 

ARIMA 模型要求数据是平稳的,或者通过差分使其平稳。可以通过绘制时间序列图、计算自相关函数(ACF)和偏自相关函数(PACF),或者使用单位根检验(如 ADF 检验)来判断数据的平稳性。

# 绘制时间序列图
plot(ts_data, main = "Time Series Plot")

# 计算ACF和PACF
par(mfrow = c(2,1))
acf(ts_data, main = "ACF of Time Series")
pacf(ts_data, main = "PACF of Time Series")

# ADF检验
library(tseries)
adf.test(ts_data)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  ts_data
## Dickey-Fuller = -2.2, Lag order = 2, p-value
## = 0.5
## alternative hypothesis: stationary

如果数据不平稳,通常需要进行差分处理。d 表示差分阶数,例如一阶差分可以这样实现:

# 一阶差分
diff_data <- diff(ts_data, differences = 1)

使用 arima 函数手动指定阶数 arima 函数可用于拟合 ARIMA (p, d, q) 模型,其中 p 是自回归阶数,d 是差分阶数,q 是移动平均阶数。你需要根据数据的 ACF 和 PACF 图,以及经验来选择合适的 p、d 和 q 值。

# 假设经过分析,选择p = 1, d = 1, q = 1
fit_arima <- arima(ts_data, order = c(1, 1, 1)) 
# 查看拟合结果
print(fit_arima) 
## 
## Call:
## arima(x = ts_data, order = c(1, 1, 1))
## 
## Coefficients:
##          ar1    ma1
##       -0.866  0.340
## s.e.   0.172  0.361
## 
## sigma^2 estimated as 4.09:  log likelihood = -19.51,  aic = 45.03

使用 auto.arima 函数自动选择阶数 auto.arima 函数(来自 forecast 包)可以自动选择合适的 ARIMA 模型阶数。它会尝试不同的 p、d、q 组合,并根据信息准则(如 AIC、BIC 等)选择最优模型。

# 使用 auto.arima 函数拟合ARIMA模型
fit_auto_arima <- auto.arima(ts_data) 
# 查看拟合结果
print(fit_auto_arima) 
## Series: ts_data 
## ARIMA(1,1,0) with drift 
## 
## Coefficients:
##          ar1  drift
##       -0.902  0.994
## s.e.   0.098  0.219
## 
## sigma^2 = 1.8:  log likelihood = -15.11
## AIC=36.22   AICc=41.02   BIC=36.81

拟合模型后,需要对模型进行诊断,以确保模型合适。主要通过检查残差是否为白噪声序列来判断。

# 提取残差
residuals_arima <- residuals(fit_arima) 

# 绘制残差的ACF和PACF
par(mfrow = c(2,1))
acf(residuals_arima, main = "ACF of Residuals")
pacf(residuals_arima, main = "PACF of Residuals")

# 进行Ljung-Box检验
Box.test(residuals_arima, lag = 10, type = "Ljung-Box")
## 
##  Box-Ljung test
## 
## data:  residuals_arima
## X-squared = NA, df = 10, p-value = NA

理想情况下,残差的 ACF 和 PACF 应在零值附近随机波动,Ljung - Box 检验的 p 值应大于显著性水平(如 0.05),表明残差是白噪声序列,即模型已充分捕捉数据中的信息。

使用拟合好的 ARIMA 模型进行预测。

使用 arima 函数的预测

# 使用拟合好的ARIMA模型进行预测,预测未来3期
forecast_arima <- predict(fit_arima, n.ahead = 3) 
# 查看预测结果
print(forecast_arima) 
## $pred
## Time Series:
## Start = 11 
## End = 13 
## Frequency = 1 
## [1] 110.1 108.3 109.8
## 
## $se
## Time Series:
## Start = 11 
## End = 13 
## Frequency = 1 
## [1] 2.022 2.238 2.923

使用 auto.arima 函数的预测

# 使用拟合好的auto.arima模型进行预测,预测未来3期
forecast_auto_arima <- forecast(fit_auto_arima, h = 3) 
# 查看预测结果
print(forecast_auto_arima) 
##    Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## 11          111.7 110.0 113.4 109.1 114.3
## 12          110.3 108.5 112.0 107.6 112.9
## 13          113.4 111.1 115.8 109.9 117.0
par(mar = c(5, 4, 4, 2) + 0.1)
# 绘制预测图
plot(forecast_auto_arima, main = "Forecast from auto.arima") 

在预测部分,predict 函数(用于 arima 模型的预测)和 forecast 函数(用于 auto.arima 模型的预测)的 n.ahead 或 h 参数指定了预测的期数。

4.6 如何拟合 VAR 模型?

在 R 语言中拟合向量自回归(VAR)模型,常用的是 vars 包,它提供了一系列用于 VAR 模型估计、检验和预测的函数。

# 加载包
library(vars)

# 加载 VAR 包中的数据
data(Canada)

选择合适的滞后阶数对 VAR 模型很关键。可以使用信息准则,如赤池信息准则(AIC)、贝叶斯信息准则(BIC)等来确定。

# 使用 VARselect 函数来选择滞后阶数
lag_selection <- VARselect(Canada, lag.max = 5, type = "const")
print(lag_selection)
## $selection
## AIC(n)  HQ(n)  SC(n) FPE(n) 
##      3      2      2      3 
## 
## $criteria
##                1         2         3         4
## AIC(n) -5.817852 -6.350937 -6.397756 -6.145942
## HQ(n)  -5.577530 -5.918357 -5.772918 -5.328846
## SC(n)  -5.217992 -5.271189 -4.838120 -4.106417
## FPE(n)  0.002976  0.001752  0.001686  0.002202
##                5
## AIC(n) -5.926500
## HQ(n)  -4.917146
## SC(n)  -3.407087
## FPE(n)  0.002811

在上述代码中: * VARselect 函数用于选择滞后阶数。 * lag.max 参数指定要考虑的最大滞后阶数。 * type 参数指定模型中包含的外生变量类型,“const” 表示包含常数项。

根据确定的滞后阶数,使用 VAR 函数拟合 VAR 模型。

# 根据选择的滞后阶数拟合VAR模型
lag_order <- lag_selection$selection[1]
fit_var <- VAR(Canada, p = lag_order, type = "const")
print(fit_var)
## 
## VAR Estimation Results:
## ======================= 
## 
## Estimated coefficients for equation e: 
## ====================================== 
## Call:
## e = e.l1 + prod.l1 + rw.l1 + U.l1 + e.l2 + prod.l2 + rw.l2 + U.l2 + e.l3 + prod.l3 + rw.l3 + U.l3 + const 
## 
##       e.l1    prod.l1      rw.l1       U.l1 
##    1.75274    0.16962   -0.08260    0.09952 
##       e.l2    prod.l2      rw.l2       U.l2 
##   -1.18385   -0.10574   -0.02439   -0.05077 
##       e.l3    prod.l3      rw.l3       U.l3 
##    0.58725    0.01054    0.03824    0.34139 
##      const 
## -150.68737 
## 
## 
## Estimated coefficients for equation prod: 
## ========================================= 
## Call:
## prod = e.l1 + prod.l1 + rw.l1 + U.l1 + e.l2 + prod.l2 + rw.l2 + U.l2 + e.l3 + prod.l3 + rw.l3 + U.l3 + const 
## 
##       e.l1    prod.l1      rw.l1       U.l1 
##   -0.14880    1.14799    0.02359   -0.65814 
##       e.l2    prod.l2      rw.l2       U.l2 
##   -0.18165   -0.19627   -0.20337    0.82237 
##       e.l3    prod.l3      rw.l3       U.l3 
##    0.57495    0.04415    0.09337    0.40078 
##      const 
## -195.86985 
## 
## 
## Estimated coefficients for equation rw: 
## ======================================= 
## Call:
## rw = e.l1 + prod.l1 + rw.l1 + U.l1 + e.l2 + prod.l2 + rw.l2 + U.l2 + e.l3 + prod.l3 + rw.l3 + U.l3 + const 
## 
##       e.l1    prod.l1      rw.l1       U.l1 
## -4.716e-01 -6.500e-02  9.091e-01 -7.941e-04 
##       e.l2    prod.l2      rw.l2       U.l2 
##  6.667e-01 -2.164e-01 -1.457e-01 -3.014e-01 
##       e.l3    prod.l3      rw.l3       U.l3 
## -1.289e-01  2.140e-01  1.902e-01  1.506e-01 
##      const 
## -1.167e+01 
## 
## 
## Estimated coefficients for equation U: 
## ====================================== 
## Call:
## U = e.l1 + prod.l1 + rw.l1 + U.l1 + e.l2 + prod.l2 + rw.l2 + U.l2 + e.l3 + prod.l3 + rw.l3 + U.l3 + const 
## 
##      e.l1   prod.l1     rw.l1      U.l1      e.l2 
##  -0.61773  -0.09778   0.01455   0.65976   0.51811 
##   prod.l2     rw.l2      U.l2      e.l3   prod.l3 
##   0.08799   0.06993  -0.08099  -0.03006  -0.01092 
##     rw.l3      U.l3     const 
##  -0.03909   0.06684 114.36732

在上述代码中:p 参数设置为通过信息准则选择的滞后阶数。

拟合 VAR 模型后,需要对模型进行诊断,检查模型是否合适。常见的诊断方法包括:

  • 残差的自相关检验
# 检验残差的自相关
serial.test(fit_var, lags.pt = 10, type = "PT.asymptotic")
## 
##  Portmanteau Test (asymptotic)
## 
## data:  Residuals of VAR object fit_var
## Chi-squared = 92, df = 112, p-value = 0.9
  • 残差的正态性检验
# 检验残差的正态性
normality.test(fit_var)
## $JB
## 
##  JB-Test (multivariate)
## 
## data:  Residuals of VAR object fit_var
## Chi-squared = 16, df = 8, p-value = 0.04
## 
## 
## $Skewness
## 
##  Skewness only (multivariate)
## 
## data:  Residuals of VAR object fit_var
## Chi-squared = 6.5, df = 4, p-value = 0.2
## 
## 
## $Kurtosis
## 
##  Kurtosis only (multivariate)
## 
## data:  Residuals of VAR object fit_var
## Chi-squared = 9.7, df = 4, p-value = 0.05
  • 格兰杰因果关系检验

可以检验每个变量对其他变量是否存在格兰杰因果关系。

# 对变量进行格兰杰因果关系检验
causality(fit_var)
## Warning in causality(fit_var): 
## Argument 'cause' has not been specified;
## using first variable in 'x$y' (e) as cause variable.
## $Granger
## 
##  Granger causality H0: e do not Granger-cause
##  prod rw U
## 
## data:  VAR object fit_var
## F-Test = 3.9, df1 = 9, df2 = 272, p-value =
## 1e-04
## 
## 
## $Instant
## 
##  H0: No instantaneous causality between: e
##  and prod rw U
## 
## data:  VAR object fit_var
## Chi-squared = 29, df = 3, p-value = 3e-06

使用拟合好的 VAR 模型进行预测。

# 预测未来3期
forecast_var <- predict(fit_var, n.ahead = 3, ci=0.95)
print(forecast_var)
## $e
##       fcst lower upper     CI
## [1,] 962.8 962.2 963.5 0.6661
## [2,] 964.1 962.8 965.5 1.3191
## [3,] 965.5 963.7 967.4 1.8559
## 
## $prod
##       fcst lower upper    CI
## [1,] 417.4 416.2 418.7 1.277
## [2,] 418.1 416.1 420.1 1.958
## [3,] 418.8 416.4 421.3 2.457
## 
## $rw
##       fcst lower upper    CI
## [1,] 470.0 468.6 471.5 1.490
## [2,] 470.8 468.8 472.9 2.061
## [3,] 471.3 468.9 473.7 2.378
## 
## $U
##       fcst lower upper     CI
## [1,] 6.484 5.932 7.037 0.5524
## [2,] 5.831 4.922 6.740 0.9090
## [3,] 5.167 3.919 6.415 1.2480
par(mar = c(3, 3, 3, 2) + 0.1)
plot(forecast_var)

在上述代码中: * n.ahead 参数指定预测的期数。 * plot 函数用于绘制预测结果,展示预测值和置信区间。