2009-08-21 16 views
11

¿Cuál es la forma más eficiente para hacer una matriz de variables retardadas en R para una variable arbitraria (es decir, no una serie de tiempo regular)Variables el revestimiento en R

Por ejemplo:

entrada :

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

2 retardos, salida de:

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

Respuesta

21

se puede lograr esto mediante la incorporada en embed() función, donde su segundo argumento 'dimensión' es equivalente a lo que 'he llamado 'lag':

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() se discutió en una previous answer por Joshua Reich. (Tenga en cuenta que preparé x con NA para replicar el resultado deseado).

No tiene un nombre muy particular, pero es bastante útil y poderoso para operaciones que involucran ventanas deslizantes, como sumas móviles y promedios móviles.

+2

Más en general: lagmatrix <- function (x, max.lag) {embed (c (rep (NA, max.lag), x), max.lag + 1)} Luego use lagmatrix (1: 4,2) –

+0

Gracias por el puntero a la función de inserción. Esto me ahorró una gran cantidad de tiempo de computación. –

8

Utilice un class adecuado para sus objetos; la base R tiene ts que tiene una función lag() para operar. Tenga en cuenta que estos objetos ts provienen de un momento en que 'delta' o 'frequency' son constantes: datos mensuales o trimestrales como en las series macroeconómicas.

Para datos irregulares, tales como (de negocios) a diario, utilice los paquetes zoo o xts que también pueden tratar (¡muy bien!) Con retrasos. Para ir más lejos a partir de ahí, puede usar paquetes como dynlm o dlm para permitir modelos de regresión dinámica con retardos.

Las vistas de tareas en series de tiempo, econometría, finanzas tienen otras indicaciones.

2

La función running en el paquete gtools hace más o menos lo que quiere:

> 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

Pero James no quería una matriz de una lista. Puede empaquetar el resultado usando la matriz (unlist (...)) pero la función embed() lo hace en un solo paso. –

+0

Totalmente correcto, por lo que cambié la solución embed() cuando salió =). Pero 'correr' sigue siendo una función útil, creo, la mayoría de las veces cuando quería crear la matriz que James me pidió, lo que realmente quería hacer era ejecutar la aplicación. –

1

El método que mejor funciona para mí es utilizar la función lag del paquete dplyr.

Ejemplo:

> 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 
Cuestiones relacionadas