2009-08-21 7 views
11

Что наиболее эффективный способ сделать матрицу отставали переменных в R для произвольной переменной (т.е. не регулярное временных рядов)Отстающие Переменные в R

Например:

Входной :

x <- c(1,2,3,4) 

2 лаг, выход:

[1,NA, NA] 
[2, 1, NA] 
[3, 2, 1] 
[4, 3, 2] 

ответ

21

Вы можете достичь этого, используя встроенный в embed() функции, где его второе «измерение» аргумент эквивалентно тому, что вы «ве называется 'лаг':

x <- c(NA,NA,1,2,3,4) 
embed(x,3) 

## returns 
    [,1] [,2] [,3] 
[1,] 1 NA NA 
[2,] 2 1 NA 
[3,] 3 2 1 
[4,] 4 3 2 

embed() обсуждался в previous answer Джошуа рейха. (Обратите внимание, что я добавил x с NA, чтобы воспроизвести желаемый результат).

Это не особенно хорошо названный, но он весьма полезен и эффективен для операций с раздвижными окнами, такими как скользящие суммы и скользящие средние.

+2

В более общем смысле: lagmatrix <- function (x, max.lag) {embed (c (rep (NA, max.lag), x), max.lag + 1)} Затем используйте lagmatrix (1: 4,2) –

+0

Спасибо за указатель на функцию embed. Это сэкономило массу времени для меня. –

8

Используйте подходящий class для своих объектов; база R имеет ts, которая имеет функцию lag() для работы. Обратите внимание, что эти объекты ts произошли от времени, когда «дельта» или «частота», где постоянны: ежемесячные или квартальные данные, как в макроэкономических рядах.

Для нерегулярных данных, таких как (business-) ежедневно, используйте пакеты zoo или xts, которые также могут обрабатывать (очень хорошо!) С лагами. Чтобы идти дальше оттуда, вы можете использовать пакеты, такие как dynlm или dlm, для моделей с динамической регрессией с лагами.

В представлении задач временного ряда, эконометрики, финансов есть дополнительные указатели.

2

running функция в gtools пакета делает более или менее то, что вы хотите:

> require("gtools") 
> running(1:4, fun=I, width=3, allow.fewer=TRUE) 

$`1:1` 
[1] 1 

$`1:2` 
[1] 1 2 

$`1:3` 
[1] 1 2 3 

$`2:4` 
[1] 2 3 4 
+0

Но Джеймс хотел матрицу не список. Вы можете упаковать результат с помощью матрицы (unlist (...)), но функция embed() делает это за один шаг. –

+0

Совершенно верно, поэтому я поддержал решение embed(), когда оно получилось =). Но «работа» по-прежнему является полезной функцией, я думаю - большую часть времени, когда я хотел создать матрицу, которую Джеймс попросил, я действительно хотел сделать, это было выполнено. –

1

Метод, который наилучшим образом подходит для меня - использовать функцию lag из пакета dplyr.

Пример:

> require(dplyr) 
> lag(1:10, 1) 
[1] NA 1 2 3 4 5 6 7 8 9 
> lag(1:10, 2) 
[1] NA NA 1 2 3 4 5 6 7 8