2009-08-21 16 views
11

Quel est le moyen le plus efficace de faire une matrice de variables retardées dans R pour une variable arbitraire (non une série de temps réglementaire)variables en retard dans la R

Par exemple:

Entrée :

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

2 décalages, sortie:

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

Répondre

21

Vous pouvez y parvenir en utilisant la embed() fonction intégrée, où son deuxième argument de la « dimension » est équivalent à ce que vous « ai appelé '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() a été discuté dans un previous answer par Joshua Reich. (Notez que j'ai préfixé x avec NA pour répliquer la sortie désirée).

Ce n'est pas particulièrement bien nommé, mais il est très utile et puissant pour les opérations impliquant des fenêtres glissantes, telles que les sommes roulantes et les moyennes mobiles.

+2

Plus généralement: lagmatrix <- function (x, max.lag) {embed (c (rép (NA, max.lag), x), max.lag + 1)} Ensuite, utilisez lagmatrix (1: 4,2 –

+0

Merci pour le pointeur sur la fonction d'intégration. Cela m'a permis d'économiser énormément de temps de calcul. –

8

Utilisez un bon class pour vos objets; base R a ts qui a une fonction lag() pour fonctionner dessus. Notez que ces objets ts provenaient d'une période où «delta» ou «fréquence» était constant: données mensuelles ou trimestrielles comme dans les séries macroéconomiques.

Pour les données irrégulières telles que (business-) daily, utilisez les packages zoo ou xts qui peuvent également gérer (très bien!) Les retards. Pour aller plus loin, vous pouvez utiliser des packages comme dynlm ou dlm pour autoriser les modèles de régression dynamique avec des retards.

Les vues de tâches sur les séries temporelles, l'économétrie et la finance ont toutes d'autres indicateurs.

2

La fonction running dans le paquet gtools ne plus ou moins ce que vous voulez:

> 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

Mais James voulait une matrice pas une liste. Vous pouvez empaqueter le résultat en utilisant matrix (unlist (...)) mais la fonction embed() le fait en une seule étape. –

+0

Tout à fait raison, c'est pourquoi j'ai upvoted la solution embed() quand elle est sortie =). Mais «courir» est toujours une fonction utile, je pense --- la plupart du temps quand je voulais créer la matrice que James a demandé, ce que je voulais vraiment faire, c'était courir appliquer dessus. –

1

La méthode qui fonctionne le mieux pour moi consiste à utiliser la fonction lag du package dplyr.

Exemple:

> 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