2012-06-26 31 views
1

我試圖預測一個簡單的滯後時間序列迴歸與R. This question的DYN庫是一個有益的起點,但我發現了一些奇怪的行爲,我」希望有人能解釋。的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''嗎?提前致謝。

回答

1

mod1mod2開始預測在t=2mod2的預測向量從t=1開始,但其NA。關於爲什麼一個在1注意,predict合併在一起上式的右手側和在mod1的情況下,我們看到變量開始於2,而另一個該lag(y, -1)開始在t = 2,因爲y開始在t = 1。在的mod2的情況下,另一方面,當我們合併lag(y, -1)x1我們得到了一系列開始在t = 1(因爲在t = 1 x1開始)。試試這個不涉及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,我們可以添加我們自己截獲列,並刪除默認攔截,以避免重複。這將迫使它因爲現在RHS有一系列從1開始從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。如果您瞭解mod1alm及其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) 
+0

感謝您的意見。然而,這並沒有真正回答我的問題:爲什麼上面的mod1預測時間序列start = 2,mod2預測start = 1的時間序列呢? – jkeirstead

+0

我在第一段中添加了一些細節。 –

+0

好吧,現在開始有意義了。因爲我需要兩個模型都有一個start = 1,所以我想我必須拿出一些方法來移動窗口。如果有一個簡單的方法可以做到這一點(例如預測選項),那將是非常好的,所以我會留下這個問題,看看是否有任何想法存在。 – jkeirstead