Generieren von Lag-Variablen

Generieren von Lag-Variablen: Vor einigen Tagen fragte mich mein Freund, ob es in R eine Funktion zum Generieren von Lag- / Lead-Variablen in Daten gibt. Rahmen oder ähnliches wie _n in stata. Damit möchte er seinen Datensatz in R bereinigen.

Im stata-Hilfehandbuch: _n enthält die Nummer der aktuellen Beobachtung.
Hier ist ein Beispiel, um zu veranschaulichen, was _n tut:

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}

Das Hauptmerkmal ist, dass der neue Vektor dieselbe Länge wie der ursprüngliche Vektor hat, sodass wir ihn mit dem ursprünglichen Vektor oder einem anderen generierten Vektor verwenden können.

Eine Anwendung besteht darin, eine MA-Reihe zu erstellen (nur ein Beispiel, es ist besser, die Funktion in beliebigen Zeitreihenpaketen zu verwenden, um dies zu tun).
generiere x_ma_1 = (x [_n-1] + x [_n]) / 2

Ich habe eine Weile dafür gegoogelt. Grundsätzlich gibt es zwei Arten von Methoden, um Lag / Lead-Variablen in R zu generieren: (referencia)

1> Funktion, die einen kürzeren Vektor erzeugt (z. B. embedded (), running () in gtools)
2> Funktion in ts, zoo, xts, dynlm, dlm.

Beide Lösungen lösen sein Problem jedoch nicht. Dann habe ich eine Shift-Funktion geschrieben, um die Aufgabe zu erledigen:

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

}

Generieren von Lag-Variablen: Beachten Sie, dass das Ergebnis davon abhängt, wie der data.frame sortiert ist.

# 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