2012-08-09 100 views
3

是否有一個實用程序來運行使用下述類型的XTS對象迴歸:迴歸與R中XTS

lm(y ~ lab(x, 1) + lag(x, 2) + lag(x,3), data=as.data.frame(coredata(my_xts))) 

其中my_xtsxts對象包含一個xy。問題的關鍵是有沒有一種方法可以避免做一堆滯後,併合併到data.frame所有的滯後?我認爲包dyn適用於zoo對象,所以我期望它能以與xts相同的方式工作,但可能會更新某些內容。

回答

6

的DYN和dynlm包可以做到這一點與動物園的對象。在dyn的情況下,只寫dyn$lm而不是lm,並將它傳遞給動物園對象而不是數據框。

請注意,xts中的滯後與通常的R約定相反,所以如果x是xts類,那麼如果x是動物園或ts類,則lag(x,1)與lag(x,-1)相同。

> library(xts) 
> library(dyn) 
> x <- xts(anscombe[c("y1", "x1")], as.Date(1:11)) # test data 
> dyn$lm(y1 ~ lag(x1, -(1:3)), as.zoo(x)) 

Call: 
lm(formula = dyn(y1 ~ lag(x1, -(1:3))), data = as.zoo(x)) 

Coefficients: 
    (Intercept) lag(x1, -(1:3))1 lag(x1, -(1:3))2 lag(x1, -(1:3))3 
     3.80530   0.04995   -0.12042   0.46631 
2

由於您已經從xts環境中刪除數據,因此我沒有在這裏使用任何xts功能。有一個embed函數將構造一個「滯後」矩陣到任何期望的程度。 (我永遠無法理解的時間序列lag功能。)(嵌入滯後變量的順序是從我本來期望相反。)

embed(1:6, 3) 
#-------- 
    [,1] [,2] [,3] 
[1,] 3 2 1 
[2,] 4 3 2 
[3,] 5 4 3 
[4,] 6 5 4 
#Worked example ... need to shorten the y variable 
y <- rnorm(20) 
x <- rnorm(20) 
lm(tail(y, 18) ~ embed(x, 3)) 
#------------------- 
Call: 
lm(formula = tail(y, 18) ~ embed(x, 3)) 

Coefficients: 
(Intercept) embed(x, 3)1 embed(x, 3)2 embed(x, 3)3 
    -0.12452  -0.34919  0.01571  0.01715 

這是需要注意的是改變滯後於後一種解脫匹配@GGrothendieck使用那些我們得到相同的結果:

lm(tail(xx[,"y1"], NROW(xx)-3) ~ embed(xx[,"x1"], 4)[,2:4]) 

Call: 
lm(formula = tail(xx[, "y1"], NROW(xx) - 3) ~ embed(xx[, "x1"], 
    4)[, 2:4]) 

Coefficients: 
       (Intercept) embed(xx[, "x1"], 4)[, 2:4]1 embed(xx[, "x1"], 4)[, 2:4]2 
        3.80530      0.04995      -0.12042 
embed(xx[, "x1"], 4)[, 2:4]3 
        0.46631