滚动回归一期预测

时间:2016-10-14 00:06:21

标签: r

我正在尝试创建一系列一期预测。我在一组滚动的原点上训练我的模型,即,宏[1:13]预测宏[14:14]宏[1:12]预测宏[13:13]等等一直到宏[[ 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])

2 个答案:

答案 0 :(得分: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仅用于示例数据。

答案 1 :(得分:0)

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

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()可以给出看起来令人信服但远非有用的答案。