【问题标题】:R - predicting simple dyn model with one lag termR - 用一个滞后项预测简单的 dyn 模型
【发布时间】:2012-06-26 21:01:54
【问题描述】:

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

【问题讨论】:

    标签: r dynamic regression forecasting


    【解决方案1】:

    mod1mod2 都从 t=2 开始预测。 mod2 的预测向量从 t=1 开始,但它的 NA。关于为什么一个从 2 开始,另一个从 1 开始,请注意 predict 将公式右侧的变量合并在一起,在 mod1 的情况下,我们看到 lag(y, -1) 从 t=2 开始,因为 @987654330 @ 从 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 和普通的predict 来完成,而dyn 从那时起不再涉及。下面的mod1a 类似于问题中的mod1,除了它在对齐的模型框架上运行一个普通的lm。如果您了解mod1a lm 和它的predict 那么mod1predict 是相似的。

    ## 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)
    

    【讨论】:

    • 感谢 cmets。然而,这并不能真正回答我的问题:为什么上面的 mod1 预测 start = 2 的时间序列,而 mod2 预测 start = 1 的时间序列?
    • 我在第一段中添加了一些细节。
    • 好的,现在开始有意义了。由于我需要两个模型都有一个 start = 1,我想我必须想出一些技巧来将窗口移回。如果有一种简单的方法可以做到这一点(例如预测的选项),那就太好了,所以我将把这个问题留待一会儿,看看是否有任何想法浮出水面。
    • 添加了说明如何强制 predict(mod1, newdata1) 从 1 开始的代码。
    • 感谢 G。非常有帮助,与我的其他功能配合得很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-22
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    相关资源
    最近更新 更多