Erstellen automatisch korrelierter Zufallswerte in R.

11

Wir versuchen, automatisch korrelierte Zufallswerte zu erstellen, die als Zeitreihen verwendet werden. Wir haben keine vorhandenen Daten, auf die wir verweisen, und möchten den Vektor nur von Grund auf neu erstellen.

Einerseits brauchen wir natürlich einen zufälligen Prozess mit Distribution und deren SD.

Andererseits muss die den Zufallsprozess beeinflussende Autokorrelation beschrieben werden. Die Werte des Vektors werden über mehrere Zeitverzögerungen mit abnehmender Stärke autokorreliert. zB hat lag1 0,5, lag2 0,3, lag1 0,1 usw.

Am Ende sollte der Vektor also so aussehen: 2, 4, 7, 11, 10, 8, 5, 4, 2, -1, 2, 5, 9, 12, 13, 10, 8, 4, 3, 1, -2, -5

und so weiter.

Fabian Stolz
quelle

Antworten:

11

Ich stoße tatsächlich oft auf dieses Problem. Meine beiden bevorzugten Methoden zum Generieren einer Zeitreihe mit Autokorrelation in R hängen davon ab, ob ich einen stationären Prozess möchte oder nicht.

Für eine instationäre Zeitreihe verwende ich eine Brownsche Bewegung. Zum Beispiel mache ich für eine Länge von 1000:

x <- diffinv(rnorm(999))

Für eine stationäre Zeitreihe filtere ich ein Gaußsches Rauschen. Zum Beispiel sieht das so aus:

x <- filter(rnorm(1000), filter=rep(1,3), circular=TRUE)

In diesem Fall ist die Autokorrelation bei Lag 0, wenn . In anderen Fällen müssen wir die Korrelation zwischen den Summen der Variablen berechnen. Zum Beispiel ist für die Kovarianzττ>2τ=1

Cov(X1;X2)=Cov(Y1+Y2+Y3;Y2+Y3+Y4)=Var(Y2)+Var(Y3)=2.

Sie sehen also, dass die Autokovarianz linear bis zu abfällt, wobei die Länge des Filters ist.nn

Sie können auch lange Speicherzeitreihen erstellen (z. B. fraktionierte Brownsche Bewegung), dies ist jedoch aufwändiger. Ich habe eine R-Implementierung der Davies-Harte-Methode, die ich Ihnen senden kann, wenn Sie dies wünschen.

gui11aume
quelle
Um Realisierungen von Zeitreihen mit langem Speicher zu erhalten, würde ich Wornells Buch von 1996 (Link: books.google.cl/books/about/… ) empfehlen :-). Obwohl die Nachvollziehbarkeit langer Speicherprozesse nicht "so" einfach ist, können Sie dies dennoch tun.
Néstor
Ich habe Ihren Ansatz verwendet und er funktioniert im Allgemeinen, aber ich erhalte geringfügige Abweichungen zwischen der im Filter verwendeten Zielfunktion und der resultierenden Autokorrelationsfunktion. Bitte werfen Sie einen Blick auf diese Frage: stats.stackexchange.com/questions/176722/...
nnn
7

Wenn Sie eine gegebene Autokovarianzfunktion haben, ist das beste Modell (in Bezug auf die Traktabilität), das ich mir vorstellen kann, ein multivariater Gauß-Prozess, bei dem Sie angesichts der Autokovarianzfunktion bei lag leicht die Kovarianzmatrix bilden können ,R(τ)τ

Σ=[R(0)R(1)...R(N)R(1)R(0)...R(N1)...R(N)R(N1)...R(0)]

Bei dieser gegebenen Kovarianzmatrix werden Daten aus einem multivariaten Gaußschen mit der gegebenen Kovarianzmatrix , dh ein Vektor aus der Verteilung wobei der mittlere Vektor ist.Σ

f(x)=1(2π)N/2|Σ|1/2exp(12(xμ)TΣ1(xμ)),
μ
Néstor
quelle
5

Sie können eine korrelierte Sequenz erzeugen, indem Sie einen autoregressiven Prozess erstellen. Zum Beispiel einen AR (1) -Prozess . Generieren Sie mit einem einheitlichen Zufallszahlengenerator für die von Ihnen gewählte Verteilung. Dann sei Erhalte und so weiter. Die werden nacheinander zufällig unter Verwendung Ihrer einheitlichen Zufallszahlen ausgewählt. Um den gewünschten Mittelwert und die gewünschte Standardabweichung zu geben , können Sie sie aus dem Mittelwert und der Varianz der Rauschsequenz ableiten . Wählen Sie entsprechend aus.X(t)=aX(t1)+e(t)e(0)X(0)=e(0)X(1)=aX(0)+e(1)e(i)X(i)e(i)e(i)

Michael R. Chernick
quelle
4
Es lohnt sich wahrscheinlich, hier auf die Existenz der arima.sim()Funktion hinzuweisen .
Mark
Sicher, diejenigen, die jetzt R sind, sollten diese Vorschläge für die Implementierung in R machen, wie das OP wissen möchte.
Michael R. Chernick