Domanda:
In ritardo su una serie temporale raggruppata
Aren Cambre
2012-04-05 07:35:10 UTC
view on stackexchange narkive permalink

Ho alcune decine di migliaia di osservazioni che si trovano in una serie temporale ma raggruppate per località. Ad esempio:

  posizione data osservazione A osservazione B --------------------------------- ------ A 1-2010 22 12 A 2-2010 26 15 A 3-2010 45 16 A 4-2010 46 27 B 1-2010 167 48 B 2-2010 134 56 B 3-2010 201 53 B 4 -2010 207 42  

Voglio vedere se la osservazioneA del mese x ha una relazione lineare con il mese x + 1's observationB.

Ho fatto qualche ricerca e ho trovato una funzione zoo , ma non sembra avere un modo per limitare il ritardo per gruppo. Quindi, se usassi zoo e avessi ritardato osservazioneB di 1 riga, finirei con l'ultima osservazioneB della posizione A come prima osservazioneB della posizione B. Preferisco che la prima osservazioneB di qualsiasi posizione sia NA o un altro valore ovvio per indicare "non toccare questa riga".

Immagino che quello che voglio dire è se esiste un modo integrato per farlo in R? In caso contrario, immagino di poterlo fare con un costrutto di loop standard. O devo anche manipolare i dati?

Sette risposte:
mpiktas
2012-04-05 08:18:34 UTC
view on stackexchange narkive permalink

Esistono diversi modi per ottenere una variabile ritardata all'interno di un gruppo. Prima di tutto dovresti ordinare i dati, in modo che in ogni gruppo l'ora sia ordinata di conseguenza.

Per prima cosa creiamo un esempio data.frame:

  > set.seed (13) > dt <- data.frame (location = rep (letters [1: 2], each = 4), time = rep (1: 4, 2), var = rnorm (8)) > dt location time var1 a 1 0.55432692 a 2 -0.28027193 a 3 1.77516344 a 4 0.18732015 b 1 1.14252616 b 2 0.41552617 b 3 1.22950668 b 4 0.2366797  

Definisci la nostra funzione di ritardo:

  lg <- funzione (x) c (NA, x [1: (length ( x) -1)])  
  1. Quindi il ritardo della variabile all'interno del gruppo può essere calcolato utilizzando tapply :

      > unlist (tapply (dt $ var, dt $ location, lg)) a1 a2 a3 a4 b1 b2 b3 b4 NA 0.5543269 -0.2802719 1.7751634 NA 1.1425261 0.4155261 1.2295066  
  2. Utilizzo di ddply dal pacchetto plyr”:

      > ddply (dt, ~ location, transform, lvar = lg (var)) location time var lvar1 a 1 -0.1307015 NA2 a 2 -0.6365957 -0.13070153 a 3-0.6417577 -0.63659574 a 4 -1.5191950 -0.6417163875 b 1 -1.628 NA6 b 2 0.8748671 -1.62816387 b 3 -1.3343222 0.87486718 b 4 1.5431753 -1.3343222 
  3. Versione più rapida utilizzando data.table dal pacchetto data.table

      > ddt <- data.table (dt) > ddt [, lvar: = lg (var), by = c ("location")] posizione ora var lvar [1,] a 1 -0.1307015 NA [2,] a 2 -0.6365957 -0.1307015 [3,] a 3 -0.6417577 -0.6365957 [4,] a 4 -1.5191950 -0.6417577
    [5,] b 1 -1.6281638 NA [6,] b 2 0.8748671 -1.6281638 [7,] b 3 -1.3343222 0.8748671 [8,] b 4 1.5431753 -1.3343222  
  4. Utilizzo della funzione lag dal pacchetto plm”

      > pdt <- pdata.frame (dt) > lag (pdt $ var ) a-1 a-2 a-3 a-4 b-1 b-2 b-3 b-4 NA 0.5543269 -0.2802719 1.7751634 NA 1.1425261 0.4155261 1.2295066  
  5. Utilizzo della funzione lag dal pacchetto dplyr”

      > dt% >% group_by (location)% >% mutate (lvar = lag ( var)) Fonte: frame di dati locali [8 x 4] Gruppi: ora posizione posizione var lvar1 a 1 0,5543269 NA2 a 2 -0,2802719 0,55432693 a 3 1,7751634 -0,28027194 a 4 0,1873201 1,77516345 b 1 1,1425261 NA6 b 2 0.4155261 1.14252617 b 3 1.2295066 0.41552618 b 4 0.2366797 1.2295066  

Gli ultimi due approcci richiedono la conversione da data.frame a un altro oggetto, anche se poi non devi preoccuparti dell'ordinamento. La mia preferenza personale è l'ultima, che inizialmente non era disponibile durante la scrittura della risposta.

Aggiornamento: modificato il codice data.table per riflettere gli sviluppi del pacchetto data.table , segnalato da @Hibernating.

Aggiornamento 2: aggiunto l'esempio di dplyr .

Ottima spiegazione!Esiste un pacchetto / funzione in grado di gestire serie temporali (pannelli) raggruppati a spaziatura irregolare e pannelli non bilanciati?
Tutti gli esempi di codice funzionerebbero per pannelli non bilanciati.Per le serie temporali spaziate in modo irregolare, il concetto di ritardo è un po 'complicato, poiché potrebbe non esistere per tutti i gruppi.
Puoi chiedere informazioni sui ritardi per le serie temporali irregolari in stackoverflow.Questi tipi di domande sono ora fuori tema in stats.SE.
Hibernating
2013-12-16 16:58:06 UTC
view on stackexchange narkive permalink

@ mpiktas Giusto per menzionare brevemente due piccole sviste nella versione 3 della tua risposta. In primo luogo, la frase "versione più rapida" è stata chiaramente lasciata per errore. In secondo luogo, la parola ": =" è stata persa nel codice. La correzione del secondo risolve il primo: =)

  library (data.table); ddt <- data.table (dt) f0<-function () plyr :: ddply (dt, ~ location, transform, lvar = lg (var)) f1<-function () ddt [, transform (.SD, lvar = lg (var)), by = c ("location")] f2<-function () ddt [, lvar: = lg (var), by = location] r0<-f0 (); r1<-f1 (); r2<-f2 (); all.equal (r0, r1, r2, check.attributes = FALSE) boxplot (microbenchmark :: microbenchmark ( f0 (), f1 (), f2 (), times = 1000L))  

enter image description here

Anirban Sengupta
2014-06-28 02:18:37 UTC
view on stackexchange narkive permalink

Anziché eseguire tutti i passaggi tapply e aggiuntivi, ecco un modo più veloce:

  dt<-data.frame (location = rep (letters [1: 2], ciascuno = 4), time = rep (1: 4,2), var = rnorm (8)) lg<-function (x) c (NA, x [1: (length (x) -1)]) dt $ lg <- ave (dt $ var, dt $ location, FUN = lg)  
Matthew
2014-09-01 20:29:15 UTC
view on stackexchange narkive permalink

Con dplyr

  dt% >% group_by (location)% >% mutate (lvar = lag (var))  
Wayne
2015-02-25 22:39:58 UTC
view on stackexchange narkive permalink

Potresti voler esaminare il pacchetto vars . Sembra che un Vector Autoregression (VAR) sia ciò che potresti provare a fare.

kitsune
2016-04-27 00:58:17 UTC
view on stackexchange narkive permalink

Con DataCombine:

  slide (DataCombine) libreria (df, Var = "ObservationB", TimeVar = "date", GroupVar = "location", NewVar = "lead.observationB", slideBy = 1, keepInvalid = FALSE, reminder = FALSE)  

Anche i dati devono essere ordinati. Utilizza slideBy = -1 invece per i ritardi.

Sebastian
2020-09-02 02:39:36 UTC
view on stackexchange narkive permalink

Solo per fornire un breve aggiornamento: il nuovo modo più veloce per farlo in R è con la funzione flag / L nel pacchetto di compressione. collapse supporta anche sequenze di ritardi / lead su vettori, matrici e frame di dati.

  libreria (comprimi)
dt <- data.frame (location = rep (letters [1: 2], each = 4), time = rep (1: 4, 2), var = rnorm (8))
# Il modo più veloce per aggiungere data.frame con una variabile ritardata
settransform (dt, lvar = flag (var, 1, location, time))
dt
posizione ora var lvar
1 a 1 -0.5808824 NA
2 a 2 -0.1606213 -0.5808824
3 a 3 0.6499493 -0.1606213
4 a 4 -0.2126608 0.6499493
5 b 1 -0.5082747 NA
6 b 2 -0.7450488 -0.5082747
7 b 3-1.5895110 -0.7450488
8 b 4 0.2482062 -1.5895110

# Utilizzo delle classi plm - supportato da collapse
pdt <- plm :: pdata.frame (dt)
flag (pdt $ var)
a-1 a-2 a-3 a-4 b-1 b-2 b-3 b-4
NA -0.5808824 -0.1606213 0.6499493 NA -0.5082747 -0.7450488 -1.5895110

# Utilizzo diretto dell'operatore lag
L (dt, 1, var ~ posizione, ~ ora)
posizione ora L1.var
1 a 1 NA
2 a 2 -0.5808824
3 a 3 -0.1606213
4 a 4 0.6499493
5 b 1 NA
6 b 2 -0.5082747
7 b 3-0.7450488
8 b 4 -1.5895110

# Prova delle prestazioni
libreria (data.table); ddt <- data.table (dt)
f2 Funzione < () ddt [, lvar: = shift (var), by = location]
f3 <- funzione () settransform (dt, lvar = flag (var, 1, location, time))
microbenchmark :: microbenchmark (data.table = f2 (), collapse = f3 (), times = 1000L)

Unità: microsecondi
       expr min lq media mediana uq max neval cld
 tabella dati 518.539 568.519 788.7076 638.579 779.5935 23060.711 1000 b
   collasso 44.179 60.913 100.3122 78.094 104.1990 2941.214 1000 a
 


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...