Регрессии с XTS в R
Есть ли утилита для запуска регрессий с использованием объектов xts следующего типа:
lm(y ~ lab(x, 1) + lag(x, 2) + lag(x,3), data=as.data.frame(coredata(my_xts)))
где my_xts
является xts
объект, который содержит x
и y
, Суть вопроса в том, есть ли способ избежать множества лагов и слияний, чтобы получить data.frame
со всеми лагами? Я думаю, что пакет dyn
работает на zoo
объекты, поэтому я ожидал бы, что он будет работать так же, как xts
но хотя может быть что-то обновлено.
2 ответа
Пакеты dyn и dynlm могут делать это с объектами zoo. В случае дина просто напиши dyn$lm
вместо lm
и передать его объект зоопарка вместо фрейма данных.
Обратите внимание, что lag в xts работает противоположно обычному соглашению R, поэтому, если x относится к классу xts, то lag(x, 1) совпадает с lag(x, -1), если x относится к классу zoo или ts.
> 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
Поскольку вы уже удаляете данные из среды 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