我正在尝试创建一系列一期预测。我在一组滚动的原点上训练我的模型,即,宏[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])
答案 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()
可以给出看起来令人信服但远非有用的答案。