1

我正在尝试使用 R 中的 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”?提前致谢。

4

1 回答 1

1

两者都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 列并删除默认截距以避免重复。这将迫使它从 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 lmand 它的predictthenmod1predict是相似的。

## 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)
于 2012-06-27T00:05:28.447 回答