Tworzenie automatycznie skorelowanych wartości losowych w R

11

Próbujemy stworzyć automatycznie skorelowane wartości losowe, które zostaną wykorzystane jako szeregi czasowe. Nie mamy żadnych danych, do których się odwołujemy, a po prostu chcemy stworzyć wektor od zera.

Z jednej strony potrzebujemy oczywiście losowego procesu z rozkładem i jego SD.

Z drugiej strony należy opisać autokorelację wpływającą na losowy proces. Wartości wektora są autokorelowane ze zmniejszającą się siłą w ciągu kilku timelagów. np. lag1 ma 0,5, lag2 0,3, lag1 0,1 itd.

W końcu wektor powinien wyglądać tak, że: 2, 4, 7, 11, 10, 8, 5, 4, 2, -1, 2, 5, 9, 12, 13, 10, 8, 4, 3, 1, -2, -5

i tak dalej.

Fabian Stolz
źródło

Odpowiedzi:

11

Właściwie często napotykam ten problem. Moje dwa ulubione sposoby generowania szeregów czasowych z autokorelacją w R zależą od tego, czy chcę proces stacjonarny, czy nie.

W przypadku niestacjonarnych szeregów czasowych używam ruchu Browna. Na przykład dla długości 1000:

x <- diffinv(rnorm(999))

Dla stacjonarnych szeregów czasowych filtruję szum Gaussa. Na przykład wygląda to tak:

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

W takim przypadku autokorelacja przy opóźnieniu wynosi 0, jeśli . W innych przypadkach musimy obliczyć korelację między sumami zmiennych. Na przykład dla kowariancja wynosiττ>2τ=1

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

Widzisz więc, że automatyczna kowariancja spada liniowo w górę, aż gdzie jest długością filtra.nn

Możesz także chcieć wykonać długie szeregi czasowe pamięci (takie jak ułamkowy ruch Browna), ale jest to bardziej zaangażowane. Mam implementację R metody Davies-Harte, którą mogę ci wysłać, jeśli chcesz.

gui11aume
źródło
Aby uzyskać realizację długich szeregów czasowych pamięci, poleciłbym książkę Wornell z 1996 roku (link: books.google.cl/books/about/… ), :-). Chociaż wykonalność długich procesów pamięciowych nie jest „taka” łatwa, wciąż możesz to zrobić.
Néstor
Użyłem twojego podejścia i ogólnie działa, ale dostaję niewielkie odchylenia między funkcją celu zastosowaną w filtrze a wynikową funkcją autokorelacji. Proszę spojrzeć na to pytanie: stats.stackexchange.com/questions/176722/…
nnn
7

Jeśli masz daną funkcję autokowariancji, najlepszym modelem (pod względem wykonalności), o którym myślę, jest wielowymiarowy proces gaussowski, w którym, biorąc pod uwagę funkcję autokowariancji w lag , możesz łatwo utworzyć macierz kowariancji ,R(τ)τ

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

Biorąc pod uwagę tę macierz kowariancji, próbkujesz dane z wielowymiarowego gaussa z podaną macierzą kowariancji , tj. Próbkujesz wektor z rozkładu gdzie jest wektorem średnim.Σ

f(x)=1(2π)N/2|Σ|1/2exp(12(xμ)TΣ1(xμ)),
μ
Néstor
źródło
5

Możesz wygenerować skorelowaną sekwencję, konstruując proces autoregresji Na przykład proces AR (1) . Wygeneruj przy użyciu jednolitego generatora liczb losowych dla wybranego rozkładu. Niech Uzyskaj i tak dalej. są kolejno wybierane losowo przy użyciu jednolitych liczb losowych. Aby podać średnią i odchylenie standardowe, które chcesz, możesz wyprowadzić je ze średniej i wariancji sekwencji szumu . Wybierz odpowiednio .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
źródło
4
Prawdopodobnie warto tutaj zwrócić uwagę na istnienie tej arima.sim()funkcji.
fmark
Pewnie ci, którzy teraz R powinni wysunąć te sugestie dotyczące implementacji w R, jak chce PO.
Michael R. Chernick