0

我目前正在尝试使用 R 包 tsDyn 中的 predict_rolling 进行滚动预测。

具体来说,例如,我想做一个提前两步的滚动预测,并希望在每一步都重新估计 VAR。我已经有一个功能代码,它为我做,但我想避免 for 循环。

当我尝试使用 n.ahead = 1 的 predict_rolling 复制代码时,我得到了正确的结果,但是它们在 n.ahead > 1 时有所不同。我不太确定当我增加视野时该函数在做什么。有人能帮我吗?

非常感谢!

library(tsDyn)
library(vars)

data <- structure(list(beta_1 = c(6.35815059908977, 6.26392397241388, 
                          5.75584304551968, 5.79468441571414, 5.79866753735267, 5.93702141823254, 
                          5.9802644025435, 5.86669864820461, 6.34140417225121, 6.22403010817456, 
                          6.04156005554047, 5.99436622944328, 6.21876461132087, 6.12521892832898, 
                          6.28785501504558, 6.58416859326718, 6.60860111153987, 6.56413440110398, 
                          6.48242438403672, 6.37777673701131, 6.66598764007499, 6.40439103841177, 
                          6.68523656665178, 6.84779996196864, 6.65828185836342, 6.59294917836496, 
                          6.58247770373732, 6.58151962670905, 6.54178934287671, 6.63472984194905
), beta_2 = c(-0.693981338882855, -0.490176628667609, 0.273659053491197, 
              0.239555376236275, 0.207269178550827, 0.251612610758922, 0.407559789903953, 
              0.569886012132651, 0.203137745309771, 0.409355931195391, 0.52231134837746, 
              0.0989628040415202, -1.12460228733712, -1.1741087534917, -1.89827153876211, 
              -2.60891196464883, -3.07816904157986, -3.02987212289999, -3.02564037697751, 
              -3.05186295573602, -4.31703470296141, -4.46324605358408, -5.23741582126552, 
              -5.53763792734524, -5.21652056632509, -5.18677802920265, -5.14017527231271, 
              -5.1638258167503, -5.15084057539836, -5.26464530948111), beta_3 = c(2.07909176259473, 
                                                                                  1.76313003375624, 1.53657531433667, 2.14690291607906, 2.40466018945562, 
                                                                                  0.654662517991894, 0.0325387409714942, -0.53746641768277, -2.10960016880694, 
                                                                                  -2.1786830671857, -2.8803651841676, -3.45821461372104, -3.09352055010635, 
                                                                                  -3.38860120189217, -3.24589594863622, -2.24785473097812, -1.52644445065669, 
                                                                                  -1.35977678028773, -2.6903096555247, -2.80397737054071, -3.75658639513462, 
                                                                                  -3.89616413931621, -1.87965311921739, -0.955127483103369, -0.754754537400041, 
                                                                                  -1.06798338362736, 1.25463230677968, -0.289233763457811, -0.585463719717287, 
                                                                                  -1.73110982341087)), row.names = c(NA, 30L), class = "data.frame")
  
# 1- step ahead forecast:

horizon <- 1
  
# Old code I want to get rid of:
fore_factors <- matrix(NA, 20, 3)
  for(j in 1 : 20)
  {
    # 1. Data preparation
    fit_factors <- data[1 : (9 + j), ]
    # 2. State equation
    #   2.1 Estimation
    fitting <- VAR(fit_factors, p = 1, type = "const")
    #   2.2 Factor Forecasting
    x_t1_mu <- as.numeric(fit_factors[nrow(fit_factors), ])
    pred <- predict(fitting, n.ahead = horizon, newdata = x_t1_mu)
    fore_factors[j,] <- c(pred$fcst$beta_1[horizon], pred$fcst$beta_2[horizon], pred$fcst$beta_3[horizon])
  }

# New code:
  
  fit_var <- lineVar(data, lag = 1, include = "const", model = "VAR")
  predicted_values <- predict_rolling(fit_var, nroll = 20, refit = 1, n.ahead = horizon) $ pred

# Compare:
predicted_values
  fore_factors

  
  # 2 horizon forecasting:
  
  horizon <- 2
  
  # Old code I want to get rid of:
  fore_factors <- matrix(NA, 20, 3)
  for(j in 1 : 20)
  {
    # 1. Data preparation
    fit_factors <- data[1 : (9 + j), ]
    # 2. State equation
    #   2.1 Estimation
    fitting <- VAR(fit_factors, p = 1, type = "const")
    #   2.2 Factor Forecasting
    x_t1_mu <- as.numeric(fit_factors[nrow(fit_factors), ])
    pred <- predict(fitting, n.ahead = horizon, newdata = x_t1_mu)
    fore_factors[j,] <- c(pred$fcst$beta_1[horizon], pred$fcst$beta_2[horizon], pred$fcst$beta_3[horizon])
  }
  
  # New code:
  
  fit_var <- lineVar(data, lag = 1, include = "const", model = "VAR")
  predicted_values <- predict_rolling(fit_var, nroll = 20, refit = 1, n.ahead = horizon) $ pred

# Compare:
predicted_values
 fore_factors
4

0 回答 0