Generazione di una Variabile di Ritardo

Generazione di una variabile di ritardo: Qualche giorno fa, il mio amico mi ha chiesto se esiste una funzione in R per generare variabili di ritardo / anticipo in un dato. Inquadra o fa qualcosa di simile a _n in stata. Si desidera utilizzarlo per ripulire il set di dati in R.

Nel manuale di aiuto di stato: _n contiene il numero dell’osservazione corrente.
Ecco un esempio per illustrare cosa fa:

set obs 10
generate x = _n
generate x_lag1 = x[_n-1]
generate x_lead1 = x[_n+1]

The data generated would be :
x = {1,2,3,4,5,6,7,8,9,10}
x_lag1 = {NA,1,2,3,4,5,6,7,8,9}
x_lead1 = {1,2,3,4,5,6,7,8,9,NA}

La caratteristica chiave è che il nuovo vettore ha la stessa lunghezza del vettore originale, quindi possiamo usarlo con il vettore originale o un altro vettore generato.

Un’applicazione è quella di creare serie MA (solo un esempio, è meglio usare la funzione in qualsiasi pacchetto di serie temporali per farlo)
genera x_ma_1 = (x [_n-1] + x [_n]) / 2

Ho cercato su Google per un po ‘per quello, in pratica ci sono due tipi di metodi per generare variabili lag / lead in R: (riferimento)

1> Funzione che genera un vettore più breve (ad esempio, embed (), running () in gtools
2> Funzione in ts, zoo, xts, dynlm, dlm.

Tuttavia, entrambe le soluzioni non risolvono il problema. Quindi ho scritto una funzione “shift” per svolgere il compito:

shift<-function(x,shift_by){
stopifnot(is.numeric(shift_by))
stopifnot(is.numeric(x))

if (length(shift_by)>1) return(sapply(shift_by,shift, x=x))

out<-NULL

abs_shift_by=abs(shift_by)
if (shift_by > 0 )
out<-c(tail(x,-abs_shift_by),rep(NA,abs_shift_by))
else if (shift_by < 0 )
out<-c(rep(NA,abs_shift_by), head(x,-abs_shift_by))

else

out<-x out

}

Si noti che il risultato dipende da come è ordinato data.frame.

# Test
library(testthat)
expect_that(shift(1:10,2),is_identical_to(c(3:10,NA,NA)))
expect_that(shift(1:10,-2), is_identical_to(c(NA,NA,1:8)))
expect_that(shift(1:10,0), is_identical_to(1:10))
expect_that(shift(1:10,0), is_identical_to(1:10))
expect_that(shift(1:10,1:2), is_identical_to(cbind(c(2:10,NA),c(3:10,NA,NA))))

TszKin Julian Chan

Leave a Reply