【问题标题】:How to get out-of-sample forecasts from predict function如何从预测函数中获得样本外预测
【发布时间】:2026-01-03 21:30:01
【问题描述】:

我正在使用vars 包并希望从计算模型中预测一些值:

# Get the model
x1 <- rnorm(15)
y1 <- x1 + rnorm(15)
trainFrame=data.frame(x1,y1);
model=VAR(trainFrame, p=3);
pr1=predict(model, trainFrame);
# Forecast values with new data
x2 <- rnorm(15)
y2 <- x2 + rnorm(15)
newFrame=data.frame(x2,y2);
pr2=predict(model, newFrame);

比较pr1pr2这两个预测向量表明它们是相同的。 如何获得实际的预测值,而不是再次从训练数据中获得预测?

【问题讨论】:

    标签: r prediction


    【解决方案1】:

    这里调用类属性为varest的对象的predict方法。

    预测(对象,...,n.ahead = 10,ci = 0.95,dumvar = NULL)

    n.ahead 预测是针对估计的 VAR 递归计算的。

    无需给训练Frame来预测。

      pr2=pr1=predict(model)
    

    【讨论】:

    • 这并没有回答这个问题:为什么 pr1 和 pr2 是相同的,尽管它们肯定具有由 rnorm 调用生成的不同数据库?
    • @Juergen 它们是相同的,因为我们不使用生成的数据进行预测。只有model.predict(model)
    • 如何使用生成的数据newFrame?样本内预测没有多大意义。
    • 生成新框架??如何生成?我认为您对 Var 模型有点困惑。你试图做什么是没有意义的。这里的预测是对期货价值的预测,不合适。你读过这个jstatsoft.org/v27/i04/paper吗?
    【解决方案2】:

    我有同样的问题(我想),所以我写了这个函数来计算提前 n 步预测。但它没有给出误差带或 CI。

    VAR.pred <- function(x, varest, n.ahead = 10)
    {
     k <- ncol(varest$y)
     p <- varest$p
     Atemp <- matrix(NA, k, k*p + 1)
    
     for(i in 1:k) Atemp[i, ] <- (coef(varest)[[i]])[, 1]
    
     Const <- as.matrix(Atemp[, ncol(Atemp)])
     A <- Atemp[, -ncol(Atemp)]
    
     fcast <- matrix(NA, n.ahead, k)
     spoint <- as.matrix(x[nrow(x):(nrow(x)- p + 1), ])
    
     for(l in 1:n.ahead)
     {
      ftemp <- A[, 1:k]%*%t(spoint)[, 1]
      for(j in 2:p)   ftemp <- ftemp + A[, (1 + k*(j-1)):(k*j)]%*%t(spoint)[, j]
      ftemp <- ftemp + Const
    
      fcast[l, ] <- t(ftemp) 
    
      spoint <- rbind(t(ftemp), spoint)[1:p, ]
     }
    
     fframe <- data.frame(fcast)
     names(fframe) <- dimnames(x)[[2]]
    
     return(fframe)
    }
    

    提供 pr1

    VAR.pred(x = model$y, varest = model)
    

    提供 pr2

    VAR.pred(x = newFrame, varest = model)
    

    希望我能帮上忙。

    【讨论】:

      【解决方案3】:

      它们不同的原因是 rnorm 函数生成两组不同的随机数据,即第 1 部分和第 2 部分中使用的数据根本不一样。

      查看:

      y1 <- rnorm(15)
      y1
       [1] -0.05346192  0.34168852 -0.18398645  0.84534239 -0.97027620  0.39889488
       [7] -0.44039372  0.03008880  0.47940826 -0.73258837  1.06715936 -0.93316881
      [13] -1.38306019 -0.42179145 -0.84193860
      
      y2 <- rnorm(15) 
      y2
       [1] -1.5849866  1.0203186  0.6242200 -0.5064240 -0.9497568 -0.2460866
       [7] -0.8262738  0.3100040  0.1352368  0.4030656 -0.7095272 -0.2856932
      [13] -0.9061068  1.5968001  1.0259594
      

      你会发现y1和y2不一样。

      要确保 rnorm 函数生成相同的数据集,您可以使用函数"set.seed()",它可以确保您的工作是可重现的。

      【讨论】:

        最近更新 更多