R中的xts回归

时间:2012-08-09 22:51:04

标签: r time-series xts zoo lm

是否有使用以下类型的xts对象运行回归的实用程序:

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

其中my_xts是包含xtsx的{​​{1}}对象。问题的关键是有没有办法避免做一堆滞后并合并以使y具有所有滞后?我认为包data.frame适用于dyn个对象,所以我希望它与zoo的工作方式相同,但可能会有更新的内容。

2 个答案:

答案 0 :(得分:6)

dyn和dynlm包可以用动物园对象做到这一点。在dyn的情况下,只需编写dyn$lm而不是lm并将其传递给动物园对象而不是数据框。

请注意,xts中的滞后与通常的R约定相反,因此如果x是xts类,则如果x是zoo或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  

答案 1 :(得分: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