2009-08-21 17 views
11

Qual è il modo più efficiente per una matrice di variabili ritardate in R per una variabile arbitraria (cioè non una serie regolare di tempo)variabili in ritardo di R

Ad esempio:

ingresso :

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

2 ritardi, uscita:

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

risposta

21

È possibile ottenere questo utilizzando il built-in embed() funzione, dove il suo secondo argomento 'dimensione' è equivalente a quello che si 'Ho chiamato '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() è stato discusso in un previous answer da Joshua Reich. (Si noti che ho anteposto x con NA per replicare l'output desiderato).

Non è particolarmente indicato ma è piuttosto utile e potente per operazioni che coinvolgono finestre scorrevoli, come somme di rotolamento e medie mobili.

+2

Più in generale: lagmatrix <- function (x, max.lag) {embed (c (rep (NA, max.lag), x), max.lag + 1)} Quindi utilizzare lagmatrix (1: 4,2) –

+0

Grazie per il puntatore alla funzione di incorporamento. Ciò mi ha permesso di risparmiare una grande quantità di tempo di calcolo. –

8

Utilizzare l'appropriato class per gli oggetti; base R ha ts che ha una funzione lag() su cui operare. Si noti che questi oggetti ts provenivano da un momento in cui "delta" o "frequenza" erano costanti: dati mensili o trimestrali come in serie macroeconomiche.

Per dati irregolari quali (business-) ogni giorno, utilizzare i pacchetti zoo o xts che possono anche gestire (molto bene!) Con ritardi. Per andare oltre, è possibile utilizzare pacchetti come dynlm o dlm consentire modelli di regressione dinamica con ritardi.

Le visualizzazioni di attività su serie storiche, econometria, finanza hanno tutte ulteriori indicazioni.

2

La funzione running nel pacchetto gtools fa più o meno quello che si vuole:

> 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

Ma James voleva un non a matrice una lista. Puoi impacchettare il risultato usando matrix (unlist (...)) ma la funzione embed() lo fa in un solo passaggio. –

+0

Completamente a destra, ecco perché ho eseguito l'upgrade della soluzione embed() quando è uscito =). Ma 'correre' è ancora una funzione utile, credo --- la maggior parte delle volte in cui volevo creare la matrice richiesta da James, quello che volevo veramente fare era correre su di esso. –

1

Il metodo che funziona meglio per me consiste nell'utilizzare la funzione lag dal pacchetto dplyr.

Esempio:

> 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