R - 用一个滞后项预测简单的dyn模型

时间:2012-06-26 21:01:54

标签: r dynamic regression forecasting

我正在尝试用R中的dyn库预测一个简单的滞后时间序列回归。This question是一个有用的起点,但我得到一些奇怪的行为,我希望有人可以解释。

这是一个最低限度的工作示例。

library(dyn)

# Initial data
y.orig <- arima.sim(model=list(ar=c(.9)),n=10)
x1.orig <- rnorm(10)
data <- cbind(y=y.orig, x1=x1.orig)

# This model, with a single lag term, predicts from t=2
mod1 <- dyn$lm(y ~ lag(y, -1), data)
y.new <- window(y.orig, end=end(y.orig) + c(5,0), extend=TRUE)
newdata1 <- cbind(y=y.new)
predict(mod1, newdata1)

# This one, with a lag plus another predictor, predicts from t=1 on
mod2 <- dyn$lm(y ~ lag(y, -1) + x1, data)
y.new <- window(y.orig, end=end(y.orig) + c(5,0), extend=TRUE)
x1.new <- c(x1.orig, rnorm(5))
newdata2 <- cbind(y=y.new, x1=x1.new)
predict(mod2, newdata2)

为什么两者之间存在差异?任何人都可以建议如何使用dyn预测我的'mod1'?提前谢谢。

1 个答案:

答案 0 :(得分:1)

mod1mod2开始预测t=2mod2的预测向量从t=1开始,但是NA。关于为什么一个从2开始而另一个从1开始注意predict将公式右边的变量合并在一起,而在mod1的情况下,我们看到lag(y, -1)从t = 2,因为y从t = 1开始。另一方面,当mod2合并lag(y, -1)x1时,我们会得到一个从t = 1开始的系列(因为x1从t = 1开始) 。试试这个不涉及dyn:

> start(with(as.list(newdata1), merge.zoo(lag(y, -1))))
[1] 2
> start(with(as.list(newdata2), merge.zoo(lag(y, -1), x1)))
[1] 1

如果我们想让predict(mod1, newdata1)从t = 1开始,我们可以添加我们自己的Intercept列并删除默认拦截以避免重复。这将迫使它从1开始,因为现在RHS有一系列从1开始:

data.b <- cbind(y=y.orig, x1=x1.orig, Intercept = 1)
mod.b <- dyn$lm(y ~ Intercept + lag(y, -1) - 1, data.b)

newdata.b <- cbind(Intercept = 1, y = y.new)
predict(mod.b, newdata.b)

关于第二个问题,如果您想预测mod1,请使用fitted(mod1)

似乎有潜在的第三个问题,关于它基本上是如何工作的,所以也许这澄清了它。所有dyn都是在公式中对齐时间序列,然后lmpredict可以照常运行。例如,如果我们使用dyn$model.frame创建对齐的模型框架,那么其他所有内容都可以使用普通lm完成,普通predictdyn从那时起就不会涉及。 mod1a下方的mod1类似于lm,但它在对齐的模型框架上运行普通mod1a。如果您了解lm predict及其mod1,则predict## mod1 and mod1a are similar # from code in the question mod1 <- dyn$lm(y ~ lag(y, -1), data = data) mod1 # redo it using a plain lm by applying dyn to model.frame mf <- dyn$model.frame(y ~ lag(y, -1), data = data) mod1a <- lm(y ~ `lag(y, -1)`, mf) mod1a ## the two predicts below are similar # the 1 ensures its an mts rather than ts but is otherwise not used newdata1 <- cbind(y=y.new, 1) predict(mod1, newdata1) newdata1a <- cbind(1, `lag(y, -1)` = lag(y.new, -1)) predict(mod1a, newdata1a) 相似。

{{1}}