我正在尝试用R. This question中的dyn库来预测一个简单的滞后时间序列回归,这是一个有用的起点,但我得到了一些奇怪的行为,我希望有人能解释。
这是一个最小的工作示例。
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'‘?提前谢谢。
发布于 2012-06-27 08:05:28
mod1和mod2都在t=2开始预测。mod2的预测向量从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列,并删除默认的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所做的就是在公式中对齐时间序列,然后lm和predict就可以像往常一样运行了。例如,如果我们使用dyn$model.frame创建一个对齐的模型框架,那么其他所有事情都可以使用普通的lm和普通的predict来完成,从那时起就不涉及dyn了。下面的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)https://stackoverflow.com/questions/11215868
复制相似问题