Załóżmy, że mamy
X 2 ∼ unif ( n , 0 , 1 ) ,
gdzie jest jednorodną losową próbką o wielkości n, i
Zatem korelacja między i Z wynosi 0,4 .
Jak mogę to rozszerzyć na trzy zmienne: , X 2 , X 3 ?
Załóżmy, że mamy
X 2 ∼ unif ( n , 0 , 1 ) ,
gdzie jest jednorodną losową próbką o wielkości n, i
Zatem korelacja między i Z wynosi 0,4 .
Jak mogę to rozszerzyć na trzy zmienne: , X 2 , X 3 ?
Odpowiedzi:
Pytanie zawiera kilka błędów wskazanych w komentarzach - jak zdefiniowano w pytaniu, Z nie jest ani jednorodne, ani nie ma określonej korelacji.
kardynał wspomina o kopulach, i to jest najbardziej ogólny sposób na załatwienie tego. Istnieje jednak kilka dość łatwych sposobów uzyskania skorelowanych mundurów (które można postrzegać jako zwykłe skróty do różnych rodzajów kopuł).
Więc zacznijmy od niektórych sposobów, aby uzyskać parę skorelowanych mundurów.
1) Jeśli dodasz dwa mundury, wynik będzie trójkątny, a nie jednolity. Ale możesz użyć cdf wynikowej zmiennej jako transformacji, aby przywrócić wynik do postaci jednolitej. Oczywiście wynik nie jest już skorelowany liniowo.
Oto funkcja R, aby przekształcić symetryczny trójkąt na (0,2) w standardowy mundur
t2u = function(x) ifelse(x<1, x^2, 2-(2-x)^2)/2
Sprawdźmy, czy to daje mundur
u1 = runif(30000)
u2 = runif(30000)
v1 = t2u(u1+u2)
I jest skorelowany z u1 i u2:
> cor(cbind(u1,u2,v1))
u1 u2 v1
u1 1.000000000 0.006311667 0.7035149
u2 0.006311667 1.000000000 0.7008528
v1 0.703514895 0.700852805 1.0000000
ale nie liniowo, ze względu na monotoniczną transformację do jednolitości
Dzięki temu jako narzędziu możemy wygenerować dodatkowe zmienne, aby uzyskać trzy mundury równo-skorelowane:
u3 = runif(30000)
v2 = t2u(u1+u3)
v3 = t2u(u2+u3)
cor(cbind(v1,v2,v3))
v1 v2 v3
v1 1.0000000 0.4967572 0.4896972
v2 0.4967572 1.0000000 0.4934746
v3 0.4896972 0.4934746 1.0000000
Zależność między zmiennymi v wygląda tak:
-
Drugą alternatywą jest generowanie przez wzięcie mieszaniny . Zamiast sumować mundury, bierz je ze stałym prawdopodobieństwem.
na przykład
z = ifelse(rbinom(30000,1,.7),u1,u2)
cor(cbind(u1,z))
u1 z
u1 1.0000000 0.7081533
z 0.7081533 1.0000000
Które można ponownie wykorzystać do wygenerowania wielu skorelowanych mundurów.
-
Trzecie proste podejście polega na wygenerowaniu skorelowanych normalnych i przekształceniu w jednolitość.
n1=rnorm(30000)
n2=rnorm(30000)
n3=rnorm(30000)
x=.6*n1+.8*n2
y=.6*n2+.8*n3
z=.6*n3+.8*n1
cor(cbind(x,y,z))
x y z
x 1.0000000 0.4763703 0.4792897
y 0.4763703 1.0000000 0.4769403
z 0.4792897 0.4769403 1.0000000
Teraz przechodzimy na mundur:
w1 = pnorm(x)
w2 = pnorm(y)
w3 = pnorm(z)
cor(cbind(w1,w2,w3))
w1 w2 w3
w1 1.0000000 0.4606723 0.4623311
w2 0.4606723 1.0000000 0.4620257
w3 0.4623311 0.4620257 1.0000000
Jedną fajną rzeczą w metodach 2 i 3 jest to, że masz dużą różnorodność w wyborze tego, jak skorelowane mogą być rzeczy (i nie muszą one być równo-skorelowane, jak tutaj przykłady).
Istnieje oczywiście wiele innych podejść, ale wszystkie są szybkie i łatwe.
Trudną częścią jest uzyskanie dokładnie pożądanej korelacji populacji; to nie jest tak proste, jak gdy chcesz po prostu skorelowanych Gaussów. Odpowiedź Quantibex w Generuj pary liczb losowych równomiernie rozmieszczonych i skorelowanych daje podejście, które modyfikuje moją trzecią metodę tutaj, która powinna dać o pożądanej korelacji populacji.
To powinno rozpocząć cię w drodze do dekompozycji szeregu na jego składowe w taki sam sposób, jak rozkładasz wektor na jego składowe ortogonalne.