【问题标题】:Rolling regression for one period forward prediction一期前瞻预测的滚动回归
【发布时间】:2016-10-14 11:30:17
【问题描述】:

我正在尝试创建一系列单周期前瞻预测。我在一组滚动的起源上训练我的模型,即 Macro[1:13] 来预测 Macro[14:14] Macro[1:12] 来预测 Macro[13:13] 等等,直到 Macro[ 1:8]。

下面的代码让我找到了我的解决方案,但我想知道是否有更优雅的解决方案和任何其他考虑因素。谢谢!

Macro <- read.csv("C:/Macro.csv")
View(Macro)

Y <-Macro[1:13,2]
X <-Macro[1:13,3]
S1 <-Macro[1:13,4]
S2 <-Macro[1:13,5]
S3 <-Macro[1:13,6]

fit <- lm(Y ~ X + S1 + S2 + S3)

predict(fit, Macro[14:14,3:6])



Y <-Macro[1:12,2]
X <-Macro[1:12,3]
S1 <-Macro[1:12,4]
S2 <-Macro[1:12,5]
S3 <-Macro[1:12,6]

fit <- lm(Y ~ X + S1 + S2 + S3)

predict(fit, Macro[13:13,3:6])



Y <-Macro[1:11,2]
X <-Macro[1:11,3]
S1 <-Macro[1:11,4]
S2 <-Macro[1:11,5]
S3 <-Macro[1:11,6]

fit <- lm(Y ~ X + S1 + S2 + S3)

predict(fit, Macro[12:12,3:6])




Y <-Macro[1:10,2]
X <-Macro[1:10,3]
S1 <-Macro[1:10,4]
S2 <-Macro[1:10,5]
S3 <-Macro[1:10,6]

fit <- lm(Y ~ X + S1 + S2 + S3)

predict(fit, Macro[11:11,3:6])




Y <-Macro[1:9,2]
X <-Macro[1:9,3]
S1 <-Macro[1:9,4]
S2 <-Macro[1:9,5]
S3 <-Macro[1:9,6]

fit <- lm(Y ~ X + S1 + S2 + S3)

predict(fit, Macro[10:10,3:6])



Y <-Macro[1:8,2]
X <-Macro[1:8,3]
S1 <-Macro[1:8,4]
S2 <-Macro[1:8,5]
S3 <-Macro[1:8,6]

fit <- lm(Y ~ X + S1 + S2 + S3)

predict(fit, Macro[9:9,3:6])

【问题讨论】:

  • 嗨@ZJAY,请问您为什么要进行这样的预测过程?
  • 因为我正在处理非常少量的数据,并且预测未来一个时期是我验证模型的方法。有什么可以预见的问题吗?谢谢。
  • 好的,我只是想知道它是否确实用于交叉验证。在这种情况下,caret 是正确的工具。
  • 同意:@agenis 值得在这里打上绿勾。

标签: r


【解决方案1】:

您可以使用库caret,它能够训练多个带有滚动窗口的时间序列模型(带有选项timeslice)。据我了解,您希望有一个在每次 +1 时扩展的训练窗口并仅预测下一次观察(请参阅控制参数,有关其他选项的说明,请参阅this image)。因此,您只需在此处替换为 data.Frame 的名称和公式中的变量:

library(caret)
library(ggplot2)
mycontrol <- trainControl(method = "timeslice",
                              initialWindow = 8,
                              horizon = 1,
                              fixedWindow = FALSE, 
                          savePredictions = TRUE)
myfit <- train(unemploy ~ pce + pop + psavert,
                    data = head(economics, 15),
                    method = "lm",
                    trControl = mycontrol)
print(myfit$pred)
####       pred  obs rowIndex parameter  Resample
#### 1 2783.092 2877        9      none Training1
#### 2 2943.586 2709       10      none Training2
#### 3 2771.019 2740       11      none Training3
#### 4 2722.083 2938       12      none Training4
#### 5 2820.074 2883       13      none Training5
#### ...

您可以通过myfit$pred$pred 访问预测。除此之外,它还会为您提供有关每个预测质量等的详细信息。ggplot2 库仅用于示例数据。

【讨论】:

    【解决方案2】:

    更紧凑的方式(经过编辑以修复语法错误)。

    myfun <- function(model_len, dat, ...){
      dat <- data.frame(dat)
      names(dat) <- c("foo", "Y", "X", "S1", "S2", "S3")
    
      fit <- lm(Y ~ X + S1 + S2 + S3, data=dat[(1:model_len),])
      predict(fit, dat[(model_len + 1),])
    }
    
    sapply(8:13,  myfun, dat=Macro)
    

    其他注意事项

    如果这是时间序列数据,线性回归可能不是建模的最佳选择。如果残差不是高斯或不独立(不是自相关),那么lm() 可以给出看起来令人信服但远非有用的答案。

    【讨论】:

    • 这是时间序列数据。您建议改用什么?谢谢。
    • 参见上面@agenis 的回答,并在此处查看模型选择。 topepo.github.io/caret/bytag.html
    • 谢谢-我在下面使用了您的以下代码并得到了“错误的维数错误”宏
    • 编辑了以上内容。至于哪种模式可能更合适:这真的取决于正确的重要性。时间序列是一个大课题;太大了,我无法在这个空间发表评论,尤其是在没有数据的情况下。
    猜你喜欢
    • 2019-07-28
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 2019-02-08
    • 2020-10-12
    • 2018-10-09
    • 2019-01-08
    相关资源
    最近更新 更多